Cmc Materials Capabilities

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

Sort
Expand

When a customer complaint is received, creates a Salesforce case, opens an SAP quality notification for investigation, and notifies the customer success team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Complaint Intake Orchestrator"
  description: "When a customer complaint is received, creates a Salesforce case, opens an SAP quality notification for investigation, and notifies the customer success team via Microsoft Teams."
  tags:
    - customer-service
    - quality
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-service
      port: 8080
      tools:
        - name: intake-customer-complaint
          description: "Given customer details and complaint information, create a Salesforce case, an SAP quality notification, and notify the customer success team in Teams."
          inputParameters:
            - name: customer_name
              in: body
              type: string
              description: "The customer company name."
            - name: complaint_text
              in: body
              type: string
              description: "Description of the customer complaint."
            - name: material_number
              in: body
              type: string
              description: "The material number related to the complaint."
          steps:
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Customer complaint: {{customer_name}} — {{material_number}}"
                description: "{{complaint_text}}"
                priority: "High"
            - name: create-qn
              type: call
              call: sap.create-quality-notification
              with:
                material: "{{material_number}}"
                description: "Customer complaint from {{customer_name}}: {{complaint_text}}"
                notification_type: "Q3"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_cs_channel_id"
                text: "COMPLAINT: {{customer_name}} re: {{material_number}} — Case {{create-case.case_number}}, QN {{create-qn.notification_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/QualityNotification"
          operations:
            - name: create-quality-notification
              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

When a Datadog monitor triggers a critical alert, retrieves alert details, creates a ServiceNow P1 incident, and posts to the on-call Teams channel with runbook links.

naftiko: "0.5"
info:
  label: "Datadog Alert to ServiceNow Incident"
  description: "When a Datadog monitor triggers a critical alert, retrieves alert details, creates a ServiceNow P1 incident, and posts to the on-call Teams channel with runbook links."
  tags:
    - observability
    - incident-management
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: datadog-alert-to-incident
          description: "Given a Datadog monitor ID, retrieve the alert, create a ServiceNow P1 incident, and post to the on-call Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Datadog Alert: {{get-monitor.name}}"
                description: "Monitor {{monitor_id}} triggered. Message: {{get-monitor.message}}"
                urgency: "1"
                impact: "1"
            - name: post-oncall
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_oncall_channel_id"
                text: "P1 ALERT: {{get-monitor.name}} — INC {{create-incident.number}} created. Runbook: {{get-monitor.tags.runbook_url}}"
  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://cmcmaterials.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

Pulls infrastructure utilization metrics from Datadog, generates a capacity forecast, refreshes the Power BI infrastructure dashboard, and posts the report to the SRE Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Capacity Planning Report"
  description: "Pulls infrastructure utilization metrics from Datadog, generates a capacity forecast, refreshes the Power BI infrastructure dashboard, and posts the report to the SRE Teams channel."
  tags:
    - infrastructure
    - capacity-planning
    - datadog
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sre
      port: 8080
      tools:
        - name: generate-capacity-report
          description: "Given a service group, pull Datadog utilization data, refresh Power BI dashboard, and post the capacity report to the SRE team."
          inputParameters:
            - name: service_group
              in: body
              type: string
              description: "The service group or cluster to analyze."
          steps:
            - name: get-utilization
              type: call
              call: datadog.get-infrastructure-metrics
              with:
                service_group: "{{service_group}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_infra_dataset_id"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sre_channel_id"
                text: "CAPACITY: {{service_group}} — CPU: {{get-utilization.cpu_pct}}%, Memory: {{get-utilization.memory_pct}}%, Disk: {{get-utilization.disk_pct}}%. Dashboard refreshed."
  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: metrics
          path: "/query"
          operations:
            - name: get-infrastructure-metrics
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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 Datadog SLO error budget burn rates, creates a ServiceNow incident when burn rate exceeds threshold, and posts an alert to the SRE Teams channel with remediation guidance.

naftiko: "0.5"
info:
  label: "Datadog Error Budget Burn Alert"
  description: "Monitors Datadog SLO error budget burn rates, creates a ServiceNow incident when burn rate exceeds threshold, and posts an alert to the SRE Teams channel with remediation guidance."
  tags:
    - sre
    - observability
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sre
      port: 8080
      tools:
        - name: handle-error-budget-burn
          description: "Given a Datadog SLO ID with excessive burn rate, create a ServiceNow incident and alert the SRE team."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "The Datadog SLO ID."
          steps:
            - name: get-slo
              type: call
              call: datadog.get-slo
              with:
                slo_id: "{{slo_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Error budget burn: {{get-slo.name}}"
                description: "SLO: {{get-slo.name}}, Remaining budget: {{get-slo.remaining_budget}}%, Burn rate: {{get-slo.burn_rate}}x"
                urgency: "2"
            - name: alert-sre
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sre_channel_id"
                text: "ERROR BUDGET: {{get-slo.name}} burning at {{get-slo.burn_rate}}x — Remaining: {{get-slo.remaining_budget}}%. INC: {{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: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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

When a Datadog monitor triggers an infrastructure anomaly, 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, 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 notify the SRE Teams channel. Use for automated infrastructure anomaly response."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "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://cmcmaterials.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

Queries Datadog Logs for error spikes in a given service over the past hour and returns ranked 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 ranked 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 triage."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Datadog service name to query, e.g. cmp-slurry-delivery-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

Queries Datadog for the current health status of a monitored service, returning uptime percentage, error rate, and p99 latency over a configurable window.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a monitored service, returning uptime percentage, error rate, and p99 latency over a configurable window."
  tags:
    - observability
    - monitoring
    - datadog
    - sre
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Check the health of a CMC Materials service in Datadog. Returns uptime, error rate, and p99 latency. Use for SRE health checks and service reviews."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
            - name: window_hours
              in: body
              type: integer
              description: "Lookback window in hours."
          call: datadog.get-service-metrics
          with:
            service_name: "{{service_name}}"
            window_hours: "{{window_hours}}"
          outputParameters:
            - name: uptime_pct
              type: string
              mapping: "$.series[0].pointlist[-1][1]"
            - name: error_rate
              type: string
              mapping: "$.series[1].pointlist[-1][1]"
            - name: p99_latency
              type: string
              mapping: "$.series[2].pointlist[-1][1]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: service_name
              in: query
            - name: window_hours
              in: query
          operations:
            - name: get-service-metrics
              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 and SLO review meetings."
          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 CMC Materials 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

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: "/cmc-materials/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://cmcmaterials.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

When an employee transfers between departments in Workday, updates their ServiceNow access groups, adjusts Salesforce territory assignments, and notifies both old and new managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Transfer Provisioning"
  description: "When an employee transfers between departments in Workday, updates their ServiceNow access groups, adjusts Salesforce territory assignments, and notifies both old and new managers via Microsoft Teams."
  tags:
    - hr
    - access-management
    - workday
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: provision-employee-transfer
          description: "Given a Workday employee ID and new department, update ServiceNow access groups, Salesforce territory, and notify managers in Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: new_department
              in: body
              type: string
              description: "The new department name."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                employee_id: "{{employee_id}}"
            - name: update-access
              type: call
              call: servicenow.update-user-groups
              with:
                user_id: "{{get-employee.email}}"
                new_group: "{{new_department}}"
            - name: update-territory
              type: call
              call: salesforce.update-territory
              with:
                user_email: "{{get-employee.email}}"
                territory: "{{new_department}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "TRANSFER: {{get-employee.full_name}} moved to {{new_department}}. Access and territory updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: user-groups
          path: "/table/sys_user_grmember"
          operations:
            - name: update-user-groups
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territory
          path: "/sobjects/UserTerritory2Association"
          operations:
            - name: update-territory
              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

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

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 and log URL."
  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. cmc-materials/process-control-api."
            - name: branch
              in: body
              type: string
              description: "Branch name where the failure occurred."
          steps:
            - name: get-run
              type: call
              call: github.get-workflow-run
              with:
                owner: "cmc-materials"
                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://cmcmaterials.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 code coverage metrics from GitHub Actions, compares against team thresholds, creates a Jira task if below target, and posts the coverage report to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Code Coverage Report Publisher"
  description: "Fetches code coverage metrics from GitHub Actions, compares against team thresholds, creates a Jira task if below target, and posts the coverage report to the engineering Teams channel."
  tags:
    - devops
    - quality
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: publish-coverage-report
          description: "Given a GitHub repo and workflow run ID, pull coverage metrics, create a Jira task if below threshold, and post to engineering Teams."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
          steps:
            - name: get-coverage
              type: call
              call: github.get-workflow-artifacts
              with:
                repo: "{{repo_name}}"
                run_id: "{{run_id}}"
            - name: create-improvement
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                summary: "Code coverage below threshold: {{repo_name}}"
                description: "Coverage: {{get-coverage.line_coverage}}%. Target: 80%."
                issue_type: "Task"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "COVERAGE: {{repo_name}} — Lines: {{get-coverage.line_coverage}}%, Branches: {{get-coverage.branch_coverage}}%. Jira: {{create-improvement.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: artifacts
          path: "/repos/cmc-materials/{{repo}}/actions/runs/{{run_id}}/artifacts"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-artifacts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches critical Dependabot security alerts for a GitHub repository, creates a ServiceNow security incident, 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 a ServiceNow security incident, 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 alert the CMC Materials security team via Teams."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format, e.g. cmc-materials/slurry-formulation-api."
          steps:
            - name: get-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                owner: "cmc-materials"
                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://cmcmaterials.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

Retrieves pull request details from GitHub by repository and PR number, returning title, status, review state, and CI check results.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Status Check"
  description: "Retrieves pull request details from GitHub by repository and PR number, returning title, status, review state, and CI check results."
  tags:
    - devops
    - ci-cd
    - github
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-pr-status
          description: "Look up a CMC Materials GitHub pull request by repo and PR number. Returns title, status, review state, and CI checks. Use for deployment readiness and code review tracking."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number."
          call: github.get-pull-request
          with:
            repo_name: "{{repo_name}}"
            pr_number: "{{pr_number}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: state
              type: string
              mapping: "$.state"
            - name: mergeable
              type: boolean
              mapping: "$.mergeable"
            - name: review_status
              type: string
              mapping: "$.review_decision"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/cmc-materials/{{repo_name}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET

When a GitHub release is published, creates a ServiceNow change record for ITIL compliance, updates the Datadog deployment event marker, and notifies the release management Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release to ServiceNow Change Record"
  description: "When a GitHub release is published, creates a ServiceNow change record for ITIL compliance, updates the Datadog deployment event marker, and notifies the release management Teams channel."
  tags:
    - devops
    - change-management
    - github
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: release-mgmt
      port: 8080
      tools:
        - name: create-change-from-release
          description: "Given a GitHub repository and release tag, create a ServiceNow change record, a Datadog deployment marker, and notify the release team in Teams."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: release_tag
              in: body
              type: string
              description: "The release tag, e.g. v2.3.1."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                repo_name: "{{repo_name}}"
                tag: "{{release_tag}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Release {{release_tag}} for {{repo_name}}"
                description: "{{get-release.body}}"
                type: "standard"
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "Deployment: {{repo_name}} {{release_tag}}"
                text: "Change: {{create-change.number}}"
                alert_type: "info"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_release_channel_id"
                text: "RELEASE: {{repo_name}} {{release_tag}} — Change {{create-change.number}} created."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/cmc-materials/{{repo_name}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: 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

Retrieves branch protection rules for a given GitHub repository and branch, returning required review count, status checks, and enforcement status.

naftiko: "0.5"
info:
  label: "GitHub Repository Branch Protection Check"
  description: "Retrieves branch protection rules for a given GitHub repository and branch, returning required review count, status checks, and enforcement status."
  tags:
    - devops
    - security
    - github
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-branch-protection
          description: "Check branch protection rules for a CMC Materials GitHub repository. Returns required reviewers, status checks, and admin enforcement. Use for compliance audits and security reviews."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: branch
              in: body
              type: string
              description: "The branch name, e.g. main."
          call: github.get-branch-protection
          with:
            repo_name: "{{repo_name}}"
            branch: "{{branch}}"
          outputParameters:
            - name: required_reviewers
              type: integer
              mapping: "$.required_pull_request_reviews.required_approving_review_count"
            - name: status_checks
              type: array
              mapping: "$.required_status_checks.contexts"
            - name: enforce_admins
              type: boolean
              mapping: "$.enforce_admins.enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/cmc-materials/{{repo_name}}/branches/{{branch}}/protection"
          inputParameters:
            - name: repo_name
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch-protection
              method: GET

When a critical GitHub Dependabot alert is detected, creates a Jira security ticket, opens a ServiceNow change request for patching, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Remediation"
  description: "When a critical GitHub Dependabot alert is detected, creates a Jira security ticket, opens a ServiceNow change request for patching, and notifies the security team via Teams."
  tags:
    - security
    - vulnerability-management
    - github
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: remediate-vulnerability
          description: "Given a GitHub repo and Dependabot alert ID, create a Jira security ticket, a ServiceNow change, and notify the security team."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: alert_id
              in: body
              type: string
              description: "The Dependabot alert ID."
          steps:
            - name: get-alert
              type: call
              call: github.get-dependabot-alert
              with:
                repo: "{{repo_name}}"
                alert_id: "{{alert_id}}"
            - name: create-jira
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "CVE: {{get-alert.cve_id}} in {{repo_name}}"
                description: "Severity: {{get-alert.severity}}. Package: {{get-alert.package_name}}. Fix: {{get-alert.fixed_version}}."
                issue_type: "Bug"
                priority: "Critical"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Patch {{get-alert.package_name}} in {{repo_name}} for {{get-alert.cve_id}}"
                type: "emergency"
            - name: notify-security
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "CVE ALERT: {{get-alert.cve_id}} ({{get-alert.severity}}) in {{repo_name}} — Jira: {{create-jira.key}}, Change: {{create-change.number}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/cmc-materials/{{repo}}/dependabot/alerts/{{alert_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_id
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: 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

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 event for correlation, and post to the IT-incidents Teams channel. Use for P1/P2 incident bridges."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number, e.g. INC0098765."
          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://cmcmaterials.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

Pulls completed sprint data from Jira, calculates velocity and completion metrics, and posts a retrospective summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Retrospective Summary"
  description: "Pulls completed sprint data from Jira, calculates velocity and completion metrics, and posts a retrospective summary to the engineering Teams channel."
  tags:
    - engineering
    - agile
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: generate-retro-summary
          description: "Given a Jira board ID and sprint ID, pull sprint metrics and post a retrospective summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "SPRINT RETRO: {{get-sprint-report.sprint_name}} — Completed: {{get-sprint-report.completed_points}}/{{get-sprint-report.committed_points}} pts, Stories: {{get-sprint-report.completed_issues}}/{{get-sprint-report.total_issues}}, Velocity: {{get-sprint-report.velocity}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an unplanned manufacturing downtime occurs, creates an SAP maintenance notification, opens a ServiceNow incident for IT investigation, and posts an alert to the operations Teams channel.

naftiko: "0.5"
info:
  label: "Manufacturing Downtime Event Handler"
  description: "When an unplanned manufacturing downtime occurs, creates an SAP maintenance notification, opens a ServiceNow incident for IT investigation, and posts an alert to the operations Teams channel."
  tags:
    - manufacturing
    - maintenance
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: handle-downtime-event
          description: "Given equipment details and downtime description, create an SAP maintenance notification, a ServiceNow incident, and alert the operations team in Teams."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "The SAP equipment number experiencing downtime."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: description
              in: body
              type: string
              description: "Description of the downtime event."
          steps:
            - name: create-maintenance-notification
              type: call
              call: sap.create-maintenance-notification
              with:
                equipment: "{{equipment_number}}"
                plant: "{{plant_code}}"
                description: "{{description}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Unplanned downtime: Equipment {{equipment_number}} at Plant {{plant_code}}"
                description: "{{description}} — SAP Notification: {{create-maintenance-notification.notification_number}}"
                urgency: "1"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "DOWNTIME: Equipment {{equipment_number}} at Plant {{plant_code}} — SAP {{create-maintenance-notification.notification_number}}, INC {{create-incident.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-notifications
          path: "/MaintenanceNotification"
          operations:
            - name: create-maintenance-notification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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

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 new hire onboarding sequence across ServiceNow, Microsoft 365, and Microsoft Teams for a CMC Materials employee."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire, e.g. WD-00789."
            - 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-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 CMC Materials, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-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: "/cmc-materials/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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

Retrieves the latest refresh status for a Power BI dataset, returning refresh type, start time, end time, and status for data pipeline monitoring.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Retrieves the latest refresh status for a Power BI dataset, returning refresh type, start time, end time, and status for data pipeline monitoring."
  tags:
    - analytics
    - reporting
    - power-bi
    - data-ops
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Check the latest refresh status of a CMC Materials Power BI dataset. Returns refresh type, timestamps, and status. Use for data pipeline monitoring and dashboard freshness verification."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: powerbi.get-refresh-history
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_type
              type: string
              mapping: "$.value[0].refreshType"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
            - name: status
              type: string
              mapping: "$.value[0].status"
  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: get-refresh-history
              method: GET

Triggers a Power BI dataset refresh for the CMC Materials manufacturing operations dashboard and notifies the analytics team via Teams upon completion.

naftiko: "0.5"
info:
  label: "Power BI Manufacturing Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the CMC Materials manufacturing operations dashboard and notifies the analytics team via Teams upon completion."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: trigger-manufacturing-dashboard-refresh
          description: "Trigger a Power BI dataset refresh for the manufacturing operations dashboard and notify the analytics Teams channel. 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 manufacturing dataset {{dataset_id}} refresh triggered."
  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

When a production order is completed in SAP, confirms goods receipt, updates the Power BI manufacturing dashboard, and notifies the production planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Production Order Completion Workflow"
  description: "When a production order is completed in SAP, confirms goods receipt, updates the Power BI manufacturing dashboard, and notifies the production planning team via Microsoft Teams."
  tags:
    - manufacturing
    - production
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: complete-production-order
          description: "Given a completed SAP production order number, confirm goods receipt, trigger Power BI dashboard refresh, and notify the planning team in Teams."
          inputParameters:
            - name: production_order
              in: body
              type: string
              description: "The SAP production order number."
          steps:
            - name: get-order
              type: call
              call: sap.get-production-order
              with:
                order_number: "{{production_order}}"
            - name: confirm-goods
              type: call
              call: sap.confirm-goods-receipt
              with:
                order_number: "{{production_order}}"
                material: "{{get-order.material}}"
                quantity: "{{get-order.confirmed_yield}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_manufacturing_dataset_id"
            - name: notify-planning
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_production_channel_id"
                text: "COMPLETED: Production order {{production_order}} — Material: {{get-order.material}}, Yield: {{get-order.confirmed_yield}} {{get-order.unit}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET
            - name: confirm-goods-receipt
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

When a quality nonconformance is detected, creates an SAP quality notification, opens a Jira ticket for the quality engineering team, and sends a notification to the quality Teams channel.

naftiko: "0.5"
info:
  label: "Quality Nonconformance Workflow"
  description: "When a quality nonconformance is detected, creates an SAP quality notification, opens a Jira ticket for the quality engineering team, and sends a notification to the quality Teams channel."
  tags:
    - quality
    - manufacturing
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: handle-nonconformance
          description: "Given a material number and defect description, create an SAP quality notification, open a Jira ticket for quality engineering, and alert the quality team in Teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number with the defect."
            - name: defect_description
              in: body
              type: string
              description: "Description of the quality nonconformance."
            - name: batch_number
              in: body
              type: string
              description: "The affected batch number."
          steps:
            - name: create-notification
              type: call
              call: sap.create-quality-notification
              with:
                material: "{{material_number}}"
                batch: "{{batch_number}}"
                description: "{{defect_description}}"
            - name: create-jira-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "QA"
                summary: "NCR: {{material_number}} batch {{batch_number}}"
                description: "{{defect_description}} — SAP QN: {{create-notification.notification_number}}"
                issue_type: "Bug"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_quality_channel_id"
                text: "QUALITY NCR: Material {{material_number}}, Batch {{batch_number}} — QN {{create-notification.notification_number}}, Jira {{create-jira-ticket.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce support case by case number and returns status, priority, owner, and last modified date for customer service tracking.

naftiko: "0.5"
info:
  label: "Salesforce Case Status Lookup"
  description: "Retrieves a Salesforce support case by case number and returns status, priority, owner, and last modified date for customer service tracking."
  tags:
    - customer-service
    - support
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-case-status
          description: "Look up a CMC Materials Salesforce support case by case number. Returns status, priority, owner, and last modified date. Use for customer service inquiries and case escalation."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The Salesforce case number, e.g. 00012345."
          call: salesforce.get-case
          with:
            case_number: "{{case_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: priority
              type: string
              mapping: "$.Priority"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
            - name: last_modified
              type: string
              mapping: "$.LastModifiedDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET

When a Salesforce account is flagged as high churn risk, creates a retention playbook task in Jira, schedules a customer health review, and alerts the account team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Churn Prediction Action"
  description: "When a Salesforce account is flagged as high churn risk, creates a retention playbook task in Jira, schedules a customer health review, and alerts the account team via Teams."
  tags:
    - customer-success
    - retention
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: act-on-churn-risk
          description: "Given a high-risk Salesforce account, create a Jira retention task and alert the account team."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account-health
              with:
                account_id: "{{account_id}}"
            - name: create-retention-task
              type: call
              call: jira.create-issue
              with:
                project_key: "CS"
                summary: "Churn risk: {{get-account.account_name}} — Score: {{get-account.health_score}}"
                description: "ARR: ${{get-account.arr}}. Last engagement: {{get-account.last_activity}}. NPS: {{get-account.nps}}."
                issue_type: "Task"
                priority: "High"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_cs_channel_id"
                text: "CHURN RISK: {{get-account.account_name}} ({{get-account.health_score}}/100) — ARR: ${{get-account.arr}}. Retention playbook: {{create-retention-task.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-health
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce contact by email address and returns name, account, title, and phone number for CRM inquiries.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves a Salesforce contact by email address and returns name, account, title, and phone number for CRM inquiries."
  tags:
    - sales
    - crm
    - salesforce
    - contacts
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-contact-by-email
          description: "Look up a CMC Materials Salesforce contact by email address. Returns name, account, title, and phone. Use for customer inquiry routing and contact verification."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The contact email address."
          call: salesforce.get-contact
          with:
            email: "{{email}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.records[0].Name"
            - name: account
              type: string
              mapping: "$.records[0].Account.Name"
            - name: title
              type: string
              mapping: "$.records[0].Title"
            - name: phone
              type: string
              mapping: "$.records[0].Phone"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/query?q=SELECT+Name,Account.Name,Title,Phone+FROM+Contact+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: get-contact
              method: GET

Identifies cross-sell opportunities based on Salesforce account purchase history, creates new opportunity records, and notifies the account team via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Cross-Sell Opportunity Creator"
  description: "Identifies cross-sell opportunities based on Salesforce account purchase history, creates new opportunity records, and notifies the account team via Teams."
  tags:
    - sales
    - cross-sell
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: create-cross-sell-opportunity
          description: "Given a Salesforce account and product recommendation, create a cross-sell opportunity and notify the account team."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: product_family
              in: body
              type: string
              description: "The recommended product family."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: create-opportunity
              type: call
              call: salesforce.create-opportunity
              with:
                account_id: "{{account_id}}"
                name: "Cross-sell: {{product_family}} for {{get-account.name}}"
                stage: "Prospecting"
                type: "Cross-Sell"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "CROSS-SELL: {{get-account.name}} — {{product_family}}. Opportunity: {{create-opportunity.opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              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

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

naftiko: "0.5"
info:
  label: "Salesforce Customer 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."
  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 account details, open opportunities, and recent cases for a customer health summary. Use for account review meetings or customer success check-ins."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "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://cmcmaterials.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://cmcmaterials.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://cmcmaterials.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

Converts a qualified Salesforce lead into an opportunity, notifying the assigned sales rep via Teams to begin the customer engagement.

naftiko: "0.5"
info:
  label: "Salesforce Lead-to-Opportunity Conversion"
  description: "Converts a qualified Salesforce lead into an opportunity, notifying the assigned sales rep via Teams to begin the customer 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 lead to an opportunity and account in Salesforce and notify the assigned sales rep via Teams. Use for automated lead qualification handoff."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "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. Account: {{convert.accountId}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://cmcmaterials.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://cmcmaterials.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

When an NPS survey response falls 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 falls 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 and create a high-priority service case for the customer success team to follow up."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "Salesforce Contact ID of the 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://cmcmaterials.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://cmcmaterials.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 updated records to Power BI for sales pipeline reporting.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Refresh"
  description: "Queries Salesforce for opportunities updated in the last 24 hours and pushes updated records to Power BI for sales pipeline 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 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://cmcmaterials.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

Prepares quarterly business review materials by pulling Salesforce account data, refreshing the Power BI executive dashboard, and posting the QBR summary to the executive Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Business Review Prep"
  description: "Prepares quarterly business review materials by pulling Salesforce account data, refreshing the Power BI executive dashboard, and posting the QBR summary to the executive Teams channel."
  tags:
    - sales
    - executive-reporting
    - salesforce
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: prepare-qbr
          description: "Given a Salesforce account ID and quarter, pull account data, refresh the executive dashboard, and post QBR summary to Teams."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: quarter
              in: body
              type: string
              description: "The quarter, e.g. Q1-2026."
          steps:
            - name: get-account-data
              type: call
              call: salesforce.get-account-summary
              with:
                account_id: "{{account_id}}"
                quarter: "{{quarter}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_executive_dataset_id"
            - name: post-qbr
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_executive_channel_id"
                text: "QBR PREP: {{get-account-data.account_name}} {{quarter}} — Revenue: ${{get-account-data.revenue}}, Open Opps: {{get-account-data.open_opportunities}}, NPS: {{get-account-data.nps}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account-summary
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Identifies at-risk Salesforce renewal opportunities, enriches with NPS data, creates a Jira task for the customer success team, and alerts the account manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Risk Alert"
  description: "Identifies at-risk Salesforce renewal opportunities, enriches with NPS data, creates a Jira task for the customer success team, and alerts the account manager via Microsoft Teams."
  tags:
    - sales
    - customer-success
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: flag-renewal-risk
          description: "Given a Salesforce opportunity ID flagged as at-risk, retrieve opportunity details, create a Jira CS task, and alert the account manager in Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "CS"
                summary: "Renewal at risk: {{get-opportunity.account_name}} — ${{get-opportunity.amount}}"
                description: "Close date: {{get-opportunity.close_date}}. Stage: {{get-opportunity.stage}}. NPS: {{get-opportunity.nps_score}}."
                issue_type: "Task"
            - name: alert-am
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "RENEWAL RISK: {{get-opportunity.account_name}} — ${{get-opportunity.amount}} closing {{get-opportunity.close_date}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When sales territories are realigned in Salesforce, updates account ownership, creates Jira tasks for the sales ops team to validate, and notifies affected reps via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Territory Realignment Sync"
  description: "When sales territories are realigned in Salesforce, updates account ownership, creates Jira tasks for the sales ops team to validate, and notifies affected reps via Teams."
  tags:
    - sales
    - territory-management
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: sync-territory-realignment
          description: "Given a territory ID and new owner, update Salesforce accounts, create Jira validation task, and notify affected reps."
          inputParameters:
            - name: territory_id
              in: body
              type: string
              description: "The Salesforce territory ID."
            - name: new_owner_id
              in: body
              type: string
              description: "The new territory owner user ID."
          steps:
            - name: get-territory
              type: call
              call: salesforce.get-territory
              with:
                territory_id: "{{territory_id}}"
            - name: reassign-accounts
              type: call
              call: salesforce.reassign-accounts
              with:
                territory_id: "{{territory_id}}"
                new_owner: "{{new_owner_id}}"
            - name: create-validation-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SOPS"
                summary: "Validate territory realignment: {{get-territory.name}}"
                description: "{{reassign-accounts.count}} accounts reassigned to {{new_owner_id}}."
                issue_type: "Task"
            - name: notify-reps
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "TERRITORY CHANGE: {{get-territory.name}} — {{reassign-accounts.count}} accounts reassigned. Validation: {{create-validation-task.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territories
          path: "/sobjects/Territory2/{{territory_id}}"
          inputParameters:
            - name: territory_id
              in: path
          operations:
            - name: get-territory
              method: GET
            - name: reassign-accounts
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Salesforce for recently closed opportunities, aggregates win/loss data, refreshes the Power BI sales analytics dashboard, and posts a weekly digest to the sales leadership Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Win/Loss Analysis Digest"
  description: "Queries Salesforce for recently closed opportunities, aggregates win/loss data, refreshes the Power BI sales analytics dashboard, and posts a weekly digest to the sales leadership Teams channel."
  tags:
    - sales
    - analytics
    - salesforce
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-analytics
      port: 8080
      tools:
        - name: generate-win-loss-digest
          description: "Query Salesforce for closed opportunities in a date range, refresh Power BI dashboard, and post digest to sales leadership Teams channel."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date for the analysis period, e.g. 2025-01-01."
            - name: end_date
              in: body
              type: string
              description: "End date for the analysis period."
          steps:
            - name: query-opportunities
              type: call
              call: salesforce.query-closed-opps
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_sales_dataset_id"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sales_leadership_channel_id"
                text: "WIN/LOSS DIGEST ({{start_date}} to {{end_date}}): Won: {{query-opportunities.won_count}} (${{query-opportunities.won_value}}), Lost: {{query-opportunities.lost_count}} (${{query-opportunities.lost_value}})"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-closed-opps
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Pulls AR aging data from SAP, creates Salesforce follow-up tasks for overdue accounts, and posts a weekly aging digest to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Accounts Receivable Aging Digest"
  description: "Pulls AR aging data from SAP, creates Salesforce follow-up tasks for overdue accounts, and posts a weekly aging digest to the finance Teams channel."
  tags:
    - finance
    - accounts-receivable
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: generate-ar-aging-digest
          description: "Pull SAP AR aging, create Salesforce tasks for overdue accounts, and post digest to finance Teams."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
          steps:
            - name: get-aging
              type: call
              call: sap.get-ar-aging
              with:
                company_code: "{{company_code}}"
            - name: create-tasks
              type: call
              call: salesforce.create-collection-tasks
              with:
                overdue_accounts: "{{get-aging.overdue_accounts}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "AR AGING: Total outstanding: ${{get-aging.total_outstanding}}, 30+ days: ${{get-aging.over_30}}, 60+ days: ${{get-aging.over_60}}, 90+ days: ${{get-aging.over_90}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ar-aging
          path: "/A_ReceivablesAging?$filter=CompanyCode eq '{{company_code}}'"
          inputParameters:
            - name: company_code
              in: query
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-collection-tasks
              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

Retrieves batch traceability information from SAP S/4HANA for a given material and batch number, returning manufacturing date, shelf life expiration, and supplier lot.

naftiko: "0.5"
info:
  label: "SAP Batch Traceability Lookup"
  description: "Retrieves batch traceability information from SAP S/4HANA for a given material and batch number, returning manufacturing date, shelf life expiration, and supplier lot."
  tags:
    - quality
    - traceability
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-batch-traceability
          description: "Look up batch details for a CMC Materials material. Returns manufacturing date, shelf life expiration, and supplier lot number. Use for quality investigations and traceability audits."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: batch_number
              in: body
              type: string
              description: "The batch number to trace."
          call: sap.get-batch
          with:
            material_number: "{{material_number}}"
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: manufacturing_date
              type: string
              mapping: "$.d.MfgDate"
            - name: shelf_life_expiration
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
            - name: supplier_lot
              type: string
              mapping: "$.d.SupplierBatchExternalID"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch(Material='{{material_number}}',Batch='{{batch_number}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET

Retrieves a billing document from SAP S/4HANA by invoice number and returns payer, net amount, currency, and billing date for accounts receivable inquiries.

naftiko: "0.5"
info:
  label: "SAP Billing Document Lookup"
  description: "Retrieves a billing document from SAP S/4HANA by invoice number and returns payer, net amount, currency, and billing date for accounts receivable inquiries."
  tags:
    - finance
    - billing
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-billing-document
          description: "Look up a CMC Materials SAP billing document by invoice number. Returns payer name, net amount, currency, and billing date. Use for accounts receivable inquiries and invoice reconciliation."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP billing document number, e.g. 0090012345."
          call: sap.get-invoice
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: payer
              type: string
              mapping: "$.d.PayerName"
            - name: net_amount
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: billing_date
              type: string
              mapping: "$.d.BillingDocumentDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: billing-documents
          path: "/A_BillingDocument('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET

Processes capital expenditure requests from SAP, creates approval tasks in ServiceNow, and notifies the finance committee via Teams with investment details and ROI calculations.

naftiko: "0.5"
info:
  label: "SAP CapEx Approval Workflow"
  description: "Processes capital expenditure requests from SAP, creates approval tasks in ServiceNow, and notifies the finance committee via Teams with investment details and ROI calculations."
  tags:
    - finance
    - capex
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: process-capex-request
          description: "Given an SAP investment order number, retrieve CapEx details, create a ServiceNow approval, and notify the finance committee."
          inputParameters:
            - name: investment_order
              in: body
              type: string
              description: "The SAP investment order number."
          steps:
            - name: get-investment
              type: call
              call: sap.get-investment-order
              with:
                order_number: "{{investment_order}}"
            - name: create-approval
              type: call
              call: servicenow.create-approval
              with:
                type: "capex"
                description: "CapEx: {{get-investment.description}} — ${{get-investment.total_amount}}"
                amount: "{{get-investment.total_amount}}"
            - name: notify-committee
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_committee_channel_id"
                text: "CAPEX REQUEST: {{get-investment.description}} — ${{get-investment.total_amount}}. ROI: {{get-investment.roi_pct}}%. Approval: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_INVESTMENT_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: investment-orders
          path: "/A_InvestmentOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-investment-order
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              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

Identifies SAP purchase contracts nearing expiration, creates renewal tasks in Jira for procurement, and sends alerts to the procurement Teams channel with contract details.

naftiko: "0.5"
info:
  label: "SAP Contract Expiry Renewal Alert"
  description: "Identifies SAP purchase contracts nearing expiration, creates renewal tasks in Jira for procurement, and sends alerts to the procurement Teams channel with contract details."
  tags:
    - procurement
    - contracts
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: alert-contract-expiry
          description: "Given a contract number nearing expiry, create a Jira renewal task and alert procurement in Teams."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "The SAP purchase contract number."
          steps:
            - name: get-contract
              type: call
              call: sap.get-contract
              with:
                contract_number: "{{contract_number}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "PROC"
                summary: "Contract renewal: {{contract_number}} — {{get-contract.vendor_name}}"
                description: "Expires: {{get-contract.end_date}}. Value: ${{get-contract.total_value}}."
                issue_type: "Task"
            - name: alert-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "CONTRACT EXPIRY: {{contract_number}} with {{get-contract.vendor_name}} expires {{get-contract.end_date}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PURCHASECONTRACT_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contracts
          path: "/A_PurchaseContract('{{contract_number}}')"
          inputParameters:
            - name: contract_number
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles cost allocations between SAP cost centers and profit centers, flags mismatches, creates Jira tasks for the controlling team, and posts findings to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Cost Allocation Reconciliation"
  description: "Reconciles cost allocations between SAP cost centers and profit centers, flags mismatches, creates Jira tasks for the controlling team, and posts findings to the finance Teams channel."
  tags:
    - finance
    - controlling
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: reconcile-cost-allocations
          description: "Given a fiscal period, reconcile SAP cost center and profit center allocations, create Jira tasks for mismatches, and post to finance Teams."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period, e.g. 2025-12."
          steps:
            - name: get-allocations
              type: call
              call: sap.get-cost-allocations
              with:
                period: "{{fiscal_period}}"
            - name: create-tasks
              type: call
              call: jira.create-issue
              with:
                project_key: "FIN"
                summary: "Cost allocation reconciliation: {{fiscal_period}}"
                description: "Mismatches: {{get-allocations.mismatch_count}}. Total variance: ${{get-allocations.variance_amount}}."
                issue_type: "Task"
            - name: post-findings
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "COST RECONCILIATION: {{fiscal_period}} — {{get-allocations.mismatch_count}} mismatches, variance: ${{get-allocations.variance_amount}}. Jira: {{create-tasks.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: allocations
          path: "/A_CostAllocation?$filter=FiscalPeriod eq '{{period}}'"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-cost-allocations
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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 given fiscal period and post a variance digest to the Finance Teams channel."
          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}} available. {{get-variance.total_cost_centers}} cost centers reviewed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-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

Retrieves customer credit limit and exposure from SAP S/4HANA for a given customer number, returning credit limit, current exposure, and available credit.

naftiko: "0.5"
info:
  label: "SAP Customer Credit Limit Check"
  description: "Retrieves customer credit limit and exposure from SAP S/4HANA for a given customer number, returning credit limit, current exposure, and available credit."
  tags:
    - finance
    - credit-management
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-credit-limit
          description: "Check credit limit and exposure for a CMC Materials customer in SAP. Returns credit limit, current exposure, and available credit. Use for order approval and credit risk assessment."
          inputParameters:
            - name: customer_number
              in: body
              type: string
              description: "The SAP customer number."
          call: sap.get-credit
          with:
            customer_number: "{{customer_number}}"
          outputParameters:
            - name: credit_limit
              type: string
              mapping: "$.d.CreditLimit"
            - name: current_exposure
              type: string
              mapping: "$.d.CreditExposure"
            - name: available_credit
              type: string
              mapping: "$.d.AvailableCredit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: credit
          path: "/A_CustomerCreditMgmt('{{customer_number}}')"
          inputParameters:
            - name: customer_number
              in: path
          operations:
            - name: get-credit
              method: GET

Tracks a customer order from SAP sales order through production to delivery, aggregates status across stages, and posts the fulfillment update to the sales Teams channel.

naftiko: "0.5"
info:
  label: "SAP Customer Order to Delivery Tracker"
  description: "Tracks a customer order from SAP sales order through production to delivery, aggregates status across stages, and posts the fulfillment update to the sales Teams channel."
  tags:
    - sales
    - order-fulfillment
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: order-mgmt
      port: 8080
      tools:
        - name: track-order-fulfillment
          description: "Given a SAP sales order number, track status through production and delivery stages and post an update to the sales team."
          inputParameters:
            - name: sales_order
              in: body
              type: string
              description: "The SAP sales order number."
          steps:
            - name: get-sales-order
              type: call
              call: sap.get-sales-order
              with:
                order_number: "{{sales_order}}"
            - name: get-production-status
              type: call
              call: sap.get-production-order-status
              with:
                sales_order: "{{sales_order}}"
            - name: get-delivery-status
              type: call
              call: sap.get-delivery-status
              with:
                sales_order: "{{sales_order}}"
            - name: post-update
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "ORDER STATUS: {{sales_order}} — Customer: {{get-sales-order.customer}}, Production: {{get-production-status.status}}, Delivery: {{get-delivery-status.status}}, ETA: {{get-delivery-status.planned_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
            - name: get-production-order-status
              method: GET
            - name: get-delivery-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an outbound delivery document from SAP S/4HANA by delivery number and returns shipping status, ship-to party, and goods issue date.

naftiko: "0.5"
info:
  label: "SAP Delivery Document Status"
  description: "Retrieves an outbound delivery document from SAP S/4HANA by delivery number and returns shipping status, ship-to party, and goods issue date."
  tags:
    - logistics
    - shipping
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-delivery-status
          description: "Look up a CMC Materials SAP outbound delivery by delivery number. Returns shipping status, ship-to party, and goods issue date. Use for logistics tracking and customer delivery inquiries."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number, e.g. 0080012345."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: shipping_status
              type: string
              mapping: "$.d.OverallSDProcessStatus"
            - name: ship_to_party
              type: string
              mapping: "$.d.ShipToPartyName"
            - name: goods_issue_date
              type: string
              mapping: "$.d.GoodsIssueDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Takes a demand forecast from Salesforce opportunity pipeline, creates SAP planned orders for production scheduling, and notifies the planning team via Teams.

naftiko: "0.5"
info:
  label: "SAP Demand Forecast to Production Plan"
  description: "Takes a demand forecast from Salesforce opportunity pipeline, creates SAP planned orders for production scheduling, and notifies the planning team via Teams."
  tags:
    - manufacturing
    - demand-planning
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: planning
      port: 8080
      tools:
        - name: convert-forecast-to-plan
          description: "Given a forecast period, pull Salesforce pipeline data, create SAP planned orders, and notify the planning team."
          inputParameters:
            - name: forecast_period
              in: body
              type: string
              description: "The forecast period, e.g. 2026-Q2."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce.get-pipeline-forecast
              with:
                period: "{{forecast_period}}"
            - name: create-planned-orders
              type: call
              call: sap.create-planned-orders
              with:
                materials: "{{get-pipeline.materials}}"
                quantities: "{{get-pipeline.quantities}}"
            - name: notify-planning
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_planning_channel_id"
                text: "DEMAND PLAN: {{forecast_period}} — {{create-planned-orders.order_count}} planned orders created from ${{get-pipeline.total_value}} pipeline."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pipeline
          path: "/query"
          operations:
            - name: get-pipeline-forecast
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PLANNED_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: planned-orders
          path: "/A_PlannedOrder"
          operations:
            - name: create-planned-orders
              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

Collects energy consumption data from SAP plant maintenance for sustainability reporting, refreshes the Power BI sustainability dashboard, and posts monthly consumption alerts to the EHS Teams channel.

naftiko: "0.5"
info:
  label: "SAP Energy Consumption Tracking"
  description: "Collects energy consumption data from SAP plant maintenance for sustainability reporting, refreshes the Power BI sustainability dashboard, and posts monthly consumption alerts to the EHS Teams channel."
  tags:
    - sustainability
    - energy
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: track-energy-consumption
          description: "Given a plant code and month, pull SAP energy data, refresh Power BI sustainability dashboard, and post to the EHS team."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
            - name: month
              in: body
              type: string
              description: "The reporting month, e.g. 2025-12."
          steps:
            - name: get-energy-data
              type: call
              call: sap.get-energy-consumption
              with:
                plant: "{{plant_code}}"
                month: "{{month}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_sustainability_dataset_id"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_ehs_channel_id"
                text: "ENERGY: Plant {{plant_code}} ({{month}}) — Consumption: {{get-energy-data.total_kwh}} kWh ({{get-energy-data.variance_pct}}% vs target). CO2: {{get-energy-data.co2_tons}} tons."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_ENERGY_CONSUMPTION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy
          path: "/EnergyConsumption?plant={{plant}}&month={{month}}"
          inputParameters:
            - name: plant
              in: query
            - name: month
              in: query
          operations:
            - name: get-energy-consumption
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Retrieves environmental compliance data for a material from SAP EHS, checks against regulatory thresholds, and creates a Jira remediation ticket if non-compliant, then alerts the EHS team via Teams.

naftiko: "0.5"
info:
  label: "SAP Environmental Compliance Check"
  description: "Retrieves environmental compliance data for a material from SAP EHS, checks against regulatory thresholds, and creates a Jira remediation ticket if non-compliant, then alerts the EHS team via Teams."
  tags:
    - compliance
    - environment
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: check-environmental-compliance
          description: "Given a material number, check SAP EHS compliance status, create a Jira ticket if non-compliant, and alert the EHS team."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          steps:
            - name: get-ehs-data
              type: call
              call: sap.get-ehs-compliance
              with:
                material: "{{material_number}}"
            - name: create-remediation
              type: call
              call: jira.create-issue
              with:
                project_key: "EHS"
                summary: "Environmental compliance review: Material {{material_number}}"
                description: "Status: {{get-ehs-data.compliance_status}}. Substances: {{get-ehs-data.regulated_substances}}."
                issue_type: "Task"
            - name: alert-ehs
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_ehs_channel_id"
                text: "EHS REVIEW: Material {{material_number}} — Status: {{get-ehs-data.compliance_status}}. Jira: {{create-remediation.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_EHS_COMPLIANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: compliance
          path: "/A_MaterialCompliance('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-ehs-compliance
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves maintenance order history for a given equipment number from SAP Plant Maintenance, returning order type, completion date, and work center.

naftiko: "0.5"
info:
  label: "SAP Equipment Maintenance History"
  description: "Retrieves maintenance order history for a given equipment number from SAP Plant Maintenance, returning order type, completion date, and work center."
  tags:
    - manufacturing
    - maintenance
    - sap
    - plant-maintenance
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-equipment-history
          description: "Look up maintenance history for CMC Materials equipment in SAP. Returns recent maintenance orders with type, completion date, and work center. Use for preventive maintenance planning."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "The SAP equipment number."
          call: sap.get-maintenance-orders
          with:
            equipment_number: "{{equipment_number}}"
          outputParameters:
            - name: orders
              type: array
              mapping: "$.d.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MAINTORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder?$filter=Equipment eq '{{equipment_number}}'"
          inputParameters:
            - name: equipment_number
              in: query
          operations:
            - name: get-maintenance-orders
              method: GET

Analyzes SAP freight costs for a shipping lane, compares against contracted carrier rates, creates a Jira task for logistics to renegotiate if over threshold, and posts findings to the logistics Teams channel.

naftiko: "0.5"
info:
  label: "SAP Freight Cost Optimization"
  description: "Analyzes SAP freight costs for a shipping lane, compares against contracted carrier rates, creates a Jira task for logistics to renegotiate if over threshold, and posts findings to the logistics Teams channel."
  tags:
    - logistics
    - cost-optimization
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: optimize-freight-costs
          description: "Given a shipping lane, analyze SAP freight costs vs contracts, create a Jira task if over threshold, and alert logistics."
          inputParameters:
            - name: shipping_lane
              in: body
              type: string
              description: "The shipping lane identifier."
            - name: period
              in: body
              type: string
              description: "The analysis period."
          steps:
            - name: get-freight-data
              type: call
              call: sap.get-freight-costs
              with:
                lane: "{{shipping_lane}}"
                period: "{{period}}"
            - name: create-renegotiation-task
              type: call
              call: jira.create-issue
              with:
                project_key: "LOG"
                summary: "Freight cost review: {{shipping_lane}} — {{period}}"
                description: "Actual: ${{get-freight-data.actual_cost}}, Contract: ${{get-freight-data.contract_rate}}, Variance: {{get-freight-data.variance_pct}}%."
                issue_type: "Task"
            - name: post-findings
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                text: "FREIGHT COST: {{shipping_lane}} ({{period}}) — Actual: ${{get-freight-data.actual_cost}} vs Contract: ${{get-freight-data.contract_rate}} (+{{get-freight-data.variance_pct}}%). Jira: {{create-renegotiation-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: freight
          path: "/FreightCostAnalysis?lane={{lane}}&period={{period}}"
          inputParameters:
            - name: lane
              in: query
            - name: period
              in: query
          operations:
            - name: get-freight-costs
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves general ledger account balance from SAP S/4HANA for a given company code, fiscal year, and GL account, returning debit total, credit total, and closing balance.

naftiko: "0.5"
info:
  label: "SAP General Ledger Balance Lookup"
  description: "Retrieves general ledger account balance from SAP S/4HANA for a given company code, fiscal year, and GL account, returning debit total, credit total, and closing balance."
  tags:
    - finance
    - accounting
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up a general ledger account balance in SAP S/4HANA. Returns debit total, credit total, and closing balance. Use for financial reporting and account reconciliation."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code, e.g. 1000."
            - name: gl_account
              in: body
              type: string
              description: "The general ledger account number."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year, e.g. 2025."
          call: sap.get-gl-balance
          with:
            company_code: "{{company_code}}"
            gl_account: "{{gl_account}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: debit_total
              type: string
              mapping: "$.d.DebitAmountInCompanyCodeCurrency"
            - name: credit_total
              type: string
              mapping: "$.d.CreditAmountInCompanyCodeCurrency"
            - name: closing_balance
              type: string
              mapping: "$.d.EndingBalanceAmtInCoCodeCrcy"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance(CompanyCode='{{company_code}}',GLAccount='{{gl_account}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: gl_account
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-gl-balance
              method: GET

Posts a goods receipt in SAP S/4HANA for a delivered purchase order and notifies the procurement and warehouse teams 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 and warehouse teams 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 and notify the procurement team via Teams with the material document number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number for the delivery."
            - name: quantity
              in: body
              type: number
              description: "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://cmc-materials-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

Validates hazardous material shipment documentation in SAP against DOT/IATA regulations, creates a ServiceNow compliance task if gaps exist, and notifies the EHS team via Teams.

naftiko: "0.5"
info:
  label: "SAP Hazardous Material Shipment Compliance"
  description: "Validates hazardous material shipment documentation in SAP against DOT/IATA regulations, creates a ServiceNow compliance task if gaps exist, and notifies the EHS team via Teams."
  tags:
    - compliance
    - logistics
    - hazmat
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: validate-hazmat-shipment
          description: "Given an SAP delivery number for hazmat, validate documentation, create compliance task if needed, and notify EHS."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          steps:
            - name: get-shipment
              type: call
              call: sap.get-hazmat-delivery
              with:
                delivery: "{{delivery_number}}"
            - name: create-compliance-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Hazmat compliance: Delivery {{delivery_number}}"
                description: "Material: {{get-shipment.material}}, UN Number: {{get-shipment.un_number}}, Class: {{get-shipment.hazard_class}}"
            - name: notify-ehs
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_ehs_channel_id"
                text: "HAZMAT SHIPMENT: Delivery {{delivery_number}} — Material: {{get-shipment.material}}, UN: {{get-shipment.un_number}}, Class: {{get-shipment.hazard_class}}. Task: {{create-compliance-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery}}')/HazmatData"
          inputParameters:
            - name: delivery
              in: path
          operations:
            - name: get-hazmat-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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: create-task
              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

Reconciles intercompany billing between SAP company codes, flags discrepancies, creates Jira tasks for the accounting team, and posts the reconciliation summary to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing between SAP company codes, flags discrepancies, creates Jira tasks for the accounting team, and posts the reconciliation summary to the finance Teams channel."
  tags:
    - finance
    - intercompany
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: reconcile-intercompany
          description: "Given two SAP company codes and a period, reconcile intercompany billings, flag discrepancies, and alert finance."
          inputParameters:
            - name: company_code_1
              in: body
              type: string
              description: "The first SAP company code."
            - name: company_code_2
              in: body
              type: string
              description: "The second SAP company code."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period, e.g. 2025-12."
          steps:
            - name: get-billings
              type: call
              call: sap.get-intercompany-billings
              with:
                code1: "{{company_code_1}}"
                code2: "{{company_code_2}}"
                period: "{{fiscal_period}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "FIN"
                summary: "IC Reconciliation: {{company_code_1}} vs {{company_code_2}} — {{fiscal_period}}"
                description: "Discrepancy: ${{get-billings.discrepancy_amount}}. Items: {{get-billings.discrepancy_count}}."
                issue_type: "Task"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "IC RECONCILIATION: {{company_code_1}} vs {{company_code_2}} ({{fiscal_period}}) — Discrepancy: ${{get-billings.discrepancy_amount}}. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: intercompany
          path: "/A_BillingDocument?$filter=CompanyCode eq '{{code1}}' and IntercompanyPartner eq '{{code2}}'"
          inputParameters:
            - name: code1
              in: query
            - name: code2
              in: query
            - name: period
              in: query
          operations:
            - name: get-intercompany-billings
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries SAP S/4HANA for current stock levels of a given material at a specific plant, returning available quantity, reserved quantity, and unit of measure.

naftiko: "0.5"
info:
  label: "SAP Inventory Stock Level Check"
  description: "Queries SAP S/4HANA for current stock levels of a given material at a specific plant, returning available quantity, reserved quantity, and unit of measure."
  tags:
    - supply-chain
    - inventory
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-inventory-stock
          description: "Look up current stock levels for a material at a CMC Materials plant. Returns available quantity, reserved quantity, and unit of measure. Use for inventory planning and material availability checks."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number, e.g. 000000001234."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code, e.g. 1000."
          call: sap.get-stock
          with:
            material_number: "{{material_number}}"
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: available_quantity
              type: string
              mapping: "$.d.AvailableStock"
            - name: reserved_quantity
              type: string
              mapping: "$.d.ReservedStock"
            - name: unit_of_measure
              type: string
              mapping: "$.d.BaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant_code}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant_code
              in: path
          operations:
            - name: get-stock
              method: GET

Verifies an SAP vendor invoice against the purchase order and goods receipt, flags discrepancies, and posts match results to the accounts payable Teams channel.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Verification"
  description: "Verifies an SAP vendor invoice against the purchase order and goods receipt, flags discrepancies, and posts match results to the accounts payable Teams channel."
  tags:
    - finance
    - accounts-payable
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: verify-invoice-match
          description: "Given an SAP invoice document number, perform three-way match against PO and goods receipt, and post results to the AP Teams channel."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice-details
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: sap.get-purchase-order
              with:
                po_number: "{{get-invoice.po_reference}}"
            - name: post-results
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_ap_channel_id"
                text: "Invoice {{invoice_number}}: PO {{get-invoice.po_reference}} — Invoice amt: {{get-invoice.amount}}, PO amt: {{get-po.total_value}}, Status: {{get-invoice.match_status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice-details
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              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

Generates preventive maintenance work orders in SAP based on equipment runtime data from Datadog IoT metrics, and posts the weekly schedule to the maintenance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Maintenance Preventive Schedule Generator"
  description: "Generates preventive maintenance work orders in SAP based on equipment runtime data from Datadog IoT metrics, and posts the weekly schedule to the maintenance Teams channel."
  tags:
    - manufacturing
    - preventive-maintenance
    - sap
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: generate-pm-schedule
          description: "Given a plant code, pull equipment runtime from Datadog, create SAP preventive maintenance orders, and post the schedule to Teams."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
          steps:
            - name: get-runtime-metrics
              type: call
              call: datadog.get-iot-metrics
              with:
                plant: "{{plant_code}}"
            - name: create-work-orders
              type: call
              call: sap.create-pm-orders
              with:
                plant: "{{plant_code}}"
                equipment_list: "{{get-runtime-metrics.due_equipment}}"
            - name: post-schedule
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_maintenance_channel_id"
                text: "PM SCHEDULE: Plant {{plant_code}} — {{create-work-orders.order_count}} work orders created for {{get-runtime-metrics.due_count}} equipment items."
  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: iot-metrics
          path: "/query"
          operations:
            - name: get-iot-metrics
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MAINTORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-pm-orders
              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

Retrieves material master data from SAP S/4HANA by material number, returning description, base unit of measure, material group, and plant-level stock for supply chain and procurement use.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, returning description, base unit of measure, material group, and plant-level stock for supply chain and procurement use."
  tags:
    - supply-chain
    - sap
    - inventory
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: material-mgmt
      port: 8080
      tools:
        - name: get-material-master
          description: "Look up a SAP material master record by material number. Returns description, base unit of measure, material group, and plant stock level. Use for supply chain planning, procurement, or production scheduling."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number (MATNR), e.g. 1000456789."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.Material_Desc"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

When a material standard price change is submitted in SAP, validates the change, updates the Salesforce price book, and notifies the finance team via Teams for approval tracking.

naftiko: "0.5"
info:
  label: "SAP Material Price Change Workflow"
  description: "When a material standard price change is submitted in SAP, validates the change, updates the Salesforce price book, and notifies the finance team via Teams for approval tracking."
  tags:
    - finance
    - pricing
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: process-price-change
          description: "Given a material number and new price, validate in SAP, update the Salesforce price book, and notify finance in Teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: new_price
              in: body
              type: string
              description: "The new standard price."
            - name: effective_date
              in: body
              type: string
              description: "The effective date."
          steps:
            - name: get-current-price
              type: call
              call: sap.get-material-price
              with:
                material: "{{material_number}}"
            - name: update-pricebook
              type: call
              call: salesforce.update-pricebook-entry
              with:
                material: "{{material_number}}"
                price: "{{new_price}}"
                effective_date: "{{effective_date}}"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "PRICE CHANGE: Material {{material_number}} — Old: ${{get-current-price.standard_price}}, New: ${{new_price}}, Effective: {{effective_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_VALUATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-valuation
          path: "/A_MaterialValuation('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material-price
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pricebook
          path: "/sobjects/PricebookEntry"
          operations:
            - name: update-pricebook-entry
              method: PATCH
    - 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

Detects materials below safety stock in SAP, creates a purchase requisition for replenishment, and alerts the supply chain team via Microsoft Teams with shortage details.

naftiko: "0.5"
info:
  label: "SAP Material Shortage Alert"
  description: "Detects materials below safety stock in SAP, creates a purchase requisition for replenishment, and alerts the supply chain team via Microsoft Teams with shortage details."
  tags:
    - supply-chain
    - inventory
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: handle-material-shortage
          description: "Given a material number below safety stock, create an SAP purchase requisition and alert the supply chain team in Teams."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: get-stock
              type: call
              call: sap.get-material-stock
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: create-pr
              type: call
              call: sap.create-purchase-requisition
              with:
                material: "{{material_number}}"
                plant: "{{plant_code}}"
                quantity: "{{get-stock.reorder_quantity}}"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_supply_chain_channel_id"
                text: "SHORTAGE: Material {{material_number}} at Plant {{plant_code}} — Current: {{get-stock.available}}, Safety: {{get-stock.safety_stock}}. PR {{create-pr.pr_number}} created."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET
        - name: purchase-requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              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 a SAP PM corrective maintenance work order for a reported equipment failure, assigns it to the maintenance team, and notifies supervisors via Teams.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Creation"
  description: "Creates a SAP PM corrective maintenance work order for a reported equipment failure, assigns it to the maintenance team, and notifies supervisors via Teams."
  tags:
    - manufacturing
    - sap
    - maintenance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-maintenance-work-order
          description: "Given an equipment ID and failure description, create a SAP PM corrective maintenance work order and notify the maintenance team supervisor via Teams. Use for unplanned equipment breakdown response."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "SAP equipment number where the failure was reported."
            - name: failure_description
              in: body
              type: string
              description: "Description of the equipment failure or maintenance required."
            - name: priority
              in: body
              type: string
              description: "Work order priority: 1 (Very High), 2 (High), 3 (Medium), or 4 (Low)."
          steps:
            - name: create-work-order
              type: call
              call: sap.create-pm-work-order
              with:
                equipment_id: "{{equipment_id}}"
                description: "{{failure_description}}"
                priority: "{{priority}}"
            - name: notify-maintenance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_maintenance_channel_id"
                text: "Maintenance Work Order {{create-work-order.work_order_number}} created for equipment {{equipment_id}} (Priority: {{priority}}): {{failure_description}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-pm-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Validates an SAP process order recipe against the material master BOM, flags deviations, creates a Jira ticket for the process engineering team, and notifies via Teams.

naftiko: "0.5"
info:
  label: "SAP Process Order Recipe Validation"
  description: "Validates an SAP process order recipe against the material master BOM, flags deviations, creates a Jira ticket for the process engineering team, and notifies via Teams."
  tags:
    - manufacturing
    - process-engineering
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: validate-recipe
          description: "Given an SAP process order number, validate the recipe against the master BOM, create a Jira task for deviations, and notify process engineering."
          inputParameters:
            - name: process_order
              in: body
              type: string
              description: "The SAP process order number."
          steps:
            - name: get-recipe
              type: call
              call: sap.get-process-order-recipe
              with:
                order_number: "{{process_order}}"
            - name: get-bom
              type: call
              call: sap.get-material-bom
              with:
                material: "{{get-recipe.material}}"
            - name: create-deviation-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "PROC"
                summary: "Recipe validation: Process order {{process_order}}"
                description: "Material: {{get-recipe.material}}. Deviations: {{get-recipe.deviation_count}}."
                issue_type: "Task"
            - name: notify-engineering
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_process_eng_channel_id"
                text: "RECIPE VALIDATION: Order {{process_order}} — {{get-recipe.deviation_count}} deviations from BOM. Jira: {{create-deviation-ticket.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PROCESS_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: process-orders
          path: "/A_ProcessOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-process-order-recipe
              method: GET
        - name: bom
          path: "/A_MaterialBOM('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material-bom
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP S/4HANA production order by order number, returning status, scheduled dates, and material quantities for manufacturing operations visibility.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Check"
  description: "Retrieves a SAP S/4HANA production order by order number, returning status, scheduled dates, and material quantities for manufacturing operations visibility."
  tags:
    - manufacturing
    - sap
    - production
    - erp
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order by order number. Returns order status, scheduled start/finish dates, material number, and confirmed quantity. Use for manufacturing operations tracking and scheduling."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number, e.g. 1000045678."
          call: sap.get-production-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: scheduled_start
              type: string
              mapping: "$.d.MfgOrderPlannedStartDate"
            - name: confirmed_qty
              type: string
              mapping: "$.d.ConfirmedYieldQuantity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Analyzes scrap rates for a production line in SAP, compares to targets, creates a Jira improvement task if above threshold, and posts the analysis to the manufacturing Teams channel.

naftiko: "0.5"
info:
  label: "SAP Production Scrap Analysis"
  description: "Analyzes scrap rates for a production line in SAP, compares to targets, creates a Jira improvement task if above threshold, and posts the analysis to the manufacturing Teams channel."
  tags:
    - manufacturing
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: analyze-production-scrap
          description: "Given a work center and date range, analyze SAP scrap rates, create a Jira task if above target, and post results to Teams."
          inputParameters:
            - name: work_center
              in: body
              type: string
              description: "The SAP work center."
            - name: period
              in: body
              type: string
              description: "The analysis period, e.g. 2025-Q4."
          steps:
            - name: get-scrap-data
              type: call
              call: sap.get-scrap-report
              with:
                work_center: "{{work_center}}"
                period: "{{period}}"
            - name: create-improvement
              type: call
              call: jira.create-issue
              with:
                project_key: "MFG"
                summary: "Scrap reduction: {{work_center}} — {{period}}"
                description: "Scrap rate: {{get-scrap-data.scrap_rate}}%. Target: {{get-scrap-data.target_rate}}%. Top defect: {{get-scrap-data.top_defect}}."
                issue_type: "Task"
            - name: post-analysis
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_manufacturing_channel_id"
                text: "SCRAP ANALYSIS: {{work_center}} {{period}} — Rate: {{get-scrap-data.scrap_rate}}% (Target: {{get-scrap-data.target_rate}}%). Jira: {{create-improvement.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: scrap-report
          path: "/ScrapReport?workCenter={{work_center}}&period={{period}}"
          inputParameters:
            - name: work_center
              in: query
            - name: period
              in: query
          operations:
            - name: get-scrap-report
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and currency for procurement tracking.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and currency 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 CMC Materials 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. 4500002345."
          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://cmc-materials-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

Converts an approved SAP purchase requisition into a purchase order, notifies the requesting cost center manager via Microsoft Teams, and logs the conversion in ServiceNow for audit tracking.

naftiko: "0.5"
info:
  label: "SAP Purchase Requisition to Order Conversion"
  description: "Converts an approved SAP purchase requisition into a purchase order, notifies the requesting cost center manager via Microsoft Teams, and logs the conversion in ServiceNow for audit tracking."
  tags:
    - procurement
    - sap
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: convert-pr-to-po
          description: "Given an approved SAP purchase requisition number, create a purchase order, notify the cost center manager in Teams, and log the audit trail in ServiceNow."
          inputParameters:
            - name: pr_number
              in: body
              type: string
              description: "The SAP purchase requisition number."
          steps:
            - name: get-requisition
              type: call
              call: sap.get-purchase-requisition
              with:
                pr_number: "{{pr_number}}"
            - name: create-po
              type: call
              call: sap.create-purchase-order
              with:
                vendor: "{{get-requisition.vendor}}"
                material: "{{get-requisition.material}}"
                quantity: "{{get-requisition.quantity}}"
                plant: "{{get-requisition.plant}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "PO {{create-po.po_number}} created from PR {{pr_number}} for {{get-requisition.material}} — Vendor: {{get-requisition.vendor}}"
            - name: log-audit
              type: call
              call: servicenow.create-record
              with:
                table: "u_procurement_audit"
                pr_number: "{{pr_number}}"
                po_number: "{{create-po.po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-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-requisitions
          path: "/A_PurchaseRequisition('{{pr_number}}')"
          inputParameters:
            - name: pr_number
              in: path
          operations:
            - name: get-purchase-requisition
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder"
          operations:
            - name: create-purchase-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audit-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Records an incoming goods quality inspection result in SAP S/4HANA, updates inspection lot status, and notifies the quality team via Teams with pass/fail outcome.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Result Recording"
  description: "Records an incoming goods quality inspection result in SAP S/4HANA, updates inspection lot status, and notifies the quality team via Teams with pass/fail outcome."
  tags:
    - manufacturing
    - quality
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: record-inspection-result
          description: "Given a SAP inspection lot number and result (pass/fail), record the quality inspection outcome in SAP and notify the quality team via Teams. Use for incoming goods or in-process quality control workflows."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number, e.g. 3000012345."
            - name: result
              in: body
              type: string
              description: "Inspection result: pass or fail."
            - name: defect_description
              in: body
              type: string
              description: "Optional description of defects found. Leave empty for pass results."
          steps:
            - name: post-result
              type: call
              call: sap.post-inspection-result
              with:
                inspection_lot: "{{inspection_lot}}"
                usage_decision: "{{result}}"
                defect_text: "{{defect_description}}"
            - name: notify-quality-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_quality_channel_id"
                text: "Quality inspection {{inspection_lot}} recorded: {{result}}. Usage decision: {{post-result.usage_decision_code}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{inspection_lot}}')"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: post-inspection-result
              method: PATCH
    - 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

Collects SAP financial data for regulatory filings, validates completeness in ServiceNow, and posts the preparation status to the compliance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Regulatory Reporting Preparation"
  description: "Collects SAP financial data for regulatory filings, validates completeness in ServiceNow, and posts the preparation status to the compliance Teams channel."
  tags:
    - finance
    - compliance
    - regulatory
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: prepare-regulatory-report
          description: "Given a reporting period and regulation type, collect SAP financial data, validate in ServiceNow, and post status to the compliance team."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The reporting period."
            - name: regulation
              in: body
              type: string
              description: "The regulation type, e.g. SOX, SEC."
          steps:
            - name: collect-data
              type: call
              call: sap.get-regulatory-data
              with:
                period: "{{period}}"
                regulation: "{{regulation}}"
            - name: create-checklist
              type: call
              call: servicenow.create-checklist
              with:
                type: "{{regulation}}"
                period: "{{period}}"
                data_points: "{{collect-data.data_point_count}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_compliance_channel_id"
                text: "REGULATORY PREP: {{regulation}} for {{period}} — {{collect-data.data_point_count}} data points collected. Checklist: {{create-checklist.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: regulatory
          path: "/RegulatoryReportData"
          operations:
            - name: get-regulatory-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: checklists
          path: "/table/u_compliance_checklist"
          operations:
            - name: create-checklist
              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

Retrieves a SAP S/4HANA sales order by number and returns order status, customer name, net value, and delivery date for customer service inquiries.

naftiko: "0.5"
info:
  label: "SAP Sales Order Lookup"
  description: "Retrieves a SAP S/4HANA sales order by number and returns order status, customer name, net value, and delivery date for customer service inquiries."
  tags:
    - sales
    - order-management
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-sales-order
          description: "Look up a CMC Materials SAP S/4HANA sales order by order number. Returns status, customer name, net value, and delivery date. Use for customer inquiries and order tracking."
          inputParameters:
            - name: sales_order_number
              in: body
              type: string
              description: "The SAP sales order number, e.g. 0000012345."
          call: sap.get-sales-order
          with:
            sales_order_number: "{{sales_order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallSDProcessStatus"
            - name: customer_name
              type: string
              mapping: "$.d.SoldToPartyName"
            - name: net_value
              type: string
              mapping: "$.d.TotalNetAmount"
            - name: delivery_date
              type: string
              mapping: "$.d.RequestedDeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{sales_order_number}}')"
          inputParameters:
            - name: sales_order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET

Retrieves supplier evaluation scores from SAP S/4HANA by vendor number, returning overall score, quality rating, delivery rating, and price rating for procurement reviews.

naftiko: "0.5"
info:
  label: "SAP Supplier Evaluation Score Lookup"
  description: "Retrieves supplier evaluation scores from SAP S/4HANA by vendor number, returning overall score, quality rating, delivery rating, and price rating for procurement reviews."
  tags:
    - procurement
    - supplier-management
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-supplier-score
          description: "Look up supplier evaluation scores in SAP S/4HANA for a CMC Materials vendor. Returns overall score, quality, delivery, and price ratings. Use for supplier reviews and procurement decisions."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: sap.get-supplier-eval
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: overall_score
              type: string
              mapping: "$.d.OverallScore"
            - name: quality_rating
              type: string
              mapping: "$.d.QualityScore"
            - name: delivery_rating
              type: string
              mapping: "$.d.DeliveryScore"
            - name: price_rating
              type: string
              mapping: "$.d.PriceScore"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_EVALUATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-evaluations
          path: "/A_SupplierEvaluation('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-supplier-eval
              method: GET

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

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves supplier master data from SAP S/4HANA by vendor ID, returning payment terms, currency, and bank verification status for procurement use."
  tags:
    - procurement
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-mgmt
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up a SAP vendor/supplier record by vendor ID. Returns company name, payment terms, currency, and bank verification status. Use for supplier onboarding or payment processing."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor ID, e.g. 1000055."
          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://cmc-materials-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

Orchestrates new vendor onboarding by creating the vendor master in SAP, setting up the vendor in Salesforce as an account, and notifying the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Vendor Onboarding Orchestrator"
  description: "Orchestrates new vendor onboarding by creating the vendor master in SAP, setting up the vendor in Salesforce as an account, and notifying the procurement team via Microsoft Teams."
  tags:
    - procurement
    - vendor-management
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create the vendor master in SAP S/4HANA, a Salesforce account, and notify procurement in Teams."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "The vendor company name."
            - name: vendor_country
              in: body
              type: string
              description: "The vendor country code."
            - name: payment_terms
              in: body
              type: string
              description: "Payment terms code, e.g. NET30."
          steps:
            - name: create-vendor-master
              type: call
              call: sap.create-vendor
              with:
                name: "{{vendor_name}}"
                country: "{{vendor_country}}"
                payment_terms: "{{payment_terms}}"
            - name: create-sf-account
              type: call
              call: salesforce.create-account
              with:
                name: "{{vendor_name}}"
                type: "Vendor"
                sap_vendor_number: "{{create-vendor-master.vendor_number}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "NEW VENDOR: {{vendor_name}} — SAP Vendor # {{create-vendor-master.vendor_number}}, SF Account: {{create-sf-account.account_id}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              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 SAP warehouse storage utilization, identifies bins nearing capacity, creates Jira tasks for warehouse reorganization, and posts utilization alerts to the logistics Teams channel.

naftiko: "0.5"
info:
  label: "SAP Warehouse Capacity Monitoring"
  description: "Monitors SAP warehouse storage utilization, identifies bins nearing capacity, creates Jira tasks for warehouse reorganization, and posts utilization alerts to the logistics Teams channel."
  tags:
    - logistics
    - warehouse
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: monitor-warehouse-capacity
          description: "Given a warehouse number, check SAP bin utilization, create Jira reorganization tasks, and alert logistics."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "The SAP warehouse number."
          steps:
            - name: get-utilization
              type: call
              call: sap.get-warehouse-utilization
              with:
                warehouse: "{{warehouse}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "LOG"
                summary: "Warehouse capacity: {{warehouse}} at {{get-utilization.utilization_pct}}%"
                description: "Total bins: {{get-utilization.total_bins}}, Used: {{get-utilization.used_bins}}, Critical zones: {{get-utilization.critical_zones}}"
                issue_type: "Task"
            - name: alert-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                text: "WAREHOUSE: {{warehouse}} at {{get-utilization.utilization_pct}}% capacity — {{get-utilization.critical_zones}} critical zones. Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: utilization
          path: "/WarehouseUtilization('{{warehouse}}')"
          inputParameters:
            - name: warehouse
              in: path
          operations:
            - name: get-warehouse-utilization
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates an SAP warehouse transfer order between plants, updates inventory tracking in Salesforce, and notifies the logistics team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Transfer Order Workflow"
  description: "Creates an SAP warehouse transfer order between plants, updates inventory tracking in Salesforce, and notifies the logistics team via Microsoft Teams."
  tags:
    - logistics
    - warehouse
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: create-transfer-order
          description: "Given material, source plant, and destination plant, create an SAP transfer order, update Salesforce inventory, and notify logistics."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material number to transfer."
            - name: source_plant
              in: body
              type: string
              description: "The source plant code."
            - name: destination_plant
              in: body
              type: string
              description: "The destination plant code."
            - name: quantity
              in: body
              type: string
              description: "The transfer quantity."
          steps:
            - name: create-sto
              type: call
              call: sap.create-stock-transfer
              with:
                material: "{{material_number}}"
                source: "{{source_plant}}"
                destination: "{{destination_plant}}"
                quantity: "{{quantity}}"
            - name: update-sf-inventory
              type: call
              call: salesforce.update-inventory
              with:
                material: "{{material_number}}"
                plant: "{{destination_plant}}"
                pending_quantity: "{{quantity}}"
            - name: notify-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_logistics_channel_id"
                text: "TRANSFER: {{quantity}} of {{material_number}} from Plant {{source_plant}} to Plant {{destination_plant}} — STO {{create-sto.order_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_STOCK_TRANSFER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock-transfers
          path: "/A_StockTransferOrder"
          operations:
            - name: create-stock-transfer
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: inventory
          path: "/sobjects/Inventory__c"
          operations:
            - name: update-inventory
              method: PATCH
    - 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

Analyzes production yield data from SAP for a given production line, compares against historical benchmarks in Power BI, and posts optimization recommendations to the manufacturing Teams channel.

naftiko: "0.5"
info:
  label: "SAP Yield Optimization Analysis"
  description: "Analyzes production yield data from SAP for a given production line, compares against historical benchmarks in Power BI, and posts optimization recommendations to the manufacturing Teams channel."
  tags:
    - manufacturing
    - yield
    - sap
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: analyze-yield
          description: "Given a production line and period, analyze SAP yield data, refresh Power BI benchmarks, and post recommendations to Teams."
          inputParameters:
            - name: production_line
              in: body
              type: string
              description: "The production line identifier."
            - name: period
              in: body
              type: string
              description: "The analysis period."
          steps:
            - name: get-yield-data
              type: call
              call: sap.get-yield-report
              with:
                line: "{{production_line}}"
                period: "{{period}}"
            - name: refresh-benchmarks
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_yield_dataset_id"
            - name: post-analysis
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_manufacturing_channel_id"
                text: "YIELD ANALYSIS: Line {{production_line}} ({{period}}) — Yield: {{get-yield-data.yield_pct}}% (Target: {{get-yield-data.target_pct}}%). Top loss: {{get-yield-data.top_loss_category}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: yield
          path: "/YieldReport?line={{line}}&period={{period}}"
          inputParameters:
            - name: line
              in: query
            - name: period
              in: query
          operations:
            - name: get-yield-report
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Pulls user access data from ServiceNow and Workday, compares against role-based access policies, creates Jira tickets for access violations, and reports findings to the security Teams channel.

naftiko: "0.5"
info:
  label: "Security Access Review Orchestrator"
  description: "Pulls user access data from ServiceNow and Workday, compares against role-based access policies, creates Jira tickets for access violations, and reports findings to the security Teams channel."
  tags:
    - security
    - access-management
    - servicenow
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: run-access-review
          description: "Given a department or role, pull access data from ServiceNow and Workday, flag violations, create Jira tickets, and report to the security team."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to review."
          steps:
            - name: get-access-data
              type: call
              call: servicenow.get-user-access
              with:
                department: "{{department}}"
            - name: get-workday-roles
              type: call
              call: workday.get-department-roles
              with:
                department: "{{department}}"
            - name: create-violations
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Access review: {{department}} — {{get-access-data.violation_count}} violations found"
                description: "Review period access data for {{department}}. Violations: {{get-access-data.violations}}"
                issue_type: "Task"
            - name: report-findings
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "ACCESS REVIEW: {{department}} — {{get-access-data.user_count}} users, {{get-access-data.violation_count}} violations. Jira: {{create-violations.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: user-access
          path: "/table/sys_user_grmember?sysparm_query=group.nameLIKE{{department}}"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-user-access
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: departments
          path: "/workers?department={{department}}"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-department-roles
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-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 manufacturing system change and notify the requester via Teams. 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: "Change request {{create-cr.number}} submitted and pending CAB approval."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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

Evaluates a ServiceNow change request by pulling Datadog service dependency data, assessing blast radius, and posting the risk assessment to the CAB Teams channel for approval.

naftiko: "0.5"
info:
  label: "ServiceNow Change Risk Assessment"
  description: "Evaluates a ServiceNow change request by pulling Datadog service dependency data, assessing blast radius, and posting the risk assessment to the CAB Teams channel for approval."
  tags:
    - itsm
    - change-management
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: assess-change-risk
          description: "Given a ServiceNow change request number, pull service dependencies from Datadog, assess risk, and post to the CAB Teams channel."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: get-change
              type: call
              call: servicenow.get-change
              with:
                change_number: "{{change_number}}"
            - name: get-dependencies
              type: call
              call: datadog.get-service-dependencies
              with:
                service: "{{get-change.cmdb_ci}}"
            - name: post-assessment
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_cab_channel_id"
                text: "CHANGE RISK: {{change_number}} — Service: {{get-change.cmdb_ci}}, Dependencies: {{get-dependencies.count}}, Risk: {{get-change.risk}}. Scheduled: {{get-change.start_date}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=number={{change_number}}"
          inputParameters:
            - name: change_number
              in: query
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: service-map
          path: "/services/{{service}}/dependencies"
          inputParameters:
            - name: service
              in: path
          operations:
            - name: get-service-dependencies
              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 an IT incident from ServiceNow by incident number and returns state, priority, assigned group, and short description for help desk inquiries.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves an IT incident from ServiceNow by incident number and returns state, priority, assigned group, and short description for help desk inquiries."
  tags:
    - itsm
    - support
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Look up a CMC Materials ServiceNow incident by number. Returns state, priority, assigned group, and short description. Use for help desk inquiries and incident tracking."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Tracks IT asset lifecycle stages in ServiceNow, creates procurement requests in SAP for end-of-life replacements, and notifies IT operations via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow IT Asset Lifecycle Management"
  description: "Tracks IT asset lifecycle stages in ServiceNow, creates procurement requests in SAP for end-of-life replacements, and notifies IT operations via Teams."
  tags:
    - it-ops
    - asset-management
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: manage-asset-lifecycle
          description: "Given a ServiceNow asset tag nearing end-of-life, create an SAP replacement requisition and notify IT ops."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The ServiceNow asset tag."
          steps:
            - name: get-asset
              type: call
              call: servicenow.get-asset
              with:
                asset_tag: "{{asset_tag}}"
            - name: create-replacement
              type: call
              call: sap.create-purchase-requisition
              with:
                material: "{{get-asset.model_category}}"
                description: "Replacement for {{asset_tag}} — {{get-asset.display_name}}"
            - name: notify-it
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "ASSET EOL: {{asset_tag}} ({{get-asset.display_name}}) — EOL: {{get-asset.end_of_life_date}}. Replacement PR: {{create-replacement.pr_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/alm_hardware?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-asset
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-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: requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              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

Searches the ServiceNow knowledge base for articles matching a query string and returns article titles, numbers, and view counts for IT self-service.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches the ServiceNow knowledge base for articles matching a query string and returns article titles, numbers, and view counts for IT self-service."
  tags:
    - itsm
    - knowledge-management
    - servicenow
    - self-service
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: search-knowledge-articles
          description: "Search the CMC Materials ServiceNow knowledge base by keyword. Returns matching article titles, numbers, and view counts. Use for IT self-service and knowledge discovery."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query for knowledge articles."
          call: servicenow.search-kb
          with:
            query: "{{query}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: knowledge
          path: "/table/kb_knowledge?sysparm_query=short_descriptionLIKE{{query}}"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-kb
              method: GET

When a P1 ServiceNow incident is escalated to major, creates a Teams meeting for the incident bridge, updates the incident with bridge details, and notifies the SRE on-call team.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge Setup"
  description: "When a P1 ServiceNow incident is escalated to major, creates a Teams meeting for the incident bridge, updates the incident with bridge details, and notifies the SRE on-call team."
  tags:
    - itsm
    - incident-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: setup-major-incident-bridge
          description: "Given a ServiceNow P1 incident number, create a Teams bridge meeting, update the incident record, and notify the SRE on-call team."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: create-bridge
              type: call
              call: msteams.create-meeting
              with:
                subject: "Major Incident Bridge: {{incident_number}} — {{get-incident.short_description}}"
            - name: update-incident
              type: call
              call: servicenow.update-incident
              with:
                incident_number: "{{incident_number}}"
                bridge_url: "{{create-bridge.join_url}}"
            - name: notify-oncall
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_oncall_channel_id"
                text: "MAJOR INCIDENT: {{incident_number}} — {{get-incident.short_description}}. Bridge: {{create-bridge.join_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: meetings
          path: "/me/onlineMeetings"
          operations:
            - name: create-meeting
              method: POST
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When recurring incidents are detected in ServiceNow, creates a problem record, links related incidents, creates a Jira root cause analysis task, and notifies the engineering team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Problem Management Workflow"
  description: "When recurring incidents are detected in ServiceNow, creates a problem record, links related incidents, creates a Jira root cause analysis task, and notifies the engineering team via Teams."
  tags:
    - itsm
    - problem-management
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: create-problem-from-incidents
          description: "Given a set of related ServiceNow incidents, create a problem record, a Jira RCA task, and notify engineering."
          inputParameters:
            - name: incident_numbers
              in: body
              type: string
              description: "Comma-separated list of related incident numbers."
            - name: category
              in: body
              type: string
              description: "The problem category."
          steps:
            - name: create-problem
              type: call
              call: servicenow.create-problem
              with:
                incidents: "{{incident_numbers}}"
                category: "{{category}}"
            - name: create-rca-task
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                summary: "RCA: {{category}} — Problem {{create-problem.number}}"
                description: "Related incidents: {{incident_numbers}}"
                issue_type: "Task"
            - name: notify-engineering
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "PROBLEM: {{create-problem.number}} ({{category}}) — {{incident_numbers}}. RCA: {{create-rca-task.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://cmc-materials.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Detects ServiceNow incidents approaching SLA breach, escalates to the next tier, creates a Datadog event for correlation, and alerts the service desk manager via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "Detects ServiceNow incidents approaching SLA breach, escalates to the next tier, creates a Datadog event for correlation, and alerts the service desk manager via Teams."
  tags:
    - itsm
    - sla-management
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a ServiceNow incident approaching SLA breach, escalate, create a Datadog event, and alert the service desk manager."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: escalate
              type: call
              call: servicenow.escalate-incident
              with:
                incident_number: "{{incident_number}}"
                new_tier: "Tier 2"
            - name: create-event
              type: call
              call: datadog.create-event
              with:
                title: "SLA Breach Warning: {{incident_number}}"
                text: "{{get-incident.short_description}} — SLA remaining: {{get-incident.sla_remaining}}"
                alert_type: "warning"
            - name: alert-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_service_desk_channel_id"
                text: "SLA BREACH: {{incident_number}} — {{get-incident.short_description}}. Escalated to Tier 2. SLA remaining: {{get-incident.sla_remaining}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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
            - name: escalate-incident
              method: PATCH
    - 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

When a SAP inbound delivery is overdue, retrieves the delivery details, creates a Salesforce case for supplier follow-up, and posts an escalation alert to the supply chain Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Supplier Delivery Delay Escalation"
  description: "When a SAP inbound delivery is overdue, retrieves the delivery details, creates a Salesforce case for supplier follow-up, and posts an escalation alert to the supply chain Microsoft Teams channel."
  tags:
    - supply-chain
    - procurement
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: escalate-delivery-delay
          description: "Given an overdue SAP inbound delivery number, retrieve details, create a Salesforce supplier case, and alert the supply chain team in Teams."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP inbound delivery number."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-inbound-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Delivery delay: {{delivery_number}} from {{get-delivery.vendor_name}}"
                description: "Expected date: {{get-delivery.planned_date}}. Material: {{get-delivery.material}}."
                priority: "High"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_supply_chain_channel_id"
                text: "DELIVERY DELAY: {{delivery_number}} from {{get-delivery.vendor_name}} — Case {{create-case.case_number}} opened."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_INBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inbound-deliveries
          path: "/A_InbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-inbound-delivery
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Workday for employees who have not completed benefits enrollment during open enrollment, sends personalized reminders via Microsoft Teams, and logs the outreach in ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for employees who have not completed benefits enrollment during open enrollment, sends personalized reminders via Microsoft Teams, and logs the outreach in ServiceNow."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Query Workday for employees missing benefits enrollment, send Teams reminders, and log outreach in ServiceNow."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "The enrollment period identifier, e.g. OE-2026."
          steps:
            - name: get-pending-enrollees
              type: call
              call: workday.get-pending-enrollments
              with:
                period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "ENROLLMENT REMINDER: {{get-pending-enrollees.count}} employees have not completed benefits enrollment for {{enrollment_period}}."
            - name: log-outreach
              type: call
              call: servicenow.create-record
              with:
                table: "u_hr_outreach"
                type: "benefits_enrollment_reminder"
                period: "{{enrollment_period}}"
                count: "{{get-pending-enrollees.count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: enrollments
          path: "/benefits/enrollments?status=pending&period={{period}}"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-pending-enrollments
              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
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

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

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 approve the change."
  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 for approval."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee receiving the 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 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: "/cmc-materials/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

Pulls diversity and inclusion metrics from Workday, refreshes the Power BI DEI dashboard, and posts a quarterly metrics summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Pulls diversity and inclusion metrics from Workday, refreshes the Power BI DEI dashboard, and posts a quarterly metrics summary to the HR leadership Teams channel."
  tags:
    - hr
    - dei
    - diversity
    - workday
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: generate-dei-report
          description: "Pull Workday diversity metrics for a business unit, refresh Power BI DEI dashboard, and post summary to HR leadership."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "The Workday business unit."
            - name: quarter
              in: body
              type: string
              description: "The reporting quarter."
          steps:
            - name: get-dei-metrics
              type: call
              call: workday.get-diversity-report
              with:
                business_unit: "{{business_unit}}"
                quarter: "{{quarter}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_dei_dataset_id"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_leadership_channel_id"
                text: "DEI REPORT: {{business_unit}} {{quarter}} — Gender diversity: {{get-dei-metrics.gender_diversity_pct}}%, Ethnic diversity: {{get-dei-metrics.ethnic_diversity_pct}}%, Leadership representation: {{get-dei-metrics.leadership_diversity_pct}}%"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: diversity
          path: "/reports/diversity?businessUnit={{business_unit}}&quarter={{quarter}}"
          inputParameters:
            - name: business_unit
              in: query
            - name: quarter
              in: query
          operations:
            - name: get-diversity-report
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Retrieves an employee profile from Workday by employee ID, returning name, title, department, manager, and hire date for HR inquiries.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by employee ID, returning name, title, department, manager, and hire date for HR inquiries."
  tags:
    - hr
    - people
    - workday
    - hcm
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a CMC Materials employee profile in Workday by employee ID. Returns name, title, department, manager, and hire date. Use for HR inquiries and org chart lookups."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: workday.get-worker
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Worker_Data.Personal_Data.Name_Data.Legal_Name"
            - name: title
              type: string
              mapping: "$.Worker.Worker_Data.Employment_Data.Job_Data.Position_Data.Business_Title"
            - name: department
              type: string
              mapping: "$.Worker.Worker_Data.Employment_Data.Job_Data.Position_Data.Business_Unit"
            - name: manager
              type: string
              mapping: "$.Worker.Worker_Data.Employment_Data.Job_Data.Position_Data.Manager"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

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

naftiko: "0.5"
info:
  label: "Workday 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 analytics."
  tags:
    - hr
    - finance
    - reporting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Return active CMC Materials employee headcount grouped by cost center and employment type from Workday. Use for headcount planning, finance modeling, or 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: "/cmc-materials/workers"
          operations:
            - name: list-workers
              method: GET

Compares current Workday headcount against approved budget positions in SAP, identifies variances, and posts a summary to the HR leadership Teams channel with a link to the Power BI org dashboard.

naftiko: "0.5"
info:
  label: "Workday Headcount Variance Alert"
  description: "Compares current Workday headcount against approved budget positions in SAP, identifies variances, and posts a summary to the HR leadership Teams channel with a link to the Power BI org dashboard."
  tags:
    - hr
    - workforce-planning
    - workday
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: check-headcount-variance
          description: "Given a cost center, compare Workday headcount vs SAP budget positions and alert HR leadership via Teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The cost center code."
          steps:
            - name: get-headcount
              type: call
              call: workday.get-headcount
              with:
                cost_center: "{{cost_center}}"
            - name: get-budget
              type: call
              call: sap.get-budget-positions
              with:
                cost_center: "{{cost_center}}"
            - name: post-variance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_leadership_channel_id"
                text: "HEADCOUNT VARIANCE: {{cost_center}} — Actual: {{get-headcount.count}}, Budget: {{get-budget.approved_positions}}, Variance: {{get-headcount.count}} vs {{get-budget.approved_positions}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/reports/headcount?costCenter={{cost_center}}"
          inputParameters:
            - name: cost_center
              in: query
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://cmc-materials-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budget
          path: "/A_CostCenter('{{cost_center}}')/BudgetPositions"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget-positions
              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 a job requisition from Workday by requisition ID and returns status, hiring manager, position title, and posting date for talent acquisition tracking.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Status"
  description: "Retrieves a job requisition from Workday by requisition ID and returns status, hiring manager, position title, and posting date for talent acquisition tracking."
  tags:
    - hr
    - recruiting
    - workday
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-requisition-status
          description: "Look up a CMC Materials job requisition in Workday. Returns status, hiring manager, position title, and posting date. Use for recruiting pipeline tracking."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: workday.get-requisition
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Job_Requisition.Status"
            - name: hiring_manager
              type: string
              mapping: "$.Job_Requisition.Hiring_Manager"
            - name: position_title
              type: string
              mapping: "$.Job_Requisition.Position_Title"
            - name: posting_date
              type: string
              mapping: "$.Job_Requisition.Post_Date"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

Checks Workday Learning for employees with overdue mandatory training, creates ServiceNow tasks for compliance follow-up, and posts a compliance report to the HR Teams channel.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Checks Workday Learning for employees with overdue mandatory training, creates ServiceNow tasks for compliance follow-up, and posts a compliance report to the HR Teams channel."
  tags:
    - hr
    - compliance
    - training
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given a department, check Workday for overdue mandatory training, create ServiceNow follow-up tasks, and post compliance report to Teams."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to check."
          steps:
            - name: get-overdue-training
              type: call
              call: workday.get-overdue-training
              with:
                department: "{{department}}"
            - name: create-follow-up
              type: call
              call: servicenow.create-task
              with:
                short_description: "Overdue training compliance: {{department}}"
                description: "{{get-overdue-training.overdue_count}} employees with overdue mandatory training."
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "TRAINING COMPLIANCE: {{department}} — {{get-overdue-training.overdue_count}} overdue ({{get-overdue-training.compliance_rate}}% compliant). ServiceNow: {{create-follow-up.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learning/overdueTraining?department={{department}}"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-overdue-training
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.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: create-task
              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

Retrieves all open job requisitions from Workday and posts a weekly recruiting digest to the HR 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 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 recruiting digest to the HR Teams channel. Use for weekly staffing pipeline reviews."
          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 CMC Materials."
  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: "/cmc-materials/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

When an organizational restructure is approved in Workday, updates reporting lines in ServiceNow, adjusts Salesforce territory assignments, and notifies affected managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Org Restructure Sync"
  description: "When an organizational restructure is approved in Workday, updates reporting lines in ServiceNow, adjusts Salesforce territory assignments, and notifies affected managers via Teams."
  tags:
    - hr
    - org-management
    - workday
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: sync-org-restructure
          description: "Given a Workday org change event ID, update ServiceNow reporting, Salesforce territories, and notify managers."
          inputParameters:
            - name: change_event_id
              in: body
              type: string
              description: "The Workday organizational change event ID."
          steps:
            - name: get-change
              type: call
              call: workday.get-org-change
              with:
                event_id: "{{change_event_id}}"
            - name: update-servicenow
              type: call
              call: servicenow.update-department
              with:
                department: "{{get-change.department}}"
                new_manager: "{{get-change.new_manager}}"
            - name: update-territories
              type: call
              call: salesforce.update-territory-assignments
              with:
                department: "{{get-change.department}}"
                assignments: "{{get-change.territory_changes}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "ORG CHANGE: {{get-change.department}} — New manager: {{get-change.new_manager}}. {{get-change.affected_count}} employees affected."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: org-changes
          path: "/organizationChanges/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-org-change
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cmcmaterials.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: departments
          path: "/table/cmn_department"
          operations:
            - name: update-department
              method: PATCH
    - type: http
      namespace: salesforce
      baseUri: "https://cmc-materials.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territories
          path: "/sobjects/UserTerritory2Association"
          operations:
            - name: update-territory-assignments
              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 a performance review cycle in Workday and notifies managers via Teams to complete evaluations by the specified deadline.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Kickoff"
  description: "Creates a performance review cycle in Workday and notifies managers via Teams to complete evaluations by the specified 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 given review period and notify managers via Teams with the deadline. Use for annual or mid-year performance cycle launches."
          inputParameters:
            - name: review_period
              in: body
              type: string
              description: "Review period label, e.g. 2026-Annual."
            - name: due_date
              in: body
              type: string
              description: "Review 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 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: "/cmc-materials/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

Pulls compensation data from Workday for a cost center, compares against market benchmarks, and publishes the analysis to Power BI and notifies HR leadership via Teams.

naftiko: "0.5"
info:
  label: "Workday Salary Benchmarking Report"
  description: "Pulls compensation data from Workday for a cost center, compares against market benchmarks, and publishes the analysis to Power BI and notifies HR leadership via Teams."
  tags:
    - hr
    - compensation
    - workday
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: generate-salary-benchmark
          description: "Given a cost center, pull Workday comp data, refresh Power BI benchmark dashboard, and notify HR leadership."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The Workday cost center ID."
          steps:
            - name: get-comp-data
              type: call
              call: workday.get-compensation-report
              with:
                cost_center: "{{cost_center}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_comp_dataset_id"
            - name: notify-hr
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_leadership_channel_id"
                text: "Salary benchmark report for {{cost_center}} refreshed. Headcount: {{get-comp-data.employee_count}}, Avg compa-ratio: {{get-comp-data.avg_compa_ratio}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/reports/compensation?costCenter={{cost_center}}"
          inputParameters:
            - name: cost_center
              in: query
          operations:
            - name: get-compensation-report
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Pulls succession planning data from Workday for critical roles, refreshes the Power BI talent dashboard, and posts a readiness summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Succession Planning Report"
  description: "Pulls succession planning data from Workday for critical roles, refreshes the Power BI talent dashboard, and posts a readiness summary to the HR leadership Teams channel."
  tags:
    - hr
    - talent-management
    - succession-planning
    - workday
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: generate-succession-report
          description: "Pull Workday succession data for a business unit, refresh Power BI talent dashboard, and post readiness summary to Teams."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "The Workday business unit."
          steps:
            - name: get-succession-data
              type: call
              call: workday.get-succession-plans
              with:
                business_unit: "{{business_unit}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_talent_dataset_id"
            - name: post-report
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.teams_hr_leadership_channel_id"
                text: "SUCCESSION: {{business_unit}} — Critical roles: {{get-succession-data.critical_roles}}, Ready-now successors: {{get-succession-data.ready_now}}, Gaps: {{get-succession-data.gaps}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: succession
          path: "/successionPlans?businessUnit={{business_unit}}"
          inputParameters:
            - name: business_unit
              in: query
          operations:
            - name: get-succession-plans
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              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

Retrieves remaining PTO and sick leave balances from Workday for an employee, returning accrued hours, used hours, and available balance by leave type.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Check"
  description: "Retrieves remaining PTO and sick leave balances from Workday for an employee, returning accrued hours, used hours, and available balance by leave type."
  tags:
    - hr
    - time-off
    - workday
    - hcm
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Look up time off balances for a CMC Materials employee in Workday. Returns accrued, used, and available hours by leave type. Use for PTO planning and balance inquiries."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: workday.get-time-off
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: pto_available
              type: string
              mapping: "$.Time_Off_Balance.PTO.Available"
            - name: sick_available
              type: string
              mapping: "$.Time_Off_Balance.Sick.Available"
            - name: pto_used
              type: string
              mapping: "$.Time_Off_Balance.PTO.Used"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.workday.com/ccx/api/v1/cmc-materials"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/workers/{{employee_id}}/timeOffBalance"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-time-off
              method: GET