Cmc Materials Capabilities
Naftiko 0.5 capability definitions for Cmc Materials - 101 capabilities showing integration workflows and service orchestrations.
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