Clorox Capabilities

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

Sort
Expand

Analyzes product trends via AI.

naftiko: "0.5"
info:
  label: "AI-Powered Product Trend Analysis"
  description: "Analyzes product trends via AI."
  tags:
    - artificial-intelligence
    - analytics
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: artificial-intelligence-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "AI-Powered Product Trend Analysis - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches Confluence for pages matching a query.

naftiko: "0.5"
info:
  label: "Confluence Page Search"
  description: "Searches Confluence for pages matching a query."
  tags:
    - collaboration
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: collaboration-ops
      port: 8080
      tools:
        - name: get-record
          description: "Confluence Page Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Alerts on budget limits.

naftiko: "0.5"
info:
  label: "Coupa Budget Utilization Alert"
  description: "Alerts on budget limits."
  tags:
    - procurement
    - coupa
    - microsoft-teams
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Coupa Budget Utilization Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Routes match exceptions.

naftiko: "0.5"
info:
  label: "Coupa Invoice Three-Way Match Exception"
  description: "Routes match exceptions."
  tags:
    - procurement
    - coupa
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Coupa Invoice Three-Way Match Exception - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates SAP PO from Coupa PO.

naftiko: "0.5"
info:
  label: "Coupa Purchase Order to SAP Sync"
  description: "Creates SAP PO from Coupa PO."
  tags:
    - procurement
    - coupa
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Coupa Purchase Order to SAP Sync - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Submits a purchase requisition in Coupa, routes it for approval, and notifies the requester via Microsoft Teams when the requisition is approved or rejected.

naftiko: "0.5"
info:
  label: "Coupa Requisition Approval Workflow"
  description: "Submits a purchase requisition in Coupa, routes it for approval, and notifies the requester via Microsoft Teams when the requisition is approved or rejected."
  tags:
    - procurement
    - coupa
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: submit-requisition
          description: "Given a Coupa requisition payload (description, supplier, amount, requester), submit a purchase requisition in Coupa and notify the requester via Teams when it enters the approval queue."
          inputParameters:
            - name: description
              in: body
              type: string
              description: "Description of the goods or services being requested."
            - name: supplier_name
              in: body
              type: string
              description: "The Coupa supplier name."
            - name: amount
              in: body
              type: number
              description: "Requested amount in USD."
            - name: requester_upn
              in: body
              type: string
              description: "UPN (email) of the requisition requester."
          steps:
            - name: create-requisition
              type: call
              call: coupa.create-requisition
              with:
                description: "{{description}}"
                supplier: "{{supplier_name}}"
                amount: "{{amount}}"
            - name: notify-requester
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Your Coupa requisition {{create-requisition.id}} for {{supplier_name}} (${{amount}}) has been submitted and is pending approval."
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://clorox.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: requisitions
          path: "/requisition_headers"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates SAP vendor from Coupa.

naftiko: "0.5"
info:
  label: "Coupa Supplier Onboarding to SAP"
  description: "Creates SAP vendor from Coupa."
  tags:
    - procurement
    - coupa
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Coupa Supplier Onboarding to SAP - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a new supplier record from Coupa, validates required fields including banking and tax information, and notifies the procurement team via Teams when verification is complete.

naftiko: "0.5"
info:
  label: "Coupa Supplier Onboarding Verification"
  description: "Retrieves a new supplier record from Coupa, validates required fields including banking and tax information, and notifies the procurement team via Teams when verification is complete."
  tags:
    - procurement
    - coupa
    - vendor-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: verify-supplier-onboarding
          description: "Given a Coupa supplier ID, retrieve the supplier record, validate that banking and tax fields are populated, and notify the procurement team via Teams. Use for new supplier activation workflows."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The Coupa supplier ID to verify."
          steps:
            - name: get-supplier
              type: call
              call: coupa.get-supplier
              with:
                supplier_id: "{{supplier_id}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Supplier {{get-supplier.name}} (ID: {{supplier_id}}) onboarding verification complete. Status: {{get-supplier.status}}"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://clorox.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current status of a vendor invoice in Coupa by invoice ID, returning approval state, line items, and due date for AP reconciliation.

naftiko: "0.5"
info:
  label: "Coupa Vendor Invoice Status Lookup"
  description: "Retrieves the current status of a vendor invoice in Coupa by invoice ID, returning approval state, line items, and due date for AP reconciliation."
  tags:
    - procurement
    - coupa
    - accounts-payable
    - finance
capability:
  exposes:
    - type: mcp
      namespace: ap-lookup
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Look up a Coupa vendor invoice by invoice ID. Returns approval status, total amount, due date, and line item count. Use for AP reconciliation or payment tracking."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice ID to look up."
          call: coupa.get-invoice
          with:
            invoice_id: "{{invoice_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: total_amount
              type: string
              mapping: "$.total_amount"
            - name: due_date
              type: string
              mapping: "$.due_date"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://clorox.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET

Creates incidents for DTC issues.

naftiko: "0.5"
info:
  label: "Datadog E-Commerce Performance Alert"
  description: "Creates incidents for DTC issues."
  tags:
    - observability
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Datadog E-Commerce Performance Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates incidents for infrastructure anomalies.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Anomaly Alert"
  description: "Creates incidents for infrastructure anomalies."
  tags:
    - observability
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Datadog Infrastructure Anomaly Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a Datadog monitor triggers an infrastructure anomaly alert, creates a ServiceNow incident and notifies the SRE team via Teams with full metric context.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Anomaly Responder"
  description: "When a Datadog monitor triggers an infrastructure anomaly alert, creates a ServiceNow incident and notifies the SRE team via Teams with full metric context."
  tags:
    - observability
    - datadog
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-infra-anomaly
          description: "Given a Datadog monitor ID and alert status, retrieve monitor details, create a ServiceNow incident, and post to the SRE Teams channel. Use for automated infrastructure anomaly response."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: alert_status
              in: body
              type: string
              description: "Alert status: Alert, Warn, or No Data."
          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 anomaly: {{get-monitor.name}}"
                description: "Monitor {{monitor_id}} status: {{alert_status}} | Query: {{get-monitor.query}}"
                urgency: "1"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sre_channel_id"
                text: "Infra Anomaly: {{get-monitor.name}} | Status: {{alert_status}} | Incident: {{create-incident.number}}"
  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://clorox.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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates incidents for anomalies.

naftiko: "0.5"
info:
  label: "Datadog Log Anomaly to ServiceNow"
  description: "Creates incidents for anomalies."
  tags:
    - observability
    - datadog
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Datadog Log Anomaly to ServiceNow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Queries Datadog Logs for error spikes in a given service over the past hour and returns the top error patterns for rapid incident triage.

naftiko: "0.5"
info:
  label: "Datadog Log Error Spike Investigation"
  description: "Queries Datadog Logs for error spikes in a given service over the past hour and returns the top error patterns for rapid incident triage."
  tags:
    - observability
    - datadog
    - logging
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: log-analysis
      port: 8080
      tools:
        - name: get-error-log-summary
          description: "Query Datadog Logs for the top error patterns in a given service over the past hour. Returns ranked error messages and counts for rapid incident triage."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name to query, e.g. product-catalog-service."
          call: datadog.search-logs
          with:
            query: "service:{{service_name}} status:error"
          outputParameters:
            - name: logs
              type: array
              mapping: "$.data"
  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: logs
          path: "/logs-queries/list"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-logs
              method: GET

Retrieves SLO compliance status from Datadog for all production services and publishes a weekly reliability report to the SRE Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Weekly Digest"
  description: "Retrieves SLO compliance status from Datadog for all production services and publishes a weekly reliability report to the SRE Microsoft Teams channel."
  tags:
    - observability
    - datadog
    - slo
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: digest-slo-compliance
          description: "Fetch all SLO status summaries from Datadog and post a weekly compliance report to the SRE Teams channel. Use for reliability governance reviews."
          steps:
            - name: get-slos
              type: call
              call: datadog.list-slos
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sre_channel_id"
                text: "Weekly SLO Report: {{get-slos.total_count}} SLOs tracked across Clorox production services."
  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: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the signing status of a DocuSign envelope including signer progress.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Status"
  description: "Retrieves the signing status of a DocuSign envelope including signer progress."
  tags:
    - legal
    - docusign
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: legal-ops
      port: 8080
      tools:
        - name: get-record
          description: "DocuSign Envelope Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

When an employee termination is recorded in Workday, deactivates the Microsoft 365 account, closes open ServiceNow tickets, and notifies the HR team via Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is recorded in Workday, deactivates the Microsoft 365 account, closes open ServiceNow tickets, and notifies the HR team via Teams."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, deactivate the Microsoft 365 account, close outstanding ServiceNow tickets, and notify the HR partner via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The termination effective date in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: disable-account
              type: call
              call: msgraph.disable-user
              with:
                user_upn: "{{get-worker.work_email}}"
            - name: close-tickets
              type: call
              call: servicenow.close-user-incidents
              with:
                caller_email: "{{get-worker.work_email}}"
            - name: notify-hr
              type: call
              call: msteams-notify.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Offboarding complete for {{get-worker.full_name}} (termination: {{termination_date}}). M365 account disabled."
  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: "/clorox/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-account
          path: "/users/{{user_upn}}"
          inputParameters:
            - name: user_upn
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-incidents
              method: PATCH
    - type: http
      namespace: msteams-notify
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates Jira tickets.

naftiko: "0.5"
info:
  label: "GitHub Actions Build Failure Notification"
  description: "Creates Jira tickets."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Actions Build Failure Notification - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a GitHub Actions workflow fails on a protected branch, opens a ServiceNow incident and alerts the engineering Teams channel with failure context.

naftiko: "0.5"
info:
  label: "GitHub Actions Pipeline Failure Alert"
  description: "When a GitHub Actions workflow fails on a protected branch, opens a ServiceNow incident and alerts the engineering Teams channel with failure context."
  tags:
    - devops
    - cicd
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions run ID and repository, retrieve failure details, open a ServiceNow incident, and alert the engineering Teams channel. Use when a protected-branch pipeline fails."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format, e.g. clorox/ecommerce-platform."
            - name: branch
              in: body
              type: string
              description: "The branch name where the failure occurred."
          steps:
            - name: get-run
              type: call
              call: github.get-workflow-run
              with:
                owner: "clorox"
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "CI/CD failure: {{repo}} / {{branch}}"
                description: "GitHub Actions run {{run_id}} failed. Log: {{get-run.html_url}}"
                urgency: "2"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Pipeline Failure: {{repo}} | Branch: {{branch}} | Incident: {{create-incident.number}} | Log: {{get-run.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-run
          path: "/repos/{{owner}}/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches critical Dependabot security alerts for a GitHub repository, creates ServiceNow security incidents, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Security Alert Triage"
  description: "Fetches critical Dependabot security alerts for a GitHub repository, creates ServiceNow security incidents, and notifies the security team via Teams."
  tags:
    - security
    - github
    - servicenow
    - devops
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-security-alerts
          description: "Retrieve open critical Dependabot alerts for a GitHub repository, create a ServiceNow security incident, and notify the Clorox security team via Teams."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format, e.g. clorox/cleaning-apps."
          steps:
            - name: get-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                owner: "clorox"
                repo: "{{repo}}"
                severity: "critical"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Critical Dependabot alerts in {{repo}}"
                category: "security"
                urgency: "1"
            - name: notify-security
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Security Alert: {{get-alerts.total_count}} critical vulnerabilities in {{repo}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.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: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks ServiceNow approval before deployment.

naftiko: "0.5"
info:
  label: "GitHub Deployment Approval Gate"
  description: "Checks ServiceNow approval before deployment."
  tags:
    - devops
    - github
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Deployment Approval Gate - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Updates change requests.

naftiko: "0.5"
info:
  label: "GitHub Deployment to ServiceNow Change"
  description: "Updates change requests."
  tags:
    - devops
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Deployment to ServiceNow Change - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Audits all Clorox GitHub organization repositories for missing branch protection rules and reports non-compliant repositories to the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Policy Audit"
  description: "Audits all Clorox GitHub organization repositories for missing branch protection rules and reports non-compliant repositories to the security team via Teams."
  tags:
    - security
    - github
    - devops
    - compliance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-audit
      port: 8080
      tools:
        - name: audit-branch-protection
          description: "List all repositories in the Clorox GitHub organization and audit branch protection compliance on default branches, reporting findings to the security Teams channel."
          steps:
            - name: list-repos
              type: call
              call: github.list-org-repos
              with:
                org: "clorox"
                type: "private"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Branch Protection Audit: {{list-repos.total_count}} private repositories reviewed for compliance."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-repos
          path: "/orgs/{{org}}/repos"
          inputParameters:
            - name: org
              in: path
            - name: type
              in: query
          operations:
            - name: list-org-repos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates Jira tickets.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Creates Jira tickets."
  tags:
    - security
    - github
    - jira
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Security Vulnerability Triage - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pulls current active headcount by cost center from Workday and returns a structured summary for finance planning and workforce analysis.

naftiko: "0.5"
info:
  label: "Headcount Snapshot by Cost Center"
  description: "Pulls current active headcount by cost center from Workday and returns a structured summary for finance planning and workforce analysis."
  tags:
    - hr
    - finance
    - reporting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns active headcount grouped by cost center and employment type from Workday. Use for headcount planning, finance forecasting, or quarterly workforce reviews."
          call: workday.list-workers
          outputParameters:
            - name: workers
              type: array
              mapping: "$.data"
  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-list
          path: "/clorox/workers"
          operations:
            - name: list-workers
              method: GET

Retrieves a vendor invoice from Coupa, validates it against the linked SAP purchase order and goods receipt, and posts the cleared invoice to SAP for payment.

naftiko: "0.5"
info:
  label: "Invoice Three-Way Match and SAP Posting"
  description: "Retrieves a vendor invoice from Coupa, validates it against the linked SAP purchase order and goods receipt, and posts the cleared invoice to SAP for payment."
  tags:
    - finance
    - procurement
    - coupa
    - sap
    - invoice-processing
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: process-invoice-match
          description: "Given a Coupa invoice ID, retrieve invoice details, validate against the SAP purchase order, and post the three-way match result to SAP for payment clearance. Use for accounts payable automation."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice ID to process."
          steps:
            - name: get-invoice
              type: call
              call: coupa.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{get-invoice.po_number}}"
            - name: post-match
              type: call
              call: sap.post-invoice-clearance
              with:
                invoice_number: "{{get-invoice.invoice_number}}"
                po_number: "{{get-invoice.po_number}}"
                amount: "{{get-invoice.total_amount}}"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://clorox.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://clorox-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
            - name: post-invoice-clearance
              method: POST

When a critical ServiceNow incident is raised, creates a Datadog event marker for observability correlation and posts an alert to the IT-incidents Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "IT Incident Response Orchestrator"
  description: "When a critical ServiceNow incident is raised, creates a Datadog event marker for observability correlation and posts an alert to the IT-incidents Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-critical-incident
          description: "Given a ServiceNow incident number, retrieve incident details, create a Datadog correlation event, and alert the IT-incidents Teams channel. Use for P1/P2 incident bridges."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0045678."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "ServiceNow Incident: {{incident_number}}"
                text: "{{get-incident.short_description}} — Priority: {{get-incident.priority}}"
                alert_type: "error"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_it_channel_id"
                text: "CRITICAL: {{incident_number}} — {{get-incident.short_description}} | Assigned: {{get-incident.assigned_to}} | DD Event: {{create-dd-event.event_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors environmental compliance.

naftiko: "0.5"
info:
  label: "Manufacturing Environmental Compliance Monitor"
  description: "Monitors environmental compliance."
  tags:
    - manufacturing
    - compliance
    - microsoft-teams
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Manufacturing Environmental Compliance Monitor - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates incidents for line downtime.

naftiko: "0.5"
info:
  label: "Manufacturing Line Downtime Alert"
  description: "Creates incidents for line downtime."
  tags:
    - manufacturing
    - iot
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Manufacturing Line Downtime Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new hire record 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 hire record 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 365, and Microsoft Teams for a new Clorox hire."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire, e.g. WD-00456."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-onboarding-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}}"
                mail: "{{get-worker.work_email}}"
                department: "{{get-worker.department}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Clorox, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-onboarding-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/clorox/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.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: 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: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Refreshes brand dashboard.

naftiko: "0.5"
info:
  label: "Power BI Brand Performance Refresh"
  description: "Refreshes brand dashboard."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Power BI Brand Performance Refresh - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the latest Power BI dataset refresh status, returning completion time and status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the latest Power BI dataset refresh status, returning completion time and status."
  tags:
    - analytics
    - power-bi
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: get-record
          description: "Power BI Dataset Refresh Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Refreshes executive KPI dashboard.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Refresh"
  description: "Refreshes executive KPI dashboard."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Power BI Executive Dashboard Refresh - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a Power BI dataset refresh for the Clorox sales dashboard and notifies the analytics team in Teams upon completion or failure.

naftiko: "0.5"
info:
  label: "Power BI Sales Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the Clorox sales dashboard and notifies the analytics team in Teams upon completion or failure."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: trigger-sales-dashboard-refresh
          description: "Trigger a Power BI dataset refresh for the Clorox sales dashboard and notify the analytics Teams channel with refresh status. Use for scheduled BI report automation."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: start-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_analytics_channel_id"
                text: "Power BI dataset {{dataset_id}} refresh triggered successfully."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Refreshes supply chain KPIs.

naftiko: "0.5"
info:
  label: "Power BI Supply Chain Dashboard Refresh"
  description: "Refreshes supply chain KPIs."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Power BI Supply Chain Dashboard Refresh - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates SAP QM notification from complaints.

naftiko: "0.5"
info:
  label: "Product Quality Complaint Workflow"
  description: "Creates SAP QM notification from complaints."
  tags:
    - quality
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Product Quality Complaint Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pushes trade promotion data to Power BI.

naftiko: "0.5"
info:
  label: "Retail Promotion Performance Tracker"
  description: "Pushes trade promotion data to Power BI."
  tags:
    - marketing
    - sap
    - salesforce
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Retail Promotion Performance Tracker - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts optimization recommendations.

naftiko: "0.5"
info:
  label: "Retail Shelf Space Optimization Digest"
  description: "Posts optimization recommendations."
  tags:
    - marketing
    - analytics
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Retail Shelf Space Optimization Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Given a Salesforce account ID, retrieves the account profile, open opportunities, and recent service cases to produce a unified health summary for the account team.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Check"
  description: "Given a Salesforce account ID, retrieves the account profile, open opportunities, and recent service cases to produce a unified health summary for the account team."
  tags:
    - sales
    - crm
    - salesforce
    - customer-success
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account-health
          description: "Given a Salesforce account ID, retrieve the account profile, open opportunities, and recent cases to assemble a customer health summary. Use for account review meetings."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce Account ID (18-character ID)."
          steps:
            - name: get-account
              type: call
              call: salesforce-acct.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-opportunities
              type: call
              call: salesforce-opp.query-opportunities
              with:
                soql: "SELECT Id,Name,StageName,Amount FROM Opportunity WHERE AccountId='{{account_id}}' AND IsClosed=false"
            - name: get-cases
              type: call
              call: salesforce-case.query-cases
              with:
                soql: "SELECT Id,Subject,Status,CreatedDate FROM Case WHERE AccountId='{{account_id}}' ORDER BY CreatedDate DESC LIMIT 5"
  consumes:
    - type: http
      namespace: salesforce-acct
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: account
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: salesforce-opp
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: soql
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: salesforce-case
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: soql
              in: query
          operations:
            - name: query-cases
              method: GET

Posts health score digest.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Score Digest"
  description: "Posts health score digest."
  tags:
    - sales
    - salesforce
    - microsoft-teams
    - customer-success
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Account Health Score Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Salesforce support case by number, returning status, priority, and account name.

naftiko: "0.5"
info:
  label: "Salesforce Case Lookup"
  description: "Retrieves a Salesforce support case by number, returning status, priority, and account name."
  tags:
    - customer-service
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: customer-service-ops
      port: 8080
      tools:
        - name: get-record
          description: "Salesforce Case Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Generates sentiment analysis.

naftiko: "0.5"
info:
  label: "Salesforce Consumer Feedback Analysis"
  description: "Generates sentiment analysis."
  tags:
    - customer-service
    - salesforce
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: customer-service-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Consumer Feedback Analysis - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates SAP orders.

naftiko: "0.5"
info:
  label: "Salesforce Distributor Order Sync to SAP"
  description: "Creates SAP orders."
  tags:
    - sales
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Distributor Order Sync to SAP - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Converts a qualified Salesforce lead into an opportunity and account, then notifies the sales rep via Teams to begin the sales engagement.

naftiko: "0.5"
info:
  label: "Salesforce Lead-to-Opportunity Conversion"
  description: "Converts a qualified Salesforce lead into an opportunity and account, then notifies the sales rep via Teams to begin the sales engagement."
  tags:
    - sales
    - crm
    - salesforce
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: convert-lead
          description: "Given a Salesforce lead ID, convert the qualified lead to an opportunity and account and notify the assigned sales rep via Teams. Use for automated lead qualification handoff."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce Lead ID to convert."
          steps:
            - name: get-lead
              type: call
              call: salesforce-lead.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: convert
              type: call
              call: salesforce-convert.convert-lead
              with:
                lead_id: "{{lead_id}}"
                convertedStatus: "Qualified"
            - name: notify-owner
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-lead.owner_email}}"
                text: "Lead {{get-lead.name}} converted to opportunity. Account: {{convert.accountId}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: salesforce-convert
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead-convert
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: convert-lead
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Generates campaign ROI digest.

naftiko: "0.5"
info:
  label: "Salesforce Marketing Campaign ROI Digest"
  description: "Generates campaign ROI digest."
  tags:
    - marketing
    - salesforce
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Marketing Campaign ROI Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates SAP customer master from Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce New Account to SAP Customer"
  description: "Creates SAP customer master from Salesforce."
  tags:
    - sales
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce New Account to SAP Customer - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Tracks launch milestones.

naftiko: "0.5"
info:
  label: "Salesforce New Product Launch Tracker"
  description: "Tracks launch milestones."
  tags:
    - marketing
    - salesforce
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce New Product Launch Tracker - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When an NPS survey response scores below the detractor threshold in Salesforce, automatically creates a high-priority service case and routes it to the customer success team.

naftiko: "0.5"
info:
  label: "Salesforce NPS Detractor Case Creation"
  description: "When an NPS survey response scores below the detractor threshold in Salesforce, automatically creates a high-priority service case and routes it to the customer success team."
  tags:
    - sales
    - customer-success
    - salesforce
    - nps
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: handle-nps-detractor
          description: "Given a Salesforce contact ID and NPS score below 7, retrieve contact details, create a high-priority service case, and assign it to the customer success team for follow-up."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "Salesforce Contact ID of the NPS survey respondent."
            - name: nps_score
              in: body
              type: integer
              description: "NPS score (0–10) from the survey."
            - name: feedback
              in: body
              type: string
              description: "Verbatim feedback from the respondent."
          steps:
            - name: get-contact
              type: call
              call: salesforce-contact.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: create-case
              type: call
              call: salesforce-cases.create-case
              with:
                subject: "NPS Detractor Follow-up: {{get-contact.name}} (Score: {{nps_score}})"
                description: "{{feedback}}"
                contactId: "{{contact_id}}"
                origin: "NPS Survey"
                priority: "High"
  consumes:
    - type: http
      namespace: salesforce-contact
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contact
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce-cases
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Queries Salesforce for opportunities updated in the last 24 hours and pushes the updated pipeline data to Power BI for sales reporting.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Refresh"
  description: "Queries Salesforce for opportunities updated in the last 24 hours and pushes the updated pipeline data to Power BI for sales reporting."
  tags:
    - sales
    - crm
    - salesforce
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: sync-opportunity-pipeline
          description: "Fetch Salesforce opportunities modified in the last 24 hours and push records to the Power BI sales pipeline dataset for daily reporting. Use for pipeline refresh automation."
          steps:
            - name: get-opps
              type: call
              call: salesforce.query-opportunities
              with:
                soql: "SELECT Id,Name,StageName,Amount,CloseDate,AccountId FROM Opportunity WHERE LastModifiedDate = LAST_N_DAYS:1"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "$secrets.powerbi_pipeline_dataset_id"
                table_name: "Opportunities"
                rows: "{{get-opps.records}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://clorox.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: soql
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-rows
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

Pushes pipeline to Power BI.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Pipeline to Power BI"
  description: "Pushes pipeline to Power BI."
  tags:
    - sales
    - salesforce
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Quarterly Pipeline to Power BI - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Generates meeting prep.

naftiko: "0.5"
info:
  label: "Salesforce Retail Buyer Meeting Prep"
  description: "Generates meeting prep."
  tags:
    - sales
    - salesforce
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Retail Buyer Meeting Prep - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Calculates promotion ROI.

naftiko: "0.5"
info:
  label: "Salesforce Trade Promotion ROI Calculator"
  description: "Calculates promotion ROI."
  tags:
    - marketing
    - salesforce
    - microsoft-teams
    - cpg
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Trade Promotion ROI Calculator - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates tasks for expiring contracts.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Alert"
  description: "Creates tasks for expiring contracts."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Contract Renewal Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Monitors active sourcing events.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Monitor"
  description: "Monitors active sourcing events."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Sourcing Event Monitor - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Reports on sourcing events.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Report"
  description: "Reports on sourcing events."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Sourcing Event Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Identifies affected shipments for recalls.

naftiko: "0.5"
info:
  label: "SAP Batch Recall Notification"
  description: "Identifies affected shipments for recalls."
  tags:
    - quality
    - sap
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Batch Recall Notification - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks travel compliance.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Compliance Check"
  description: "Checks travel compliance."
  tags:
    - travel
    - sap-concur
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: travel-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Concur Travel Compliance Check - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves budget vs actual spend for a SAP cost center, returning planned budget and variance.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Check"
  description: "Retrieves budget vs actual spend for a SAP cost center, returning planned budget and variance."
  tags:
    - finance
    - sap
    - erp
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Cost Center Budget Check - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves actual vs. planned cost center spending from SAP S/4HANA and posts a variance digest to the Finance Microsoft Teams channel for monthly close review.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Variance Report"
  description: "Retrieves actual vs. planned cost center spending from SAP S/4HANA and posts a variance digest to the Finance Microsoft Teams channel for monthly close review."
  tags:
    - finance
    - sap
    - budgeting
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: digest-budget-variance
          description: "Retrieve actual vs. planned cost center spending from SAP S/4HANA for a fiscal period and post a variance digest to the Finance Teams channel. Use for monthly close or quarterly reviews."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format, e.g. 202603."
          steps:
            - name: get-variance
              type: call
              call: sap.get-cost-center-variance
              with:
                fiscal_period: "{{fiscal_period}}"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Budget Variance Report for period {{fiscal_period}} is available. {{get-variance.total_cost_centers}} cost centers reviewed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter"
          inputParameters:
            - name: fiscal_period
              in: query
          operations:
            - name: get-cost-center-variance
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Posts demand forecasts.

naftiko: "0.5"
info:
  label: "SAP Demand Planning Forecast Digest"
  description: "Posts demand forecasts."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Demand Planning Forecast Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts close readiness.

naftiko: "0.5"
info:
  label: "SAP Financial Close Readiness Check"
  description: "Posts close readiness."
  tags:
    - finance
    - sap
    - microsoft-teams
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Financial Close Readiness Check - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks whether a SAP financial posting period is open or closed.

naftiko: "0.5"
info:
  label: "SAP Financial Posting Period Check"
  description: "Checks whether a SAP financial posting period is open or closed."
  tags:
    - finance
    - sap
    - erp
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Financial Posting Period Check - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates audit tasks.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Reversal Alert"
  description: "Creates audit tasks."
  tags:
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Goods Movement Reversal Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts a goods receipt in SAP S/4HANA for a delivered purchase order and notifies the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Confirmation"
  description: "Posts a goods receipt in SAP S/4HANA for a delivered purchase order and notifies the procurement team via Teams."
  tags:
    - supply-chain
    - sap
    - procurement
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: confirm-goods-receipt
          description: "Given a SAP purchase order number and delivered quantity, post a goods receipt in SAP S/4HANA and notify the procurement team via Teams with the material document number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number for the delivery."
            - name: quantity
              in: body
              type: number
              description: "The quantity delivered."
          steps:
            - name: post-gr
              type: call
              call: sap.post-goods-receipt
              with:
                po_number: "{{po_number}}"
                quantity: "{{quantity}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Goods receipt posted for PO {{po_number}}: {{quantity}} units received. GR Document: {{post-gr.material_document}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: post-goods-receipt
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Goods Receipt Posting - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates purchase requisitions for low raw material stock.

naftiko: "0.5"
info:
  label: "SAP Inventory Reorder Point Alert"
  description: "Creates purchase requisitions for low raw material stock."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Inventory Reorder Point Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves invoice payment status from SAP including approval state and payment date.

naftiko: "0.5"
info:
  label: "SAP Invoice Payment Status"
  description: "Retrieves invoice payment status from SAP including approval state and payment date."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Invoice Payment Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Alerts on critical material shortages.

naftiko: "0.5"
info:
  label: "SAP MRP Shortage Alert"
  description: "Alerts on critical material shortages."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - mrp
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP MRP Shortage Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates maintenance work orders for plant equipment.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Create"
  description: "Creates maintenance work orders for plant equipment."
  tags:
    - manufacturing
    - sap
    - microsoft-teams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Plant Maintenance Work Order Create - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the status of a SAP production order including planned quantity and manufacturing status.

naftiko: "0.5"
info:
  label: "SAP Production Order Status"
  description: "Retrieves the status of a SAP production order including planned quantity and manufacturing status."
  tags:
    - manufacturing
    - sap
    - erp
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Production Order Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Posts production variance.

naftiko: "0.5"
info:
  label: "SAP Production Variance Report"
  description: "Posts production variance."
  tags:
    - manufacturing
    - sap
    - microsoft-teams
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Production Variance Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by number, returning header status, vendor, total value, and open line items for procurement tracking."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a Clorox SAP S/4HANA purchase order by PO number. Returns status, vendor name, total amount, and currency. Use for procurement tracking or invoice reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500007890."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://clorox-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 a quality inspection lot from SAP QM and returns the inspection result and defect count.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Result"
  description: "Retrieves a quality inspection lot from SAP QM and returns the inspection result and defect count."
  tags:
    - manufacturing
    - sap
    - erp
    - quality
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Quality Inspection Result - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves the status of a SAP transport request including release status, target system, and owner.

naftiko: "0.5"
info:
  label: "SAP Transport Request Status"
  description: "Retrieves the status of a SAP transport request including release status, target system, and owner."
  tags:
    - devops
    - sap
    - erp
    - transport-management
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Transport Request Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves supplier master data from SAP S/4HANA by vendor ID, returning payment terms, currency, and bank verification status for procurement and accounts payable use.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Lookup"
  description: "Retrieves supplier master data from SAP S/4HANA by vendor ID, returning payment terms, currency, and bank verification status for procurement and accounts payable use."
  tags:
    - procurement
    - sap
    - vendor-management
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: vendor-mgmt
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up a SAP supplier record by vendor ID. Returns company name, payment terms, currency, and bank verification status. Use for supplier onboarding checks or payment processing."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID, e.g. 1000099."
          call: sap.get-vendor
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Checks the status of a SAP vendor payment run, returning processed count and total amount.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Run Status"
  description: "Checks the status of a SAP vendor payment run, returning processed count and total amount."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Vendor Payment Run Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Generates vendor scorecards.

naftiko: "0.5"
info:
  label: "SAP Vendor Scorecard Generation"
  description: "Generates vendor scorecards."
  tags:
    - procurement
    - sap
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Vendor Scorecard Generation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers cycle counts.

naftiko: "0.5"
info:
  label: "SAP Warehouse Inventory Cycle Count"
  description: "Triggers cycle counts."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Warehouse Inventory Cycle Count - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates a ServiceNow change request for a planned infrastructure or application change, routes it for approval, and notifies the requester via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Management"
  description: "Creates a ServiceNow change request for a planned infrastructure or application change, routes it for approval, and notifies the requester via Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: create-change-request
          description: "Submit a ServiceNow change request for a planned infrastructure or application change and notify the requester via Teams upon submission. Use for CAB change management workflows."
          inputParameters:
            - name: description
              in: body
              type: string
              description: "Description of the planned change."
            - name: risk
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start in ISO 8601 format."
            - name: requester_upn
              in: body
              type: string
              description: "UPN of the change requester."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change
              with:
                description: "{{description}}"
                risk: "{{risk}}"
                start_date: "{{planned_start}}"
            - name: notify-requester
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Your change request {{create-cr.number}} has been submitted and is pending CAB approval."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_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: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a ServiceNow change request and returns its approval status and risk level.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Status"
  description: "Retrieves a ServiceNow change request and returns its approval status and risk level."
  tags:
    - it-ops
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow Change Request Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves a ServiceNow CMDB configuration item by asset tag.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Retrieves a ServiceNow CMDB configuration item by asset tag."
  tags:
    - it-ops
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow CMDB Asset Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Searches the ServiceNow knowledge base for articles matching a query.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches the ServiceNow knowledge base for articles matching a query."
  tags:
    - it-ops
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow Knowledge Article Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates Teams bridge for P1.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge"
  description: "Creates Teams bridge for P1."
  tags:
    - it-ops
    - servicenow
    - microsoft-teams
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow Major Incident Bridge - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates Jira tickets for problem investigation.

naftiko: "0.5"
info:
  label: "ServiceNow Problem Management Workflow"
  description: "Creates Jira tickets for problem investigation."
  tags:
    - it-ops
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow Problem Management Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Escalates SLA breaches.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "Escalates SLA breaches."
  tags:
    - it-ops
    - servicenow
    - microsoft-teams
    - sla-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow SLA Breach Escalation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches a SharePoint site for documents matching a keyword.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches a SharePoint site for documents matching a keyword."
  tags:
    - collaboration
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: collaboration-ops
      port: 8080
      tools:
        - name: get-record
          description: "SharePoint Document Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Sends enrollment reminders.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Sends enrollment reminders."
  tags:
    - hr
    - workday
    - benefits
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Benefits Enrollment Reminder - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Submits a compensation change for an employee in Workday and notifies the manager via Teams to complete the approval in Workday.

naftiko: "0.5"
info:
  label: "Workday Compensation Change Submission"
  description: "Submits a compensation change for an employee in Workday and notifies the manager via Teams to complete the approval in Workday."
  tags:
    - hr
    - compensation
    - workday
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: hr-comp
      port: 8080
      tools:
        - name: submit-comp-change
          description: "Given a Workday employee ID, new salary, and effective date, submit a compensation change in Workday and notify the manager via Teams to approve. Use for merit increase and promotion workflows."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee receiving the compensation change."
            - name: new_salary
              in: body
              type: number
              description: "New base salary amount in the employee's home currency."
            - name: effective_date
              in: body
              type: string
              description: "Effective date for the compensation change in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: submit-change
              type: call
              call: workday.submit-comp-change
              with:
                worker_id: "{{employee_id}}"
                new_salary: "{{new_salary}}"
                effective_date: "{{effective_date}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Compensation change for {{get-worker.full_name}} (effective {{effective_date}}) is pending your approval in Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/clorox/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
            - name: submit-comp-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Updates access on transfers.

naftiko: "0.5"
info:
  label: "Workday Employee Transfer Provisioning"
  description: "Updates access on transfers."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Employee Transfer Provisioning - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts monthly headcount planning summary.

naftiko: "0.5"
info:
  label: "Workday Headcount Planning Digest"
  description: "Posts monthly headcount planning summary."
  tags:
    - hr
    - workday
    - microsoft-teams
    - workforce-planning
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Headcount Planning Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts headcount variance.

naftiko: "0.5"
info:
  label: "Workday Headcount Variance Report"
  description: "Posts headcount variance."
  tags:
    - hr
    - workday
    - microsoft-teams
    - workforce-planning
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Headcount Variance Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Status"
  description: "Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date."
  tags:
    - hr
    - recruiting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-record
          description: "Workday Job Requisition Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Posts learning digest.

naftiko: "0.5"
info:
  label: "Workday Learning Completion Tracker"
  description: "Posts learning digest."
  tags:
    - hr
    - workday
    - microsoft-teams
    - learning
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Learning Completion Tracker - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates IT equipment requests.

naftiko: "0.5"
info:
  label: "Workday New Hire Equipment Provisioning"
  description: "Creates IT equipment requests."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday New Hire Equipment Provisioning - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves all open job requisitions from Workday and posts a weekly recruiting digest to the HR Microsoft Teams channel for staffing review.

naftiko: "0.5"
info:
  label: "Workday Open Requisition Weekly Digest"
  description: "Retrieves all open job requisitions from Workday and posts a weekly recruiting digest to the HR Microsoft Teams channel for staffing review."
  tags:
    - hr
    - recruiting
    - workday
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-recruiting
      port: 8080
      tools:
        - name: digest-open-requisitions
          description: "Fetch all open Workday job requisitions and post a weekly digest to the HR Teams channel. Use for weekly recruiting pipeline review."
          steps:
            - name: get-reqs
              type: call
              call: workday.list-job-requisitions
              with:
                status: "Open"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Weekly Open Requisitions: {{get-reqs.total_count}} open roles across Clorox."
  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: "/clorox/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-job-requisitions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the organizational hierarchy for a Workday worker, returning manager and direct reports count.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves the organizational hierarchy for a Workday worker, returning manager and direct reports count."
  tags:
    - hr
    - workday
    - organization
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-record
          description: "Workday Org Chart Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates a performance review event in Workday for a review period and notifies managers via Teams to complete evaluations by the deadline.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Kickoff"
  description: "Creates a performance review event in Workday for a review period and notifies managers via Teams to complete evaluations by the deadline."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: kickoff-review-cycle
          description: "Launch a Workday performance review cycle for a defined review period and notify managers via Teams to complete evaluations by the due date."
          inputParameters:
            - name: review_period
              in: body
              type: string
              description: "Review period label, e.g. 2026-Annual."
            - name: due_date
              in: body
              type: string
              description: "Evaluation completion deadline in ISO 8601 format."
          steps:
            - name: create-review-event
              type: call
              call: workday.create-review-event
              with:
                period: "{{review_period}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Performance review cycle {{review_period}} is now open. Complete all evaluations by {{due_date}} in Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-events
          path: "/clorox/performanceReviews"
          operations:
            - name: create-review-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/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sends review reminders.

naftiko: "0.5"
info:
  label: "Workday Performance Review Reminder"
  description: "Sends review reminders."
  tags:
    - hr
    - workday
    - microsoft-teams
    - performance-management
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Performance Review Reminder - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Revokes access on termination.

naftiko: "0.5"
info:
  label: "Workday Termination Access Revocation"
  description: "Revokes access on termination."
  tags:
    - hr
    - security
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Termination Access Revocation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Deactivates building badges on termination.

naftiko: "0.5"
info:
  label: "Workday Termination Badge Deactivation"
  description: "Deactivates building badges on termination."
  tags:
    - hr
    - security
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Termination Badge Deactivation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://clorox-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://clorox.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST