Caterpillar Capabilities
Naftiko 0.5 capability definitions for Caterpillar - 101 capabilities showing integration workflows and service orchestrations.
Compares ADP payroll run totals against Workday headcount data, flags variances above threshold, logs in Snowflake, and alerts the payroll team via Teams.
naftiko: "0.5"
info:
label: "ADP Payroll Variance Alert"
description: "Compares ADP payroll run totals against Workday headcount data, flags variances above threshold, logs in Snowflake, and alerts the payroll team via Teams."
tags:
- hr
- payroll
- adp
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: payroll
port: 8080
tools:
- name: check-payroll-variance
description: "Given a pay period, compare ADP payroll totals against Workday headcount, flag variances, and alert the payroll team."
inputParameters:
- name: pay_period
in: body
type: string
description: "Pay period identifier, e.g. 2026-PP06."
steps:
- name: get-payroll
type: call
call: "adp.get-payroll-summary"
with:
pay_period: "{{pay_period}}"
- name: get-headcount
type: call
call: "workday.get-headcount"
with:
as_of_date: "{{pay_period}}"
- name: log-variance
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO payroll_variance_log VALUES ('{{pay_period}}', {{get-payroll.total_employees}}, {{get-headcount.active_count}}, CURRENT_TIMESTAMP())"
- name: alert-payroll
type: call
call: "msteams.send-message"
with:
channel_id: "payroll-operations"
text: "Payroll variance alert for {{pay_period}}: ADP count={{get-payroll.total_employees}}, Workday count={{get-headcount.active_count}}. Total payroll: ${{get-payroll.gross_total}}."
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/payroll/v1"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: payroll-summary
path: "/pay-data-input?payPeriod={{pay_period}}"
inputParameters:
- name: pay_period
in: query
operations:
- name: get-payroll-summary
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/caterpillar/workers?count=true&activeOnly=true"
operations:
- name: get-headcount
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves service manual content from SharePoint, processes it through Anthropic Claude for contextual answers, and logs the query in ServiceNow knowledge management.
naftiko: "0.5"
info:
label: "AI-Powered Service Manual Query"
description: "Retrieves service manual content from SharePoint, processes it through Anthropic Claude for contextual answers, and logs the query in ServiceNow knowledge management."
tags:
- customer-service
- ai
- sharepoint
- anthropic
- servicenow
capability:
exposes:
- type: mcp
namespace: service
port: 8080
tools:
- name: query-service-manual
description: "Given a machine model and question, retrieve relevant manual content from SharePoint, generate an AI answer via Anthropic, and log the knowledge query."
inputParameters:
- name: machine_model
in: body
type: string
description: "Caterpillar machine model, e.g. D6T, 320F."
- name: question
in: body
type: string
description: "Service or maintenance question."
steps:
- name: get-manual
type: call
call: "sharepoint.search-content"
with:
query: "{{machine_model}} service manual"
site: "service-documentation"
- name: generate-answer
type: call
call: "anthropic.generate-response"
with:
context: "{{get-manual.content}}"
question: "{{question}}"
model: "claude-sonnet"
- name: log-query
type: call
call: "servicenow.create-knowledge-query"
with:
query: "{{question}}"
model: "{{machine_model}}"
answer_source: "ai-service-manual"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: search
path: "/search/query"
operations:
- name: search-content
method: POST
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apiKey
key: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
operations:
- name: generate-response
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: knowledge-queries
path: "/table/kb_knowledge"
operations:
- name: create-knowledge-query
method: POST
Retrieves the execution status of Caterpillar's scheduled Alteryx analytics workflows and notifies the data team via Teams if any workflows have failed.
naftiko: "0.5"
info:
label: "Alteryx Analytics Pipeline Status Check"
description: "Retrieves the execution status of Caterpillar's scheduled Alteryx analytics workflows and notifies the data team via Teams if any workflows have failed."
tags:
- data
- analytics
- alteryx
- microsoft-teams
- monitoring
capability:
exposes:
- type: mcp
namespace: analytics-ops
port: 8080
tools:
- name: check-alteryx-pipeline-status
description: "Query the Alteryx Server API for the execution status of scheduled workflows. If any workflows have failed, post failure details to the data engineering Teams channel. Use for daily analytics pipeline monitoring."
inputParameters:
- name: workflow_tag
in: body
type: string
description: "Alteryx workflow tag or collection name to filter, e.g. 'production-etl'."
steps:
- name: get-workflow-status
type: call
call: "alteryx.list-jobs"
with:
view: "Failed"
tag: "{{workflow_tag}}"
- name: notify-data-team
type: call
call: "msteams-analytics.send-message"
with:
channel: "data-engineering"
text: "Alteryx Pipeline Check ({{workflow_tag}}): {{get-workflow-status.failed_count}} failed workflows detected. Review Alteryx Server for details."
consumes:
- type: http
namespace: alteryx
baseUri: "https://caterpillar-alteryx.example.com/gallery/api/v1"
authentication:
type: apikey
key: "X-Api-Key"
value: "$secrets.alteryx_api_key"
placement: header
resources:
- name: jobs
path: "/workflows/jobs"
inputParameters:
- name: view
in: query
- name: tag
in: query
operations:
- name: list-jobs
method: GET
- type: http
namespace: msteams-analytics
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When Alteryx detects data quality issues, logs them in Snowflake, creates Jira tickets for data stewards, and sends a quality digest via Teams.
naftiko: "0.5"
info:
label: "Alteryx Data Quality Remediation Flow"
description: "When Alteryx detects data quality issues, logs them in Snowflake, creates Jira tickets for data stewards, and sends a quality digest via Teams."
tags:
- data-governance
- data-quality
- alteryx
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-governance
port: 8080
tools:
- name: remediate-data-quality
description: "Given an Alteryx workflow run ID, retrieve quality metrics, log issues in Snowflake, create Jira tickets, and notify data stewards."
inputParameters:
- name: workflow_id
in: body
type: string
description: "Alteryx workflow run identifier."
steps:
- name: get-quality-results
type: call
call: "alteryx.get-workflow-results"
with:
workflow_id: "{{workflow_id}}"
- name: log-issues
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO data_quality_log SELECT * FROM TABLE(RESULT_SCAN('{{get-quality-results.scan_id}}'))"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "DQ"
issuetype: "Task"
summary: "Data quality issues: {{get-quality-results.dataset}} - {{get-quality-results.issue_count}} records"
description: "Dataset: {{get-quality-results.dataset}}. Issues: {{get-quality-results.issue_summary}}."
- name: send-digest
type: call
call: "msteams.send-message"
with:
channel_id: "data-stewards"
text: "Data quality scan complete for {{get-quality-results.dataset}}: {{get-quality-results.issue_count}} issues found. Jira: {{create-jira.key}}."
consumes:
- type: http
namespace: alteryx
baseUri: "https://caterpillar.alteryxcloud.com/api/v3"
authentication:
type: bearer
token: "$secrets.alteryx_token"
resources:
- name: workflows
path: "/workflows/{{workflow_id}}/results"
inputParameters:
- name: workflow_id
in: path
operations:
- name: get-workflow-results
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sends a Caterpillar equipment service manual excerpt to Anthropic Claude for extraction of maintenance procedures, part numbers, and torque specifications, storing the result in Snowflake.
naftiko: "0.5"
info:
label: "Anthropic Document Intelligence for Service Manuals"
description: "Sends a Caterpillar equipment service manual excerpt to Anthropic Claude for extraction of maintenance procedures, part numbers, and torque specifications, storing the result in Snowflake."
tags:
- ai
- anthropic
- manufacturing
- snowflake
- document-processing
capability:
exposes:
- type: mcp
namespace: ai-documents
port: 8080
tools:
- name: extract-service-manual-data
description: "Given the text of a Caterpillar equipment service manual section, invoke Anthropic Claude to extract structured maintenance data (procedures, part numbers, torque specs, service intervals) and store the result in Snowflake. Use for technical documentation digitization."
inputParameters:
- name: manual_text
in: body
type: string
description: "Raw text of the service manual section to process."
- name: equipment_model
in: body
type: string
description: "Caterpillar equipment model number, e.g. 390F."
- name: section_id
in: body
type: string
description: "Manual section identifier for Snowflake indexing."
steps:
- name: extract-data
type: call
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 2048
system: "You are a technical documentation analyst for heavy equipment. Extract: procedures (list), part_numbers (list), torque_specs (object), service_interval_hours (number)."
content: "{{manual_text}}"
- name: store-to-snowflake
type: call
call: "snowflake-docs.execute-statement"
with:
statement: "INSERT INTO CAT_DW.TECHNICAL_DOCS.MANUAL_EXTRACTS (equipment_model, section_id, extracted_data, created_at) VALUES ('{{equipment_model}}', '{{section_id}}', PARSE_JSON('{{extract-data.content}}'), CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: snowflake-docs
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Retrieves stale Azure AD privileged group memberships for Caterpillar and creates ServiceNow access review tasks for accounts inactive beyond the policy threshold.
naftiko: "0.5"
info:
label: "Azure AD Access Recertification Campaign"
description: "Retrieves stale Azure AD privileged group memberships for Caterpillar and creates ServiceNow access review tasks for accounts inactive beyond the policy threshold."
tags:
- security
- identity
- azure-active-directory
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: identity-governance
port: 8080
tools:
- name: run-access-recertification
description: "List all members of a Caterpillar privileged Azure AD group, identify accounts inactive beyond the policy threshold, and open a ServiceNow access review task for recertification. Use for quarterly privileged access reviews."
inputParameters:
- name: group_id
in: body
type: string
description: "Azure AD group object ID to review."
- name: inactivity_days
in: body
type: integer
description: "Inactivity threshold in days, typically 90."
steps:
- name: get-group-members
type: call
call: "azure-ad-gov.list-members"
with:
group_id: "{{group_id}}"
- name: create-review-task
type: call
call: "servicenow-access.create-incident"
with:
short_description: "Privileged access review: {{group_id}}"
description: "{{get-group-members.stale_count}} accounts inactive >{{inactivity_days}} days require recertification."
category: "access_review"
consumes:
- type: http
namespace: azure-ad-gov
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/groups/{{group_id}}/members"
inputParameters:
- name: group_id
in: path
operations:
- name: list-members
method: GET
- type: http
namespace: servicenow-access
baseUri: "https://caterpillar.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
Identifies inactive Azure AD users, reclaims unused Microsoft 365 licenses, logs the action in ServiceNow, and reports savings to IT management via Teams.
naftiko: "0.5"
info:
label: "Azure AD License Reclamation Workflow"
description: "Identifies inactive Azure AD users, reclaims unused Microsoft 365 licenses, logs the action in ServiceNow, and reports savings to IT management via Teams."
tags:
- identity
- cost-optimization
- azure-active-directory
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: reclaim-licenses
description: "Given an inactivity threshold in days, identify inactive users, remove their M365 licenses, log the reclamation, and report savings."
inputParameters:
- name: inactive_days
in: body
type: number
description: "Number of days of inactivity threshold."
steps:
- name: get-inactive-users
type: call
call: "azuread.get-inactive-users"
with:
days: "{{inactive_days}}"
- name: remove-licenses
type: call
call: "azuread.remove-licenses"
with:
user_ids: "{{get-inactive-users.user_ids}}"
- name: log-reclamation
type: call
call: "servicenow.create-task"
with:
short_description: "License reclamation: {{get-inactive-users.count}} licenses recovered"
category: "license_management"
description: "Reclaimed M365 licenses from {{get-inactive-users.count}} users inactive for {{inactive_days}}+ days."
- name: report-savings
type: call
call: "msteams.send-message"
with:
channel_id: "it-cost-management"
text: "License reclamation complete: {{get-inactive-users.count}} M365 licenses recovered from users inactive {{inactive_days}}+ days. Estimated monthly savings: ${{remove-licenses.savings}}."
consumes:
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users?$filter=signInActivity/lastSignInDateTime le {{cutoff_date}}"
operations:
- name: get-inactive-users
method: GET
- name: remove-licenses
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Azure Cost Management for spend anomalies across Caterpillar subscriptions, logs findings to Snowflake, and posts a FinOps summary to the cloud governance Teams channel.
naftiko: "0.5"
info:
label: "Azure Cloud Cost Anomaly Detection"
description: "Queries Azure Cost Management for spend anomalies across Caterpillar subscriptions, logs findings to Snowflake, and posts a FinOps summary to the cloud governance Teams channel."
tags:
- cloud
- finops
- azure
- snowflake
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: detect-azure-cost-anomalies
description: "Query Azure Cost Management for spend anomalies in the trailing 7 days across all Caterpillar Azure subscriptions. Log findings to Snowflake and post a summary to the cloud governance Teams channel. Use for proactive cloud FinOps governance."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID to analyze."
- name: threshold_usd
in: body
type: number
description: "Minimum anomaly spend impact in USD to report."
steps:
- name: get-cost-data
type: call
call: "azure-cost.query-costs"
with:
subscription_id: "{{subscription_id}}"
timeframe: "TheLastWeek"
- name: log-anomalies
type: call
call: "snowflake-finops.execute-statement"
with:
statement: "INSERT INTO CAT_DW.FINOPS.AZURE_COST_ANOMALIES SELECT * FROM VALUES {{get-cost-data.anomalies}}"
- name: post-summary
type: call
call: "msteams-finops.send-message"
with:
channel: "cloud-governance"
text: "Azure Cost Anomalies: {{get-cost-data.anomaly_count}} anomalies detected totaling ${{get-cost-data.total_impact}} in subscription {{subscription_id}}."
consumes:
- type: http
namespace: azure-cost
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: cost-query
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: subscription_id
in: path
operations:
- name: query-costs
method: POST
- type: http
namespace: snowflake-finops
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Azure cost recommendations, creates Jira action items for each optimization opportunity, and posts a weekly savings summary to the cloud governance Teams channel.
naftiko: "0.5"
info:
label: "Azure Cost Optimization Recommendation Pipeline"
description: "Retrieves Azure cost recommendations, creates Jira action items for each optimization opportunity, and posts a weekly savings summary to the cloud governance Teams channel."
tags:
- cloud
- cost-optimization
- microsoft-azure
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cloud-governance
port: 8080
tools:
- name: process-cost-recommendations
description: "Retrieve Azure Advisor cost recommendations, create Jira tasks for actionable items, and post savings opportunities to the governance team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
steps:
- name: get-recommendations
type: call
call: "azure.get-advisor-recommendations"
with:
subscription_id: "{{subscription_id}}"
category: "cost"
- name: create-tasks
type: call
call: "jira.create-issue"
with:
project: "CLOUD"
issuetype: "Task"
summary: "Azure cost optimization: {{get-recommendations.count}} recommendations"
description: "Top recommendation: {{get-recommendations.top_recommendation}}. Estimated savings: ${{get-recommendations.total_savings}}/month."
- name: post-summary
type: call
call: "msteams.send-message"
with:
channel_id: "cloud-governance"
text: "Azure Cost Report for subscription {{subscription_id}}: {{get-recommendations.count}} optimization opportunities found. Estimated savings: ${{get-recommendations.total_savings}}/month. Jira: {{create-tasks.key}}."
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: advisor
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Advisor/recommendations?api-version=2022-10-01&$filter=Category eq 'Cost'"
inputParameters:
- name: subscription_id
in: path
operations:
- name: get-advisor-recommendations
method: GET
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Deploys a trained ML model from Azure Databricks to production, registers it in the model catalog, creates a ServiceNow change record, and notifies the data science team via Teams.
naftiko: "0.5"
info:
label: "Azure Databricks ML Model Deployment"
description: "Deploys a trained ML model from Azure Databricks to production, registers it in the model catalog, creates a ServiceNow change record, and notifies the data science team via Teams."
tags:
- data-science
- ml-ops
- azure-databricks
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: mlops
port: 8080
tools:
- name: deploy-ml-model
description: "Given a Databricks model name and version, deploy to the serving endpoint, register the change, and notify the team."
inputParameters:
- name: model_name
in: body
type: string
description: "MLflow registered model name."
- name: model_version
in: body
type: string
description: "Model version to deploy."
steps:
- name: deploy-model
type: call
call: "databricks.deploy-serving-endpoint"
with:
model_name: "{{model_name}}"
model_version: "{{model_version}}"
- name: create-change
type: call
call: "servicenow.create-change"
with:
short_description: "ML model deployment: {{model_name}} v{{model_version}}"
type: "standard"
category: "ml_deployment"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "data-science"
text: "ML model deployed: {{model_name}} v{{model_version}} to production. Endpoint: {{deploy-model.endpoint_url}}. Change: {{create-change.number}}."
consumes:
- type: http
namespace: databricks
baseUri: "https://caterpillar.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: serving-endpoints
path: "/serving-endpoints"
operations:
- name: deploy-serving-endpoint
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the latest build status for a given pipeline in Caterpillar's Azure DevOps environment.
naftiko: "0.5"
info:
label: "Azure DevOps Build Status Lookup"
description: "Retrieves the latest build status for a given pipeline in Caterpillar's Azure DevOps environment."
tags:
- devops
- ci-cd
- azure-devops
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: get-build-status
description: "Given an Azure DevOps project and pipeline ID, retrieve the latest build status, result, and duration from Caterpillar's ADO instance."
inputParameters:
- name: project
in: body
type: string
description: "Azure DevOps project name."
- name: pipeline_id
in: body
type: string
description: "Pipeline definition ID."
call: "ado.get-build"
with:
project: "{{project}}"
pipeline_id: "{{pipeline_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
- name: result
type: string
mapping: "$.value[0].result"
- name: finish_time
type: string
mapping: "$.value[0].finishTime"
consumes:
- type: http
namespace: ado
baseUri: "https://dev.azure.com/caterpillar"
authentication:
type: basic
username: ""
password: "$secrets.ado_pat"
resources:
- name: builds
path: "/{{project}}/_apis/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
inputParameters:
- name: project
in: path
- name: pipeline_id
in: query
operations:
- name: get-build
method: GET
Triggers a rolling deployment update on an Azure Kubernetes Service cluster for a specified Caterpillar microservice and monitors rollout status, alerting Teams on completion or failure.
naftiko: "0.5"
info:
label: "Azure Kubernetes Service Deployment Rollout"
description: "Triggers a rolling deployment update on an Azure Kubernetes Service cluster for a specified Caterpillar microservice and monitors rollout status, alerting Teams on completion or failure."
tags:
- devops
- cloud
- azure
- kubernetes
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: k8s-deployments
port: 8080
tools:
- name: trigger-aks-rollout
description: "Given a microservice name and container image tag, trigger a rolling deployment update on the Caterpillar AKS cluster via the Azure API. Poll for rollout completion and notify the DevOps Teams channel on success or failure."
inputParameters:
- name: service_name
in: body
type: string
description: "Kubernetes deployment name, e.g. dealer-portal-api."
- name: image_tag
in: body
type: string
description: "Container image tag to deploy, e.g. 2.4.1-release."
- name: namespace
in: body
type: string
description: "Kubernetes namespace, e.g. production."
steps:
- name: update-deployment
type: call
call: "aks.patch-deployment"
with:
deployment: "{{service_name}}"
namespace: "{{namespace}}"
image: "{{image_tag}}"
- name: notify-devops
type: call
call: "msteams-devops.send-message"
with:
channel: "devops-deployments"
text: "AKS Rollout: {{service_name}} → {{image_tag}} in {{namespace}}. Status: {{update-deployment.status}}"
consumes:
- type: http
namespace: aks
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: deployments
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{rg}}/providers/Microsoft.ContainerService/managedClusters/{{cluster}}/deployments/{{deployment}}"
inputParameters:
- name: subscription_id
in: path
- name: rg
in: path
- name: cluster
in: path
- name: deployment
in: path
operations:
- name: patch-deployment
method: PATCH
- type: http
namespace: msteams-devops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When Datadog detects high resource utilization, triggers Azure Kubernetes Service scaling, creates a ServiceNow change record, and notifies the SRE team via Teams.
naftiko: "0.5"
info:
label: "Cloud Infrastructure Scaling Orchestrator"
description: "When Datadog detects high resource utilization, triggers Azure Kubernetes Service scaling, creates a ServiceNow change record, and notifies the SRE team via Teams."
tags:
- infrastructure
- auto-scaling
- datadog
- azure-kubernetes-service
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infrastructure
port: 8080
tools:
- name: handle-scaling-event
description: "Given a Datadog alert ID and cluster name, verify resource utilization, trigger AKS scaling, log a change record, and notify SRE."
inputParameters:
- name: alert_id
in: body
type: string
description: "Datadog alert identifier."
- name: cluster_name
in: body
type: string
description: "AKS cluster name."
- name: namespace
in: body
type: string
description: "Kubernetes namespace to scale."
steps:
- name: get-metrics
type: call
call: "datadog.get-alert-details"
with:
alert_id: "{{alert_id}}"
- name: scale-deployment
type: call
call: "aks.scale-deployment"
with:
cluster: "{{cluster_name}}"
namespace: "{{namespace}}"
replicas: "{{get-metrics.recommended_replicas}}"
- name: create-change
type: call
call: "servicenow.create-change"
with:
short_description: "Auto-scale {{namespace}} in {{cluster_name}} to {{get-metrics.recommended_replicas}} replicas"
type: "standard"
category: "infrastructure"
- name: notify-sre
type: call
call: "msteams.send-message"
with:
channel_id: "sre-alerts"
text: "Auto-scaling triggered for {{namespace}} in {{cluster_name}}. Scaled to {{get-metrics.recommended_replicas}} replicas. Change: {{create-change.number}}."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: alerts
path: "/alert/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert-details
method: GET
- type: http
namespace: aks
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: deployments
path: "/subscriptions/{{sub_id}}/resourceGroups/{{rg}}/providers/Microsoft.ContainerService/managedClusters/{{cluster}}"
inputParameters:
- name: cluster
in: path
operations:
- name: scale-deployment
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Validates travel bookings in SAP Concur against Caterpillar's travel policy, flags exceptions, creates approval workflows in ServiceNow, and notifies managers via Teams.
naftiko: "0.5"
info:
label: "Concur Travel Booking Policy Enforcer"
description: "Validates travel bookings in SAP Concur against Caterpillar's travel policy, flags exceptions, creates approval workflows in ServiceNow, and notifies managers via Teams."
tags:
- travel
- compliance
- sap-concur
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: travel
port: 8080
tools:
- name: enforce-travel-policy
description: "Given a Concur trip ID, validate against travel policy, flag exceptions, route for approval, and notify the traveler's manager."
inputParameters:
- name: trip_id
in: body
type: string
description: "SAP Concur trip request ID."
steps:
- name: get-trip
type: call
call: "concur.get-trip-request"
with:
trip_id: "{{trip_id}}"
- name: create-approval
type: call
call: "servicenow.create-approval"
with:
short_description: "Travel policy exception: {{get-trip.traveler_name}} - {{get-trip.destination}}"
description: "Estimated cost: {{get-trip.total_cost}}. Policy limit: {{get-trip.policy_limit}}. Exception reason: {{get-trip.exception_reason}}."
- name: notify-manager
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-trip.manager_email}}"
text: "Travel policy exception for {{get-trip.traveler_name}} trip to {{get-trip.destination}}. Cost: {{get-trip.total_cost}}. Approval needed: {{create-approval.number}}."
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: trip-requests
path: "/travelrequest/requests/{{trip_id}}"
inputParameters:
- name: trip_id
in: path
operations:
- name: get-trip-request
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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: chat-messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves engineering specification documents from Caterpillar's Confluence wiki by page ID or title search.
naftiko: "0.5"
info:
label: "Confluence Engineering Spec Retrieval"
description: "Retrieves engineering specification documents from Caterpillar's Confluence wiki by page ID or title search."
tags:
- engineering
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: docs
port: 8080
tools:
- name: get-spec-page
description: "Given a Confluence page ID, retrieve the page title, version, last modified date, and body content from Caterpillar's engineering specifications space."
inputParameters:
- name: page_id
in: body
type: string
description: "Confluence page ID."
call: "confluence.get-page"
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: version
type: number
mapping: "$.version.number"
- name: last_modified
type: string
mapping: "$.version.when"
consumes:
- type: http
namespace: confluence
baseUri: "https://caterpillar.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content/{{page_id}}?expand=version,body.storage"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
When a contractor engagement is approved in Workday, provisions Azure AD guest account, creates ServiceNow access request, and sends welcome instructions via Outlook.
naftiko: "0.5"
info:
label: "Contractor Access Provisioning Workflow"
description: "When a contractor engagement is approved in Workday, provisions Azure AD guest account, creates ServiceNow access request, and sends welcome instructions via Outlook."
tags:
- identity
- contractor-management
- workday
- azure-active-directory
- servicenow
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: provision-contractor
description: "Given contractor details from Workday, create Azure AD guest account, submit ServiceNow access request, and email onboarding instructions."
inputParameters:
- name: contractor_id
in: body
type: string
description: "Workday contingent worker ID."
- name: sponsor_email
in: body
type: string
description: "Caterpillar sponsor email address."
steps:
- name: get-contractor
type: call
call: "workday.get-worker"
with:
worker_id: "{{contractor_id}}"
- name: create-guest
type: call
call: "azuread.create-guest-user"
with:
email: "{{get-contractor.personal_email}}"
display_name: "{{get-contractor.display_name}}"
sponsor: "{{sponsor_email}}"
- name: create-access-request
type: call
call: "servicenow.create-request"
with:
short_description: "Contractor access: {{get-contractor.display_name}}"
category: "access_management"
requested_for: "{{get-contractor.personal_email}}"
- name: send-welcome
type: call
call: "outlook.send-email"
with:
to: "{{get-contractor.personal_email}}"
subject: "Welcome to Caterpillar - Contractor Access Instructions"
body: "Your Azure AD guest account has been created. Access request {{create-access-request.number}} is being processed. Your sponsor is {{sponsor_email}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/caterpillar/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: invitations
path: "/invitations"
operations:
- name: create-guest-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Submits a purchase requisition in Coupa, monitors approval status, and notifies the requestor via Microsoft Teams when the requisition is approved or requires action.
naftiko: "0.5"
info:
label: "Coupa Purchase Requisition Approval Workflow"
description: "Submits a purchase requisition in Coupa, monitors approval status, and notifies the requestor via Microsoft Teams when the requisition is approved or requires action."
tags:
- procurement
- coupa
- approval
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: submit-and-track-requisition
description: "Given requisition details (item, quantity, supplier, amount), create a purchase requisition in Coupa and notify the requestor in Teams with the requisition number and initial approval status. Use for automated procurement intake at Caterpillar."
inputParameters:
- name: item_description
in: body
type: string
description: "Description of the item or service being procured."
- name: quantity
in: body
type: number
description: "Quantity to procure."
- name: unit_price
in: body
type: number
description: "Unit price in USD."
- name: supplier_id
in: body
type: string
description: "Coupa supplier ID."
- name: requestor_upn
in: body
type: string
description: "UPN of the employee submitting the requisition."
steps:
- name: create-requisition
type: call
call: "coupa.create-requisition"
with:
description: "{{item_description}}"
quantity: "{{quantity}}"
unit_price: "{{unit_price}}"
supplier_id: "{{supplier_id}}"
- name: notify-requestor
type: call
call: "msteams-proc.send-message"
with:
recipient_upn: "{{requestor_upn}}"
text: "Your Coupa requisition for '{{item_description}}' has been submitted. Requisition ID: {{create-requisition.id}} | Status: {{create-requisition.status}}"
consumes:
- type: http
namespace: coupa
baseUri: "https://caterpillar.coupahost.com/api"
authentication:
type: apikey
key: "X-COUPA-API-KEY"
value: "$secrets.coupa_api_key"
placement: header
resources:
- name: requisitions
path: "/requisition_headers"
operations:
- name: create-requisition
method: POST
- type: http
namespace: msteams-proc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail-send
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves the supplier risk score and compliance rating from Caterpillar's Coupa procurement platform.
naftiko: "0.5"
info:
label: "Coupa Supplier Risk Score Lookup"
description: "Retrieves the supplier risk score and compliance rating from Caterpillar's Coupa procurement platform."
tags:
- procurement
- risk-management
- coupa
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-supplier-risk
description: "Given a Coupa supplier ID, retrieve the overall risk score, financial health rating, and compliance status from Caterpillar's Coupa system."
inputParameters:
- name: supplier_id
in: body
type: string
description: "Coupa supplier ID."
call: "coupa.get-supplier-risk"
with:
supplier_id: "{{supplier_id}}"
outputParameters:
- name: risk_score
type: number
mapping: "$.risk_score"
- name: financial_health
type: string
mapping: "$.financial_health_rating"
- name: compliance_status
type: string
mapping: "$.compliance_status"
consumes:
- type: http
namespace: coupa
baseUri: "https://caterpillar.coupahost.com/api"
authentication:
type: bearer
token: "$secrets.coupa_api_token"
resources:
- name: supplier-risk
path: "/suppliers/{{supplier_id}}/risk"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier-risk
method: GET
When a customer escalation is received in Salesforce, retrieves the service history from ServiceNow, generates an AI summary via Anthropic, and sends a briefing to the account team via Teams.
naftiko: "0.5"
info:
label: "Customer Escalation Response Orchestrator"
description: "When a customer escalation is received in Salesforce, retrieves the service history from ServiceNow, generates an AI summary via Anthropic, and sends a briefing to the account team via Teams."
tags:
- customer-service
- escalation
- salesforce
- servicenow
- anthropic
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-service
port: 8080
tools:
- name: handle-escalation
description: "Given a Salesforce case ID, pull service history from ServiceNow, generate an AI-powered summary, and brief the account team."
inputParameters:
- name: case_id
in: body
type: string
description: "Salesforce case ID."
steps:
- name: get-case
type: call
call: "salesforce.get-case"
with:
case_id: "{{case_id}}"
- name: get-history
type: call
call: "servicenow.get-case-history"
with:
account_id: "{{get-case.account_id}}"
- name: generate-summary
type: call
call: "anthropic.summarize"
with:
text: "Customer: {{get-case.account_name}}. Current issue: {{get-case.description}}. Service history: {{get-history.incidents}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "customer-escalations"
text: "ESCALATION: {{get-case.account_name}} (Case {{case_id}}). AI Summary: {{generate-summary.summary}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: case-history
path: "/table/incident?sysparm_query=account={{account_id}}"
inputParameters:
- name: account_id
in: query
operations:
- name: get-case-history
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apiKey
key: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
operations:
- name: summarize
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Datadog for container health metrics across Caterpillar's Kubernetes clusters including CPU, memory, and restart counts.
naftiko: "0.5"
info:
label: "Datadog Container Health Check"
description: "Queries Datadog for container health metrics across Caterpillar's Kubernetes clusters including CPU, memory, and restart counts."
tags:
- infrastructure
- monitoring
- datadog
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: get-container-health
description: "Given a Kubernetes namespace and service name, retrieve container CPU usage, memory usage, and restart count from Caterpillar's Datadog monitoring."
inputParameters:
- name: namespace
in: body
type: string
description: "Kubernetes namespace."
- name: service_name
in: body
type: string
description: "Service deployment name."
call: "datadog.query-metrics"
with:
namespace: "{{namespace}}"
service_name: "{{service_name}}"
outputParameters:
- name: cpu_pct
type: number
mapping: "$.series[0].pointlist[-1][1]"
- name: memory_mb
type: number
mapping: "$.series[1].pointlist[-1][1]"
- name: restarts
type: number
mapping: "$.series[2].pointlist[-1][1]"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: metrics-query
path: "/query"
operations:
- name: query-metrics
method: GET
Retrieves the current status of all Datadog monitors tagged for Caterpillar's production environment and publishes a daily health digest to the operations Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Datadog Observability Health Digest"
description: "Retrieves the current status of all Datadog monitors tagged for Caterpillar's production environment and publishes a daily health digest to the operations Microsoft Teams channel."
tags:
- observability
- monitoring
- datadog
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: publish-health-digest
description: "Query Datadog for all monitors with a production tag, group by alert state, and post a structured health digest to the operations Teams channel. Use for daily operational stand-ups or shift handovers."
inputParameters:
- name: environment
in: body
type: string
description: "Environment tag to filter monitors, e.g. 'production'."
steps:
- name: list-monitors
type: call
call: "datadog-mon.list-monitors"
with:
tags: "env:{{environment}}"
- name: post-digest
type: call
call: "msteams-health.send-message"
with:
channel: "it-operations"
text: "Observability Digest ({{environment}}): {{list-monitors.alert_count}} alerts, {{list-monitors.warn_count}} warnings, {{list-monitors.ok_count}} healthy monitors."
consumes:
- type: http
namespace: datadog-mon
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"
inputParameters:
- name: tags
in: query
operations:
- name: list-monitors
method: GET
- type: http
namespace: msteams-health
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks a dealer order from Salesforce opportunity through SAP sales order to logistics shipment status and compiles a fulfillment summary.
naftiko: "0.5"
info:
label: "Dealer Order to Fulfillment Tracker"
description: "Tracks a dealer order from Salesforce opportunity through SAP sales order to logistics shipment status and compiles a fulfillment summary."
tags:
- sales
- supply-chain
- salesforce
- sap
capability:
exposes:
- type: mcp
namespace: fulfillment
port: 8080
tools:
- name: track-dealer-order
description: "Given a Salesforce opportunity ID, retrieve the opportunity details, find the linked SAP sales order, and check shipment status to provide a full order-to-fulfillment view."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
steps:
- name: get-opportunity
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: get-sales-order
type: call
call: "sap-s4.get-sales-order"
with:
order_number: "{{get-opportunity.sap_order_number}}"
- name: get-shipment
type: call
call: "sap-s4.get-delivery"
with:
sales_order: "{{get-opportunity.sap_order_number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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: deliveries
path: "/A_SalesOrder('{{sales_order}}')/to_Delivery"
inputParameters:
- name: sales_order
in: path
operations:
- name: get-delivery
method: GET
Aggregates dealer performance data from Salesforce, SAP, and Snowflake to generate a quarterly scorecard and distribute it via Outlook.
naftiko: "0.5"
info:
label: "Dealer Performance Scorecard Generator"
description: "Aggregates dealer performance data from Salesforce, SAP, and Snowflake to generate a quarterly scorecard and distribute it via Outlook."
tags:
- sales
- dealer-management
- salesforce
- sap
- snowflake
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: sales
port: 8080
tools:
- name: generate-dealer-scorecard
description: "Given a dealer account ID and fiscal quarter, compile sales metrics from Salesforce, order fulfillment from SAP, and analytics from Snowflake into a scorecard."
inputParameters:
- name: dealer_account_id
in: body
type: string
description: "Salesforce dealer account ID."
- name: fiscal_quarter
in: body
type: string
description: "Fiscal quarter, e.g. Q1-2026."
steps:
- name: get-sales-metrics
type: call
call: "salesforce.get-dealer-metrics"
with:
account_id: "{{dealer_account_id}}"
quarter: "{{fiscal_quarter}}"
- name: get-fulfillment
type: call
call: "sap-s4.get-order-fulfillment"
with:
dealer_id: "{{dealer_account_id}}"
period: "{{fiscal_quarter}}"
- name: get-analytics
type: call
call: "snowflake.query-dealer-analytics"
with:
dealer_id: "{{dealer_account_id}}"
quarter: "{{fiscal_quarter}}"
- name: distribute-scorecard
type: call
call: "outlook.send-email"
with:
to: "dealer-management@caterpillar.com"
subject: "Dealer Scorecard: {{get-sales-metrics.dealer_name}} - {{fiscal_quarter}}"
body: "Revenue: {{get-sales-metrics.revenue}}. Fill rate: {{get-fulfillment.fill_rate}}%. Customer satisfaction: {{get-analytics.csat_score}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: dealer-metrics
path: "/query?q=SELECT+Id,Name,Revenue__c+FROM+Account+WHERE+Id='{{account_id}}'"
inputParameters:
- name: account_id
in: query
operations:
- name: get-dealer-metrics
method: GET
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: fulfillment
path: "/A_SalesOrder?$filter=SoldToParty eq '{{dealer_id}}'"
inputParameters:
- name: dealer_id
in: query
operations:
- name: get-order-fulfillment
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-dealer-analytics
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
When a dealer submits a warranty claim, validates the machine serial in SAP, creates a ServiceNow case, and notifies the warranty team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Dealer Warranty Claim Processor"
description: "When a dealer submits a warranty claim, validates the machine serial in SAP, creates a ServiceNow case, and notifies the warranty team via Microsoft Teams."
tags:
- warranty
- dealer-management
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: warranty
port: 8080
tools:
- name: process-warranty-claim
description: "Given a machine serial number and claim description, validate the machine warranty status in SAP, create a ServiceNow warranty case, and notify the warranty team via Teams."
inputParameters:
- name: serial_number
in: body
type: string
description: "Caterpillar machine serial number."
- name: claim_description
in: body
type: string
description: "Description of the warranty claim."
- name: dealer_id
in: body
type: string
description: "Dealer account identifier."
steps:
- name: validate-warranty
type: call
call: "sap-s4.get-warranty-status"
with:
serial_number: "{{serial_number}}"
- name: create-case
type: call
call: "servicenow.create-case"
with:
short_description: "Warranty claim: {{serial_number}} - {{claim_description}}"
category: "warranty"
assignment_group: "Warranty_Processing"
caller_id: "{{dealer_id}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "warranty-claims"
text: "New warranty claim {{create-case.number}} for machine {{serial_number}} from dealer {{dealer_id}}. Warranty status: {{validate-warranty.status}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{serial_number}}')/to_WarrantyStatus"
inputParameters:
- name: serial_number
in: path
operations:
- name: get-warranty-status
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cases
path: "/table/sn_customerservice_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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When Dynatrace detects a performance anomaly in a Caterpillar application, creates a ServiceNow problem record and notifies the application team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Dynatrace Performance Anomaly Response"
description: "When Dynatrace detects a performance anomaly in a Caterpillar application, creates a ServiceNow problem record and notifies the application team via Microsoft Teams."
tags:
- observability
- dynatrace
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: perf-ops
port: 8080
tools:
- name: handle-dynatrace-anomaly
description: "Given a Dynatrace problem ID, fetch the anomaly details (affected entities, impact, root cause), open a ServiceNow problem record, and send a Teams alert to the application team. Use for automated Dynatrace problem-to-ticket integration."
inputParameters:
- name: problem_id
in: body
type: string
description: "Dynatrace problem ID, e.g. P-12345."
steps:
- name: get-problem
type: call
call: "dynatrace.get-problem"
with:
problem_id: "{{problem_id}}"
- name: create-problem-record
type: call
call: "servicenow-prob.create-problem"
with:
short_description: "Dynatrace anomaly: {{get-problem.title}}"
description: "Impact: {{get-problem.impact_level}} | Affected entities: {{get-problem.affected_entity_count}} | Root cause: {{get-problem.root_cause}}"
- name: notify-app-team
type: call
call: "msteams-perf.send-message"
with:
channel: "app-performance"
text: "Dynatrace Anomaly {{problem_id}}: {{get-problem.title}} | Impact: {{get-problem.impact_level}} | PRB: {{create-problem-record.number}}"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://caterpillar.live.dynatrace.com/api/v2"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.dynatrace_token"
placement: header
resources:
- name: problems
path: "/problems/{{problem_id}}"
inputParameters:
- name: problem_id
in: path
operations:
- name: get-problem
method: GET
- type: http
namespace: servicenow-prob
baseUri: "https://caterpillar.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: msteams-perf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When Dynatrace detects a performance degradation, automatically creates a ServiceNow incident with full context, assigns it to the responsible team, and alerts via Teams.
naftiko: "0.5"
info:
label: "Dynatrace to ServiceNow Auto-Incident"
description: "When Dynatrace detects a performance degradation, automatically creates a ServiceNow incident with full context, assigns it to the responsible team, and alerts via Teams."
tags:
- monitoring
- incident-management
- dynatrace
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: auto-create-incident
description: "Given a Dynatrace problem ID, retrieve the full problem context, create a ServiceNow incident, and notify the responsible application team."
inputParameters:
- name: problem_id
in: body
type: string
description: "Dynatrace problem ID."
steps:
- name: get-problem
type: call
call: "dynatrace.get-problem"
with:
problem_id: "{{problem_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "{{get-problem.title}}"
description: "Root cause: {{get-problem.root_cause}}. Impact: {{get-problem.impact_level}}. Affected entities: {{get-problem.affected_entities}}."
impact: "{{get-problem.severity}}"
assignment_group: "{{get-problem.owner_team}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "{{get-problem.owner_team}}"
text: "Dynatrace problem detected: {{get-problem.title}}. SNOW incident: {{create-incident.number}}. Severity: {{get-problem.severity}}."
consumes:
- type: http
namespace: dynatrace
baseUri: "https://caterpillar.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: problems
path: "/problems/{{problem_id}}"
inputParameters:
- name: problem_id
in: path
operations:
- name: get-problem
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee."
tags:
- hr
- onboarding
- workday
- servicenow
- sharepoint
- 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: open a ServiceNow ticket, provision a SharePoint folder, and send a Teams welcome card. Invoke when HR confirms a new hire record is ready."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.display_name}}"
category: "hr_onboarding"
assignment_group: "IT_Onboarding"
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "hr-onboarding"
folder_path: "OnboardingDocs/{{get-worker.display_name}}_{{start_date}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Welcome to Caterpillar, {{get-worker.first_name}}! Your 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: "/caterpillar/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail-send
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Processes an engineering change order by creating a SAP engineering change record, updating the BOM in SAP, creating Jira tasks for affected teams, and notifying stakeholders via Teams.
naftiko: "0.5"
info:
label: "Engineering Change Order Workflow"
description: "Processes an engineering change order by creating a SAP engineering change record, updating the BOM in SAP, creating Jira tasks for affected teams, and notifying stakeholders via Teams."
tags:
- engineering
- change-management
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: process-eco
description: "Given an ECO number, material, and change description, create the SAP engineering change, generate Jira tasks for impacted teams, and notify stakeholders."
inputParameters:
- name: eco_number
in: body
type: string
description: "Engineering change order number."
- name: material_number
in: body
type: string
description: "Affected SAP material number."
- name: change_description
in: body
type: string
description: "Description of the engineering change."
steps:
- name: create-eco
type: call
call: "sap-s4.create-engineering-change"
with:
eco_number: "{{eco_number}}"
material: "{{material_number}}"
description: "{{change_description}}"
- name: create-design-task
type: call
call: "jira.create-issue"
with:
project: "ENG"
issuetype: "Task"
summary: "ECO {{eco_number}}: Update design for {{material_number}}"
description: "{{change_description}}"
- name: create-manufacturing-task
type: call
call: "jira.create-issue"
with:
project: "MFG"
issuetype: "Task"
summary: "ECO {{eco_number}}: Update manufacturing process for {{material_number}}"
description: "{{change_description}}"
- name: notify-stakeholders
type: call
call: "msteams.send-message"
with:
channel_id: "engineering-changes"
text: "ECO {{eco_number}} initiated for material {{material_number}}. Design task: {{create-design-task.key}}, Mfg task: {{create-manufacturing-task.key}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_ENGINEERING_CHANGE"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: engineering-changes
path: "/A_EngineeringChange"
operations:
- name: create-engineering-change
method: POST
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When an IoT sensor triggers a predictive maintenance alert, retrieves machine details from Oracle, creates a SAP maintenance order, and notifies the plant maintenance team via Teams.
naftiko: "0.5"
info:
label: "Equipment Predictive Maintenance Alert Handler"
description: "When an IoT sensor triggers a predictive maintenance alert, retrieves machine details from Oracle, creates a SAP maintenance order, and notifies the plant maintenance team via Teams."
tags:
- manufacturing
- predictive-maintenance
- oracle
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: maintenance
port: 8080
tools:
- name: handle-maintenance-alert
description: "Given an IoT alert ID and machine serial number, retrieve sensor data from Oracle IoT, create a preventive maintenance order in SAP PM, and notify the plant team."
inputParameters:
- name: alert_id
in: body
type: string
description: "IoT platform alert identifier."
- name: serial_number
in: body
type: string
description: "Machine serial number."
steps:
- name: get-sensor-data
type: call
call: "oracle-iot.get-telemetry"
with:
serial_number: "{{serial_number}}"
- name: create-maint-order
type: call
call: "sap-s4.create-maintenance-order"
with:
equipment: "{{serial_number}}"
order_type: "PM02"
description: "Predictive maintenance alert {{alert_id}} - vibration anomaly detected"
priority: "2"
- name: notify-plant
type: call
call: "msteams.send-message"
with:
channel_id: "plant-maintenance"
text: "Predictive maintenance order {{create-maint-order.order_number}} created for {{serial_number}}. Engine hours: {{get-sensor-data.engine_hours}}. Alert: {{alert_id}}."
consumes:
- type: http
namespace: oracle-iot
baseUri: "https://caterpillar.iot.oraclecloud.com/iot/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_iot_token"
resources:
- name: devices
path: "/devices/{{serial_number}}/deviceModels/urn:cat:telematics/attributes"
inputParameters:
- name: serial_number
in: path
operations:
- name: get-telemetry
method: GET
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/MaintenanceOrder"
operations:
- name: create-maintenance-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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Aggregates fleet utilization data from Oracle IoT and Snowflake analytics, generates a Power BI report refresh, and distributes the summary via email through Microsoft Outlook.
naftiko: "0.5"
info:
label: "Fleet Utilization Report Generator"
description: "Aggregates fleet utilization data from Oracle IoT and Snowflake analytics, generates a Power BI report refresh, and distributes the summary via email through Microsoft Outlook."
tags:
- fleet-management
- analytics
- oracle
- snowflake
- power-bi
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: fleet
port: 8080
tools:
- name: generate-utilization-report
description: "Given a date range and region, aggregate fleet utilization from Oracle IoT and Snowflake, trigger a Power BI refresh, and email the report to stakeholders."
inputParameters:
- name: start_date
in: body
type: string
description: "Report start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "Report end date in YYYY-MM-DD format."
- name: region
in: body
type: string
description: "Region code, e.g. NA, EMEA, APAC."
steps:
- name: query-utilization
type: call
call: "snowflake.query-utilization"
with:
start_date: "{{start_date}}"
end_date: "{{end_date}}"
region: "{{region}}"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "fleet-utilization-dataset"
- name: send-report
type: call
call: "outlook.send-email"
with:
to: "fleet-management@caterpillar.com"
subject: "Fleet Utilization Report: {{region}} ({{start_date}} to {{end_date}})"
body: "Fleet utilization report refreshed. Average utilization: {{query-utilization.avg_utilization}}%. Total machines: {{query-utilization.machine_count}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-utilization
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: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Teams engineering alert.
naftiko: "0.5"
info:
label: "GitHub Actions CI/CD Pipeline Failure Response"
description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Teams engineering alert."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions run ID, repository, branch, and failed job name, create a Jira bug, post a Datadog deployment event, and send an engineering Teams alert. Invoke on any protected-branch CI pipeline failure."
inputParameters:
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: repository
in: body
type: string
description: "GitHub repository full name, e.g. caterpillar/connected-machine-api."
- name: branch
in: body
type: string
description: "Branch name where the failure occurred."
- name: failed_job
in: body
type: string
description: "Name of the failed GitHub Actions job."
- name: commit_sha
in: body
type: string
description: "Git commit SHA that triggered the run."
steps:
- name: create-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repository}} / {{branch}} — {{failed_job}}"
description: "Run: {{run_id}} | Commit: {{commit_sha}}"
- name: post-dd-event
type: call
call: "datadog-events.create-event"
with:
title: "CI Failure: {{repository}}"
text: "Branch: {{branch}} | Job: {{failed_job}} | Commit: {{commit_sha}}"
tags: "env:cicd,repo:{{repository}}"
- name: notify-engineers
type: call
call: "msteams-eng.send-message"
with:
channel: "engineering-alerts"
text: "CI Failure: {{repository}} | Branch: {{branch}} | Job: {{failed_job}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: jira
baseUri: "https://caterpillar.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog-events
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-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers a GitHub Actions security scan on a Caterpillar repository and creates Jira security bugs for any high or critical vulnerability findings.
naftiko: "0.5"
info:
label: "GitHub Code Security Scan and Jira Ticket"
description: "Triggers a GitHub Actions security scan on a Caterpillar repository and creates Jira security bugs for any high or critical vulnerability findings."
tags:
- devops
- security
- github
- jira
capability:
exposes:
- type: mcp
namespace: devsec-ops
port: 8080
tools:
- name: trigger-security-scan
description: "Given a GitHub repository and branch, dispatch a security scanning workflow via GitHub Actions, then create a Jira security bug to track findings. Use for on-demand pre-release security validation or compliance-triggered scans."
inputParameters:
- name: repository
in: body
type: string
description: "GitHub repository full name, e.g. caterpillar/dealer-api."
- name: branch
in: body
type: string
description: "Branch to run the security scan against."
steps:
- name: dispatch-scan
type: call
call: "github.dispatch-workflow"
with:
repo: "{{repository}}"
workflow_id: "security-scan.yml"
ref: "{{branch}}"
- name: open-jira-bug
type: call
call: "jira-devsec.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "Security scan initiated: {{repository}}@{{branch}}"
description: "GitHub Actions scan dispatched. Run ID: {{dispatch-scan.run_id}}. Review findings when complete."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-dispatches
path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow_id
in: path
operations:
- name: dispatch-workflow
method: POST
- type: http
namespace: jira-devsec
baseUri: "https://caterpillar.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
When a GitHub release is published, triggers the CI/CD pipeline via GitHub Actions, creates a ServiceNow change record, and notifies the release management team via Teams.
naftiko: "0.5"
info:
label: "GitHub Release to Deployment Pipeline"
description: "When a GitHub release is published, triggers the CI/CD pipeline via GitHub Actions, creates a ServiceNow change record, and notifies the release management team via Teams."
tags:
- devops
- release-management
- github
- github-actions
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: release
port: 8080
tools:
- name: deploy-release
description: "Given a GitHub repository and release tag, trigger the deployment workflow, create a change record, and notify the release team."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in org/repo format."
- name: tag
in: body
type: string
description: "Release tag, e.g. v2.3.1."
- name: environment
in: body
type: string
description: "Deployment environment: staging, production."
steps:
- name: get-release
type: call
call: "github.get-release"
with:
repo: "{{repo}}"
tag: "{{tag}}"
- name: trigger-deploy
type: call
call: "github.trigger-workflow"
with:
repo: "{{repo}}"
workflow: "deploy.yml"
ref: "{{tag}}"
inputs: "{\"environment\": \"{{environment}}\"}"
- name: create-change
type: call
call: "servicenow.create-change"
with:
short_description: "Deploy {{repo}} {{tag}} to {{environment}}"
description: "Release notes: {{get-release.body}}"
type: "standard"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "release-management"
text: "Deployment initiated: {{repo}} {{tag}} to {{environment}}. Change: {{create-change.number}}. Workflow run: {{trigger-deploy.run_id}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: releases
path: "/repos/{{repo}}/releases/tags/{{tag}}"
inputParameters:
- name: repo
in: path
- name: tag
in: path
operations:
- name: get-release
method: GET
- name: workflow-dispatches
path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks a Caterpillar GitHub repository for compliance with branch protection rules, required status checks, and CODEOWNERS presence.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks a Caterpillar GitHub repository for compliance with branch protection rules, required status checks, and CODEOWNERS presence."
tags:
- devops
- compliance
- github
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: check-repo-compliance
description: "Given a GitHub repository name, verify branch protection is enabled, required reviews are configured, and CODEOWNERS file exists in Caterpillar's GitHub organization."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name within the Caterpillar org."
call: "github.get-branch-protection"
with:
repo_name: "{{repo_name}}"
outputParameters:
- name: protection_enabled
type: boolean
mapping: "$.enforce_admins.enabled"
- name: required_reviews
type: number
mapping: "$.required_pull_request_reviews.required_approving_review_count"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/caterpillar/{{repo_name}}/branches/main/protection"
inputParameters:
- name: repo_name
in: path
operations:
- name: get-branch-protection
method: GET
When a critical vulnerability is detected by Palo Alto Networks, creates a ServiceNow security incident, assigns remediation in Jira, and notifies the CISO team via Teams.
naftiko: "0.5"
info:
label: "IT Security Vulnerability Remediation Workflow"
description: "When a critical vulnerability is detected by Palo Alto Networks, creates a ServiceNow security incident, assigns remediation in Jira, and notifies the CISO team via Teams."
tags:
- security
- vulnerability-management
- palo-alto-networks
- servicenow
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security
port: 8080
tools:
- name: remediate-vulnerability
description: "Given a vulnerability ID and severity, create a ServiceNow security incident, a Jira remediation task, and send a Teams alert to the security operations team."
inputParameters:
- name: vuln_id
in: body
type: string
description: "Vulnerability identifier from Palo Alto."
- name: severity
in: body
type: string
description: "Vulnerability severity: critical, high, medium, low."
- name: affected_hosts
in: body
type: string
description: "Comma-separated list of affected hostnames."
steps:
- name: get-vuln-details
type: call
call: "paloalto.get-vulnerability"
with:
vuln_id: "{{vuln_id}}"
- name: create-incident
type: call
call: "servicenow.create-security-incident"
with:
short_description: "Critical vuln {{vuln_id}}: {{get-vuln-details.cve_id}}"
severity: "{{severity}}"
affected_ci: "{{affected_hosts}}"
- name: create-remediation
type: call
call: "jira.create-issue"
with:
project: "SEC"
issuetype: "Task"
summary: "Remediate {{get-vuln-details.cve_id}} on {{affected_hosts}}"
priority: "{{severity}}"
- name: alert-ciso
type: call
call: "msteams.send-message"
with:
channel_id: "security-ops"
text: "SECURITY ALERT: {{get-vuln-details.cve_id}} ({{severity}}) detected on {{affected_hosts}}. SNOW: {{create-incident.number}}, Jira: {{create-remediation.key}}."
consumes:
- type: http
namespace: paloalto
baseUri: "https://caterpillar-cortex.paloaltonetworks.com/public_api/v1"
authentication:
type: apiKey
key: "$secrets.paloalto_api_key"
resources:
- name: vulnerabilities
path: "/vulnerabilities/{{vuln_id}}"
inputParameters:
- name: vuln_id
in: path
operations:
- name: get-vulnerability
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: security-incidents
path: "/table/sn_si_incident"
operations:
- name: create-security-incident
method: POST
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves completed Caterpillar Jira sprints, calculates velocity metrics, and posts a sprint performance report to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Jira Agile Sprint Velocity Report"
description: "Retrieves completed Caterpillar Jira sprints, calculates velocity metrics, and posts a sprint performance report to the engineering Teams channel."
tags:
- devops
- jira
- reporting
- microsoft-teams
- agile
capability:
exposes:
- type: mcp
namespace: agile-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Retrieve the last N completed sprints for a Jira project board, calculate average velocity in story points, and post a sprint report to the engineering Teams channel. Use for sprint retrospectives or program increment planning."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key, e.g. CAT-DIG."
- name: sprint_count
in: body
type: integer
description: "Number of completed sprints to include."
steps:
- name: get-sprints
type: call
call: "jira-velocity.list-sprints"
with:
project_key: "{{project_key}}"
state: "closed"
max_results: "{{sprint_count}}"
- name: post-report
type: call
call: "msteams-agile.send-message"
with:
channel: "engineering-team"
text: "Sprint Velocity Report ({{project_key}}): avg {{get-sprints.avg_velocity}} pts/sprint over {{sprint_count}} sprints."
consumes:
- type: http
namespace: jira-velocity
baseUri: "https://caterpillar.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
- name: state
in: query
- name: max_results
in: query
operations:
- name: list-sprints
method: GET
- type: http
namespace: msteams-agile
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves engineering issue details from Caterpillar's Jira instance including status, assignee, priority, and linked requirements.
naftiko: "0.5"
info:
label: "Jira Engineering Issue Lookup"
description: "Retrieves engineering issue details from Caterpillar's Jira instance including status, assignee, priority, and linked requirements."
tags:
- engineering
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: get-issue
description: "Given a Jira issue key, retrieve the issue summary, status, assignee, and priority from Caterpillar's engineering Jira project."
inputParameters:
- name: issue_key
in: body
type: string
description: "Jira issue key, e.g. ENG-4521."
call: "jira.get-issue"
with:
issue_key: "{{issue_key}}"
outputParameters:
- name: summary
type: string
mapping: "$.fields.summary"
- name: status
type: string
mapping: "$.fields.status.name"
- name: assignee
type: string
mapping: "$.fields.assignee.displayName"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- type: http
namespace: jira
baseUri: "https://caterpillar.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
Fetches open Workday job requisitions and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly recruiting digest to the HR Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Recruiting Pipeline Digest"
description: "Fetches open Workday job requisitions and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly recruiting digest to the HR Teams channel."
tags:
- hr
- recruiting
- workday
- linkedin
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: digest-recruiting-pipeline
description: "Pull open Caterpillar job requisitions from Workday Recruiting, query LinkedIn Talent Solutions for matching candidate pipeline depth per role, and post a weekly recruiting digest to the HR Teams channel. Use for weekly talent acquisition reviews."
inputParameters:
- name: week_ending
in: body
type: string
description: "Week ending date in YYYY-MM-DD format."
steps:
- name: get-open-reqs
type: call
call: "workday-recruit.list-requisitions"
with:
status: "Open"
- name: get-candidate-pool
type: call
call: "linkedin.search-candidates"
with:
job_titles: "{{get-open-reqs.titles}}"
- name: post-digest
type: call
call: "msteams-ta.send-message"
with:
channel: "hr-talent-acquisition"
text: "Recruiting Digest (week of {{week_ending}}): {{get-open-reqs.count}} open reqs | {{get-candidate-pool.candidate_count}} LinkedIn candidates in pipeline."
consumes:
- type: http
namespace: workday-recruit
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/caterpillar/jobRequisitions"
operations:
- name: list-requisitions
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: talent-search
path: "/talentSearch"
operations:
- name: search-candidates
method: POST
- type: http
namespace: msteams-ta
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Syncs open Workday requisitions to LinkedIn Recruiter job postings, creates Jira tracking tasks for the hiring team, and posts pipeline updates to Teams.
naftiko: "0.5"
info:
label: "LinkedIn Talent Pipeline Sync"
description: "Syncs open Workday requisitions to LinkedIn Recruiter job postings, creates Jira tracking tasks for the hiring team, and posts pipeline updates to Teams."
tags:
- hr
- recruiting
- workday
- linkedin
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: talent
port: 8080
tools:
- name: sync-talent-pipeline
description: "Given a Workday requisition ID, publish to LinkedIn Recruiter, create a Jira tracking task, and post an update to the recruiting channel."
inputParameters:
- name: requisition_id
in: body
type: string
description: "Workday job requisition ID."
steps:
- name: get-requisition
type: call
call: "workday.get-requisition"
with:
req_id: "{{requisition_id}}"
- name: post-to-linkedin
type: call
call: "linkedin.create-job-posting"
with:
title: "{{get-requisition.job_title}}"
description: "{{get-requisition.job_description}}"
location: "{{get-requisition.location}}"
- name: create-tracker
type: call
call: "jira.create-issue"
with:
project: "HIRE"
issuetype: "Task"
summary: "Recruit: {{get-requisition.job_title}} ({{requisition_id}})"
description: "LinkedIn posting: {{post-to-linkedin.job_id}}. Hiring manager: {{get-requisition.hiring_manager}}."
- name: post-update
type: call
call: "msteams.send-message"
with:
channel_id: "recruiting"
text: "Job posted: {{get-requisition.job_title}} in {{get-requisition.location}}. LinkedIn ID: {{post-to-linkedin.job_id}}. Jira: {{create-tracker.key}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/caterpillar/jobRequisitions/{{req_id}}"
inputParameters:
- name: req_id
in: path
operations:
- name: get-requisition
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: job-postings
path: "/simpleJobPostings"
operations:
- name: create-job-posting
method: POST
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sends a formatted notification message to a specified Microsoft Teams channel in Caterpillar's tenant.
naftiko: "0.5"
info:
label: "Microsoft Teams Channel Notification"
description: "Sends a formatted notification message to a specified Microsoft Teams channel in Caterpillar's tenant."
tags:
- communications
- notifications
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: comms
port: 8080
tools:
- name: send-teams-notification
description: "Given a Teams channel webhook URL and message text, post a notification card to the specified Caterpillar Teams channel."
inputParameters:
- name: webhook_url
in: body
type: string
description: "Microsoft Teams incoming webhook URL."
- name: message
in: body
type: string
description: "Notification message text."
call: "msteams.post-webhook"
with:
webhook_url: "{{webhook_url}}"
message: "{{message}}"
consumes:
- type: http
namespace: msteams
baseUri: "{{webhook_url}}"
authentication:
type: none
resources:
- name: webhook
path: ""
operations:
- name: post-webhook
method: POST
Deploys a new API version to MuleSoft Anypoint, runs GitHub Actions test suite, creates a ServiceNow change record, and notifies the integration team via Teams.
naftiko: "0.5"
info:
label: "MuleSoft API Gateway Deployment Pipeline"
description: "Deploys a new API version to MuleSoft Anypoint, runs GitHub Actions test suite, creates a ServiceNow change record, and notifies the integration team via Teams."
tags:
- integration
- api-management
- mulesoft
- github-actions
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: integration
port: 8080
tools:
- name: deploy-api
description: "Given a MuleSoft application name and version, trigger deployment, run integration tests, log the change, and notify the team."
inputParameters:
- name: app_name
in: body
type: string
description: "MuleSoft application name."
- name: version
in: body
type: string
description: "Application version to deploy."
- name: environment
in: body
type: string
description: "Target environment: dev, staging, production."
steps:
- name: deploy-app
type: call
call: "mulesoft.deploy-application"
with:
app_name: "{{app_name}}"
version: "{{version}}"
environment: "{{environment}}"
- name: run-tests
type: call
call: "github.trigger-workflow"
with:
repo: "caterpillar/{{app_name}}"
workflow: "integration-tests.yml"
ref: "v{{version}}"
- name: create-change
type: call
call: "servicenow.create-change"
with:
short_description: "Deploy {{app_name}} v{{version}} to {{environment}}"
type: "standard"
category: "api_deployment"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "api-integrations"
text: "API deployed: {{app_name}} v{{version}} to {{environment}}. Test run: {{run-tests.run_id}}. Change: {{create-change.number}}."
consumes:
- type: http
namespace: mulesoft
baseUri: "https://anypoint.mulesoft.com/cloudhub/api/v2"
authentication:
type: bearer
token: "$secrets.mulesoft_token"
resources:
- name: applications
path: "/applications/{{app_name}}"
inputParameters:
- name: app_name
in: path
operations:
- name: deploy-application
method: PUT
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-dispatches
path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries MuleSoft Anypoint Platform for the status of all deployed Caterpillar APIs and posts an API health summary to the platform engineering Teams channel.
naftiko: "0.5"
info:
label: "MuleSoft API Health Check"
description: "Queries MuleSoft Anypoint Platform for the status of all deployed Caterpillar APIs and posts an API health summary to the platform engineering Teams channel."
tags:
- integration
- mulesoft
- microsoft-teams
- api
- monitoring
capability:
exposes:
- type: mcp
namespace: api-ops
port: 8080
tools:
- name: check-api-health
description: "Query MuleSoft Anypoint Platform for the current status of all deployed Caterpillar API applications. Post a summary (running, stopped, degraded counts) to the platform engineering Teams channel. Use for daily API operations reviews."
inputParameters:
- name: environment_name
in: body
type: string
description: "MuleSoft environment name, e.g. Production."
steps:
- name: get-api-status
type: call
call: "mulesoft.list-applications"
with:
environment: "{{environment_name}}"
- name: post-health-summary
type: call
call: "msteams-platform.send-message"
with:
channel: "platform-engineering"
text: "API Health ({{environment_name}}): {{get-api-status.running}} running, {{get-api-status.stopped}} stopped, {{get-api-status.degraded}} degraded."
consumes:
- type: http
namespace: mulesoft
baseUri: "https://anypoint.mulesoft.com/cloudhub/api"
authentication:
type: bearer
token: "$secrets.mulesoft_token"
resources:
- name: applications
path: "/applications"
inputParameters:
- name: environment
in: query
operations:
- name: list-applications
method: GET
- type: http
namespace: msteams-platform
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When New Relic detects a response time breach or error rate spike, creates a ServiceNow incident and posts a contextual alert to the engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "New Relic Application Performance Alert"
description: "When New Relic detects a response time breach or error rate spike, creates a ServiceNow incident and posts a contextual alert to the engineering Microsoft Teams channel."
tags:
- observability
- new-relic
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: apm-ops
port: 8080
tools:
- name: handle-apm-alert
description: "Given a New Relic alert condition ID and application name, retrieve the alert details, open a ServiceNow incident, and post a Teams notification with response time and error rate context. Use for automated APM alert handling."
inputParameters:
- name: alert_id
in: body
type: string
description: "New Relic alert condition ID."
- name: application_name
in: body
type: string
description: "Name of the application experiencing the issue."
steps:
- name: get-alert
type: call
call: "newrelic.get-alert-condition"
with:
condition_id: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow-apm.create-incident"
with:
short_description: "APM Alert: {{application_name}} — {{get-alert.name}}"
description: "New Relic condition: {{get-alert.name}} | Threshold: {{get-alert.threshold}} | Metric: {{get-alert.metric}}"
urgency: "1"
- name: notify-team
type: call
call: "msteams-apm.send-message"
with:
channel: "engineering-alerts"
text: "APM Alert: {{application_name}} | {{get-alert.name}} | INC: {{create-incident.number}}"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apikey
key: "X-Api-Key"
value: "$secrets.newrelic_api_key"
placement: header
resources:
- name: alert-conditions
path: "/alerts_conditions/{{condition_id}}.json"
inputParameters:
- name: condition_id
in: path
operations:
- name: get-alert-condition
method: GET
- type: http
namespace: servicenow-apm
baseUri: "https://caterpillar.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-apm
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the latest synthetic monitor check results from Caterpillar's New Relic account for critical application endpoints.
naftiko: "0.5"
info:
label: "New Relic Synthetic Monitor Status"
description: "Retrieves the latest synthetic monitor check results from Caterpillar's New Relic account for critical application endpoints."
tags:
- monitoring
- observability
- new-relic
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: get-synthetic-status
description: "Given a New Relic synthetic monitor ID, retrieve the latest check result, response time, and location from Caterpillar's monitoring platform."
inputParameters:
- name: monitor_id
in: body
type: string
description: "New Relic synthetic monitor ID."
call: "newrelic.get-synthetic"
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: status
type: string
mapping: "$.results[0].result"
- name: response_time_ms
type: number
mapping: "$.results[0].duration"
- name: location
type: string
mapping: "$.results[0].location"
consumes:
- type: http
namespace: newrelic
baseUri: "https://synthetics.newrelic.com/synthetics/api/v3"
authentication:
type: apiKey
key: "$secrets.newrelic_api_key"
resources:
- name: monitor-results
path: "/monitors/{{monitor_id}}/results?count=1"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-synthetic
method: GET
Routes a Caterpillar dealer support query through OpenAI's API to generate a first-response answer using product knowledge context, then logs the interaction to Salesforce Service Cloud.
naftiko: "0.5"
info:
label: "OpenAI Dealer Support Query Resolution"
description: "Routes a Caterpillar dealer support query through OpenAI's API to generate a first-response answer using product knowledge context, then logs the interaction to Salesforce Service Cloud."
tags:
- ai
- openai
- salesforce
- customer-support
- dealer
capability:
exposes:
- type: mcp
namespace: dealer-support
port: 8080
tools:
- name: resolve-dealer-query
description: "Given a dealer support query and dealer account ID, invoke OpenAI with Caterpillar product knowledge context to generate a suggested response, then create a Salesforce case with the AI-generated answer for agent review. Use for first-line dealer support triage."
inputParameters:
- name: query_text
in: body
type: string
description: "The dealer's support question or issue description."
- name: dealer_account_id
in: body
type: string
description: "Salesforce account ID for the dealer."
- name: product_model
in: body
type: string
description: "Caterpillar product model number the query relates to."
steps:
- name: generate-answer
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "You are a Caterpillar product support expert for model {{product_model}}. Answer: {{query_text}}"
- name: create-sf-case
type: call
call: "salesforce-case.create-case"
with:
account_id: "{{dealer_account_id}}"
subject: "Dealer Query: {{product_model}}"
description: "{{query_text}}"
ai_suggested_answer: "{{generate-answer.text}}"
consumes:
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- type: http
namespace: salesforce-case
baseUri: "https://caterpillar.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
Uses OpenAI to analyze machine fault codes and recommend replacement parts from SAP, then creates a dealer quote in Salesforce.
naftiko: "0.5"
info:
label: "OpenAI Parts Recommendation Engine"
description: "Uses OpenAI to analyze machine fault codes and recommend replacement parts from SAP, then creates a dealer quote in Salesforce."
tags:
- ai
- parts-management
- openai
- sap
- salesforce
capability:
exposes:
- type: mcp
namespace: service
port: 8080
tools:
- name: recommend-parts
description: "Given a machine model and fault code, use AI to identify likely required parts, look up availability in SAP, and create a parts quote in Salesforce."
inputParameters:
- name: machine_model
in: body
type: string
description: "Caterpillar machine model."
- name: fault_code
in: body
type: string
description: "Machine diagnostic fault code."
- name: dealer_id
in: body
type: string
description: "Dealer Salesforce account ID."
steps:
- name: analyze-fault
type: call
call: "openai.analyze-fault-code"
with:
model: "{{machine_model}}"
fault_code: "{{fault_code}}"
- name: check-inventory
type: call
call: "sap-s4.check-parts-availability"
with:
parts: "{{analyze-fault.recommended_parts}}"
- name: create-quote
type: call
call: "salesforce.create-quote"
with:
account_id: "{{dealer_id}}"
line_items: "{{check-inventory.available_parts}}"
description: "Parts recommendation for {{machine_model}} fault {{fault_code}}"
consumes:
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: analyze-fault-code
method: POST
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod"
operations:
- name: check-parts-availability
method: GET
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: quotes
path: "/sobjects/Quote"
operations:
- name: create-quote
method: POST
Retrieves fleet telematics data for a Caterpillar machine from Oracle IoT including GPS location, engine hours, and fault codes.
naftiko: "0.5"
info:
label: "Oracle Fleet Telematics Status"
description: "Retrieves fleet telematics data for a Caterpillar machine from Oracle IoT including GPS location, engine hours, and fault codes."
tags:
- fleet-management
- iot
- oracle
capability:
exposes:
- type: mcp
namespace: fleet
port: 8080
tools:
- name: get-machine-telemetry
description: "Given a machine serial number, retrieve the latest GPS coordinates, engine hours, fuel level, and active fault codes from Caterpillar's Oracle IoT fleet platform."
inputParameters:
- name: serial_number
in: body
type: string
description: "Caterpillar machine serial number."
call: "oracle-iot.get-telemetry"
with:
serial_number: "{{serial_number}}"
outputParameters:
- name: latitude
type: number
mapping: "$.device.location.latitude"
- name: longitude
type: number
mapping: "$.device.location.longitude"
- name: engine_hours
type: number
mapping: "$.device.metrics.engineHours"
- name: fuel_level_pct
type: number
mapping: "$.device.metrics.fuelLevelPercent"
consumes:
- type: http
namespace: oracle-iot
baseUri: "https://caterpillar.iot.oraclecloud.com/iot/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_iot_token"
resources:
- name: devices
path: "/devices/{{serial_number}}/deviceModels/urn:cat:telematics/attributes"
inputParameters:
- name: serial_number
in: path
operations:
- name: get-telemetry
method: GET
Retrieves the current on-call engineer for a given PagerDuty schedule in Caterpillar's incident management system.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer for a given PagerDuty schedule in Caterpillar's incident management system."
tags:
- it-operations
- incident-management
- pagerduty
capability:
exposes:
- type: mcp
namespace: incident-mgmt
port: 8080
tools:
- name: get-on-call
description: "Given a PagerDuty schedule ID, retrieve the current on-call user name, email, and escalation level for Caterpillar's operations team."
inputParameters:
- name: schedule_id
in: body
type: string
description: "PagerDuty schedule ID."
call: "pagerduty.get-oncall"
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: user_name
type: string
mapping: "$.oncalls[0].user.name"
- name: user_email
type: string
mapping: "$.oncalls[0].user.email"
- name: escalation_level
type: number
mapping: "$.oncalls[0].escalation_level"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: oncalls
path: "/oncalls?schedule_ids[]={{schedule_id}}"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-oncall
method: GET
Retrieves Caterpillar's Palo Alto Networks firewall security rules, flags overly permissive policies, and creates a ServiceNow change request for remediation.
naftiko: "0.5"
info:
label: "Palo Alto Networks Security Policy Audit"
description: "Retrieves Caterpillar's Palo Alto Networks firewall security rules, flags overly permissive policies, and creates a ServiceNow change request for remediation."
tags:
- security
- palo-alto-networks
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: audit-firewall-policies
description: "Retrieve all security policies from the Caterpillar Palo Alto Networks firewall, identify rules with overly permissive source/destination, and create a ServiceNow change request for remediation. Use for quarterly security compliance audits."
inputParameters:
- name: firewall_hostname
in: body
type: string
description: "Palo Alto Networks firewall hostname to audit."
steps:
- name: get-policies
type: call
call: "paloalto.get-security-rules"
with:
hostname: "{{firewall_hostname}}"
- name: open-change
type: call
call: "servicenow-sec.create-change"
with:
short_description: "Firewall policy audit — {{firewall_hostname}}"
description: "Policy review complete. {{get-policies.permissive_count}} overly permissive rules identified for remediation."
category: "security_audit"
consumes:
- type: http
namespace: paloalto
baseUri: "https://{{hostname}}/restapi/v10.1"
authentication:
type: apikey
key: "X-PAN-KEY"
value: "$secrets.paloalto_api_key"
placement: header
resources:
- name: security-rules
path: "/Objects/SecurityRules"
operations:
- name: get-security-rules
method: GET
- type: http
namespace: servicenow-sec
baseUri: "https://caterpillar.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
Aggregates plant energy consumption data from Oracle IoT sensors and Snowflake, compares against sustainability targets, and distributes reports via Outlook to the sustainability team.
naftiko: "0.5"
info:
label: "Plant Energy Consumption Monitor"
description: "Aggregates plant energy consumption data from Oracle IoT sensors and Snowflake, compares against sustainability targets, and distributes reports via Outlook to the sustainability team."
tags:
- sustainability
- energy-management
- oracle
- snowflake
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: sustainability
port: 8080
tools:
- name: monitor-energy
description: "Given a plant code and date range, aggregate energy consumption, compare to targets, and email the sustainability report."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code."
- name: period
in: body
type: string
description: "Reporting period, e.g. 2026-Q1."
steps:
- name: get-sensor-data
type: call
call: "oracle-iot.get-energy-metrics"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: get-targets
type: call
call: "snowflake.query-energy-targets"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: send-report
type: call
call: "outlook.send-email"
with:
to: "sustainability@caterpillar.com"
subject: "Energy Consumption Report: Plant {{plant_code}} - {{period}}"
body: "Total consumption: {{get-sensor-data.total_kwh}} kWh. Target: {{get-targets.target_kwh}} kWh. Variance: {{get-targets.variance_pct}}%."
consumes:
- type: http
namespace: oracle-iot
baseUri: "https://caterpillar.iot.oraclecloud.com/iot/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_iot_token"
resources:
- name: energy-metrics
path: "/devices?type=energy_meter&plant={{plant}}"
inputParameters:
- name: plant
in: query
operations:
- name: get-energy-metrics
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-energy-targets
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Orchestrates multi-level approval chains via Power Automate, logs decisions in ServiceNow, and sends final approval notifications via Outlook.
naftiko: "0.5"
info:
label: "Power Automate Approval Chain Orchestrator"
description: "Orchestrates multi-level approval chains via Power Automate, logs decisions in ServiceNow, and sends final approval notifications via Outlook."
tags:
- workflow
- approval
- microsoft-power-automate
- servicenow
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: workflow
port: 8080
tools:
- name: orchestrate-approval
description: "Given a request type and details, trigger a Power Automate approval flow, log the decision in ServiceNow, and email the requestor."
inputParameters:
- name: request_type
in: body
type: string
description: "Type of approval request."
- name: request_details
in: body
type: string
description: "Details of the request."
- name: requestor_email
in: body
type: string
description: "Requestor email address."
steps:
- name: trigger-approval
type: call
call: "power-automate.trigger-flow"
with:
flow_id: "approval-chain"
request_type: "{{request_type}}"
details: "{{request_details}}"
- name: log-decision
type: call
call: "servicenow.create-task"
with:
short_description: "Approval: {{request_type}} - {{trigger-approval.status}}"
description: "{{request_details}}. Decision: {{trigger-approval.decision}}."
- name: notify-requestor
type: call
call: "outlook.send-email"
with:
to: "{{requestor_email}}"
subject: "Approval Decision: {{request_type}}"
body: "Your {{request_type}} request has been {{trigger-approval.decision}}. Reference: {{log-decision.number}}."
consumes:
- type: http
namespace: power-automate
baseUri: "https://prod-00.westus.logic.azure.com/workflows"
authentication:
type: bearer
token: "$secrets.power_automate_token"
resources:
- name: flows
path: "/{{flow_id}}/triggers/manual/paths/invoke"
inputParameters:
- name: flow_id
in: path
operations:
- name: trigger-flow
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Retrieves the latest dealer sales report dataset refresh status and key metrics from Caterpillar's Power BI workspace.
naftiko: "0.5"
info:
label: "Power BI Dealer Sales Report Lookup"
description: "Retrieves the latest dealer sales report dataset refresh status and key metrics from Caterpillar's Power BI workspace."
tags:
- analytics
- sales
- power-bi
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-dealer-sales-report
description: "Given a Power BI dataset ID, retrieve the last refresh timestamp and status from Caterpillar's dealer sales analytics workspace."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
call: "powerbi.get-refresh-status"
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: refresh_status
type: string
mapping: "$.value[0].status"
- name: end_time
type: string
mapping: "$.value[0].endTime"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes?$top=1"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh-status
method: GET
Triggers a Power BI dataset refresh for the Caterpillar executive KPI dashboard and notifies leadership via Microsoft Teams when the refresh is complete.
naftiko: "0.5"
info:
label: "Power BI Executive KPI Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the Caterpillar executive KPI dashboard and notifies leadership via Microsoft Teams when the refresh is complete."
tags:
- data
- analytics
- power-bi
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: exec-reporting
port: 8080
tools:
- name: refresh-executive-dashboard
description: "Trigger a dataset refresh on the Caterpillar executive KPI Power BI dashboard and notify the leadership Teams channel on completion. Use before board meetings or executive business reviews."
inputParameters:
- name: notify_channel
in: body
type: string
description: "Teams channel to notify on refresh completion."
steps:
- name: trigger-refresh
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.powerbi_exec_dataset_id"
- name: notify-leadership
type: call
call: "msteams-exec.send-message"
with:
channel: "{{notify_channel}}"
text: "Executive KPI Dashboard refresh triggered. Status: {{trigger-refresh.status}}. Dashboard will be updated shortly."
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: trigger-refresh
method: POST
- type: http
namespace: msteams-exec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a quality nonconformance is detected on the manufacturing floor, creates a quality notification in SAP QM, opens a Jira investigation ticket, and alerts the quality engineering team via Teams.
naftiko: "0.5"
info:
label: "Production Quality Nonconformance Workflow"
description: "When a quality nonconformance is detected on the manufacturing floor, creates a quality notification in SAP QM, opens a Jira investigation ticket, and alerts the quality engineering team via Teams."
tags:
- manufacturing
- quality
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: quality
port: 8080
tools:
- name: handle-nonconformance
description: "Given a production order, defect code, and description, create a SAP quality notification, open a Jira investigation ticket, and notify the quality team."
inputParameters:
- name: production_order
in: body
type: string
description: "SAP production order number."
- name: defect_code
in: body
type: string
description: "Defect classification code."
- name: description
in: body
type: string
description: "Description of the nonconformance."
steps:
- name: create-qn
type: call
call: "sap-s4.create-quality-notification"
with:
notification_type: "Q2"
order_number: "{{production_order}}"
defect_code: "{{defect_code}}"
description: "{{description}}"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "QUAL"
issuetype: "Bug"
summary: "NCR investigation: {{defect_code}} on order {{production_order}}"
description: "Quality notification {{create-qn.notification_number}}: {{description}}"
- name: notify-quality
type: call
call: "msteams.send-message"
with:
channel_id: "quality-engineering"
text: "NCR raised: SAP QN {{create-qn.notification_number}}, Jira {{create-jira.key}}. Production order {{production_order}}, defect {{defect_code}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates quarterly close verification by checking SAP period close status, validating Snowflake financial data reconciliation, and distributing the close checklist via Teams.
naftiko: "0.5"
info:
label: "Quarterly Financial Close Verification"
description: "Orchestrates quarterly close verification by checking SAP period close status, validating Snowflake financial data reconciliation, and distributing the close checklist via Teams."
tags:
- finance
- financial-close
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: verify-quarterly-close
description: "Given a fiscal period and company code, verify SAP period close status, check Snowflake reconciliation totals, and post the close status to the finance team."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "SAP fiscal period, e.g. 2026003."
- name: company_code
in: body
type: string
description: "SAP company code."
steps:
- name: check-period
type: call
call: "sap-s4.get-period-status"
with:
period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: check-recon
type: call
call: "snowflake.query-reconciliation"
with:
period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: post-status
type: call
call: "msteams.send-message"
with:
channel_id: "finance-close"
text: "Q Close {{fiscal_period}} for {{company_code}}: SAP status={{check-period.status}}, Recon variance={{check-recon.variance_amount}}. All subledgers: {{check-period.subledger_status}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRY_PERIOD_CLOSE"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close
path: "/PeriodClose(FiscalPeriod='{{period}}',CompanyCode='{{company_code}}')"
inputParameters:
- name: period
in: path
- name: company_code
in: path
operations:
- name: get-period-status
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-reconciliation
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a safety incident is reported, creates a ServiceNow safety case, logs the event in SAP EHS, notifies the safety officer and plant manager via Teams, and updates the Snowflake safety dashboard.
naftiko: "0.5"
info:
label: "Safety Incident Reporting Chain"
description: "When a safety incident is reported, creates a ServiceNow safety case, logs the event in SAP EHS, notifies the safety officer and plant manager via Teams, and updates the Snowflake safety dashboard."
tags:
- safety
- compliance
- servicenow
- sap
- microsoft-teams
- snowflake
capability:
exposes:
- type: mcp
namespace: safety
port: 8080
tools:
- name: report-safety-incident
description: "Given incident details, create records across ServiceNow, SAP EHS, notify leadership, and update analytics."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code where incident occurred."
- name: incident_type
in: body
type: string
description: "Type of safety incident."
- name: description
in: body
type: string
description: "Incident description."
- name: severity
in: body
type: string
description: "Severity level: minor, moderate, serious, critical."
steps:
- name: create-snow-case
type: call
call: "servicenow.create-case"
with:
short_description: "Safety incident at {{plant_code}}: {{incident_type}}"
severity: "{{severity}}"
description: "{{description}}"
category: "safety"
- name: log-ehs
type: call
call: "sap-s4.create-ehs-notification"
with:
plant: "{{plant_code}}"
notification_type: "safety"
description: "{{description}}"
- name: notify-leadership
type: call
call: "msteams.send-message"
with:
channel_id: "safety-leadership"
text: "SAFETY INCIDENT: {{incident_type}} at plant {{plant_code}} ({{severity}}). SNOW case {{create-snow-case.number}}, SAP EHS {{log-ehs.notification_number}}."
- name: update-dashboard
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO safety_incidents VALUES ('{{plant_code}}', '{{incident_type}}', '{{severity}}', '{{create-snow-case.number}}', CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cases
path: "/table/sn_customerservice_case"
operations:
- name: create-case
method: POST
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_EHS_NOTIFICATION"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ehs-notifications
path: "/EHSNotification"
operations:
- name: create-ehs-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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Retrieves Caterpillar dealer account details from Salesforce including territory, tier, and primary contact information.
naftiko: "0.5"
info:
label: "Salesforce Dealer Account Lookup"
description: "Retrieves Caterpillar dealer account details from Salesforce including territory, tier, and primary contact information."
tags:
- sales
- dealer-management
- salesforce
capability:
exposes:
- type: mcp
namespace: sales
port: 8080
tools:
- name: get-dealer-account
description: "Given a Salesforce account ID, retrieve the dealer name, territory, tier classification, and primary contact for Caterpillar's dealer network."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID for the dealer."
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
outputParameters:
- name: dealer_name
type: string
mapping: "$.Name"
- name: territory
type: string
mapping: "$.Territory__c"
- name: tier
type: string
mapping: "$.Dealer_Tier__c"
- name: primary_contact
type: string
mapping: "$.Primary_Contact__r.Name"
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.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
Retrieves campaign performance metrics from Salesforce Marketing Cloud and publishes a weekly digest to the marketing Microsoft Teams channel and Power BI.
naftiko: "0.5"
info:
label: "Salesforce Marketing Cloud Campaign Performance Digest"
description: "Retrieves campaign performance metrics from Salesforce Marketing Cloud and publishes a weekly digest to the marketing Microsoft Teams channel and Power BI."
tags:
- marketing
- salesforce
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: marketing-reporting
port: 8080
tools:
- name: digest-campaign-performance
description: "Retrieve email campaign performance metrics (open rate, click rate, conversions) from Salesforce Marketing Cloud for the trailing 7 days and push a summary to Power BI and the marketing Teams channel. Use for weekly campaign reviews."
inputParameters:
- name: campaign_type
in: body
type: string
description: "Campaign type filter, e.g. 'dealer_email' or 'product_launch'."
steps:
- name: get-campaign-metrics
type: call
call: "sfmc.get-campaign-data"
with:
campaign_type: "{{campaign_type}}"
- name: push-to-powerbi
type: call
call: "powerbi-mkt.push-rows"
with:
dataset_id: "$secrets.powerbi_marketing_dataset_id"
table: "CampaignMetrics"
rows: "{{get-campaign-metrics.data}}"
- name: post-digest
type: call
call: "msteams-mkt.send-message"
with:
channel: "marketing-team"
text: "Campaign Digest ({{campaign_type}}): Open rate {{get-campaign-metrics.open_rate}}% | Click rate {{get-campaign-metrics.click_rate}}% | Conversions {{get-campaign-metrics.conversions}}"
consumes:
- type: http
namespace: sfmc
baseUri: "https://caterpillar.rest.marketingcloudapis.com/messaging/v1"
authentication:
type: bearer
token: "$secrets.sfmc_token"
resources:
- name: campaigns
path: "/email/definitions"
inputParameters:
- name: campaign_type
in: query
operations:
- name: get-campaign-data
method: GET
- type: http
namespace: powerbi-mkt
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}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-mkt
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a Salesforce opportunity moves to Closed Won, updates the SAP customer master record and sends a deal notification to the account team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Opportunity and Account Sync"
description: "When a Salesforce opportunity moves to Closed Won, updates the SAP customer master record and sends a deal notification to the account team via Microsoft Teams."
tags:
- crm
- sales
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-sales
port: 8080
tools:
- name: sync-closed-won-opportunity
description: "Given a Salesforce opportunity ID that has moved to Closed Won, fetch the deal details, update the SAP customer record with the new contract information, and notify the account team in Teams. Use for post-sale ERP synchronization."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity record ID."
steps:
- name: get-opportunity
type: call
call: "salesforce-opp.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: update-sap-customer
type: call
call: "sap-customer.update-customer"
with:
customer_id: "{{get-opportunity.account_external_id}}"
contract_value: "{{get-opportunity.amount}}"
close_date: "{{get-opportunity.close_date}}"
- name: notify-team
type: call
call: "msteams-sales.send-message"
with:
channel: "sales-wins"
text: "Deal Closed: {{get-opportunity.name}} | ${{get-opportunity.amount}} | Account: {{get-opportunity.account_name}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-customer
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_Customer('{{customer_id}}')"
inputParameters:
- name: customer_id
in: path
operations:
- name: update-customer
method: PATCH
- type: http
namespace: msteams-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Identifies expiring service contracts in SAP, creates renewal opportunities in Salesforce, and assigns them to the appropriate dealer account manager with a Teams notification.
naftiko: "0.5"
info:
label: "Salesforce Renewal Opportunity Creator"
description: "Identifies expiring service contracts in SAP, creates renewal opportunities in Salesforce, and assigns them to the appropriate dealer account manager with a Teams notification."
tags:
- sales
- contract-management
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sales
port: 8080
tools:
- name: create-renewal-opportunities
description: "Given a contract expiration window, find expiring SAP service contracts, create Salesforce renewal opportunities, and notify account managers."
inputParameters:
- name: days_to_expiry
in: body
type: number
description: "Number of days until contract expiration."
steps:
- name: get-expiring-contracts
type: call
call: "sap-s4.get-expiring-contracts"
with:
days: "{{days_to_expiry}}"
- name: create-opportunities
type: call
call: "salesforce.create-opportunity"
with:
name: "Renewal: {{get-expiring-contracts.contract_id}} - {{get-expiring-contracts.customer_name}}"
account_id: "{{get-expiring-contracts.sf_account_id}}"
close_date: "{{get-expiring-contracts.expiry_date}}"
type: "Renewal"
- name: notify-managers
type: call
call: "msteams.send-message"
with:
channel_id: "sales-renewals"
text: "Renewal opportunities created: {{get-expiring-contracts.count}} contracts expiring within {{days_to_expiry}} days. Review in Salesforce."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_SERVICE_CONTRACT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: contracts
path: "/A_ServiceContract?$filter=ExpiryDate le datetime'{{cutoff_date}}'"
operations:
- name: get-expiring-contracts
method: GET
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- 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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Caterpillar's quarterly sales forecast from Salesforce Sales Cloud and pushes the data to SAP S/4HANA for financial planning integration.
naftiko: "0.5"
info:
label: "Salesforce Sales Cloud Forecast Sync to SAP"
description: "Retrieves Caterpillar's quarterly sales forecast from Salesforce Sales Cloud and pushes the data to SAP S/4HANA for financial planning integration."
tags:
- crm
- sales
- salesforce
- sap
- finance
- forecasting
capability:
exposes:
- type: mcp
namespace: forecast-sync
port: 8080
tools:
- name: sync-sales-forecast-to-sap
description: "Retrieve the current quarter Salesforce Sales Cloud forecast by region and product family, then push the aggregate forecast figures to SAP S/4HANA CO-PA for financial planning. Use for monthly sales-to-finance forecast synchronization."
inputParameters:
- name: fiscal_quarter
in: body
type: string
description: "Fiscal quarter to sync, e.g. Q2-2026."
steps:
- name: get-sf-forecast
type: call
call: "salesforce-forecast.query-forecast"
with:
quarter: "{{fiscal_quarter}}"
- name: push-to-sap-copa
type: call
call: "sap-copa.post-plan-data"
with:
fiscal_quarter: "{{fiscal_quarter}}"
forecast_data: "{{get-sf-forecast.data}}"
consumes:
- type: http
namespace: salesforce-forecast
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: forecasts
path: "/query"
operations:
- name: query-forecast
method: GET
- type: http
namespace: sap-copa
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_COPAACTUALLINEITEMSQUERY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: plan-data
path: "/A_CopaPlanData"
operations:
- name: post-plan-data
method: POST
Converts a won Salesforce opportunity into a SAP sales order, validates pricing against the SAP condition record, and sends the order confirmation to the dealer via Outlook.
naftiko: "0.5"
info:
label: "Salesforce to SAP Quote Conversion"
description: "Converts a won Salesforce opportunity into a SAP sales order, validates pricing against the SAP condition record, and sends the order confirmation to the dealer via Outlook."
tags:
- sales
- order-management
- salesforce
- sap
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: sales
port: 8080
tools:
- name: convert-quote-to-order
description: "Given a Salesforce opportunity ID, create a SAP sales order with the quoted line items, validate pricing, and send confirmation."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
steps:
- name: get-opportunity
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: create-sales-order
type: call
call: "sap-s4.create-sales-order"
with:
sold_to: "{{get-opportunity.dealer_sap_id}}"
materials: "{{get-opportunity.line_items}}"
requested_delivery: "{{get-opportunity.requested_delivery_date}}"
- name: update-opportunity
type: call
call: "salesforce.update-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
sap_order: "{{create-sales-order.order_number}}"
stage: "Closed Won - Order Created"
- name: send-confirmation
type: call
call: "outlook.send-email"
with:
to: "{{get-opportunity.dealer_contact_email}}"
subject: "Order Confirmation: SAP Order {{create-sales-order.order_number}}"
body: "Your order has been confirmed. SAP Order: {{create-sales-order.order_number}}. Estimated delivery: {{create-sales-order.delivery_date}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.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
- name: update-opportunity
method: PATCH
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder"
operations:
- name: create-sales-order
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Retrieves bill of materials from SAP, calculates cost rollup via Snowflake, and distributes the cost analysis report via Outlook to product management.
naftiko: "0.5"
info:
label: "SAP BOM Cost Rollup and Report"
description: "Retrieves bill of materials from SAP, calculates cost rollup via Snowflake, and distributes the cost analysis report via Outlook to product management."
tags:
- engineering
- cost-management
- sap
- snowflake
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: rollup-bom-cost
description: "Given a SAP material number, retrieve the BOM structure, calculate cost rollup in Snowflake, and email the analysis to product management."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP finished goods material number."
- name: plant
in: body
type: string
description: "SAP plant code."
steps:
- name: get-bom
type: call
call: "sap-s4.get-bom"
with:
material: "{{material_number}}"
plant: "{{plant}}"
- name: calculate-cost
type: call
call: "snowflake.query-cost-rollup"
with:
material: "{{material_number}}"
plant: "{{plant}}"
- name: send-report
type: call
call: "outlook.send-email"
with:
to: "product-cost-analysis@caterpillar.com"
subject: "BOM Cost Rollup: {{material_number}} at {{plant}}"
body: "Material: {{material_number}}. Total BOM cost: {{calculate-cost.total_cost}}. Component count: {{get-bom.component_count}}. Highest cost component: {{calculate-cost.top_component}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_BILL_OF_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: bom
path: "/MaterialBOM(Material='{{material}}',Plant='{{plant}}')"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-bom
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-cost-rollup
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/me/sendMail"
operations:
- name: send-email
method: POST
Retrieves submitted expense reports in SAP Concur and flags reports that exceed Caterpillar's travel policy limits, creating a ServiceNow review task for each exception.
naftiko: "0.5"
info:
label: "SAP Concur Expense Compliance Check"
description: "Retrieves submitted expense reports in SAP Concur and flags reports that exceed Caterpillar's travel policy limits, creating a ServiceNow review task for each exception."
tags:
- finance
- expense-management
- sap-concur
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: expense-compliance
port: 8080
tools:
- name: check-expense-policy-compliance
description: "Retrieve submitted expense reports from SAP Concur, identify any that exceed Caterpillar travel and entertainment policy limits, and create a ServiceNow compliance review task for each exception. Use for automated T&E policy enforcement."
inputParameters:
- name: report_period
in: body
type: string
description: "Expense report period to review, e.g. 2026-03."
- name: policy_limit_usd
in: body
type: number
description: "Maximum allowable single-report amount in USD before review."
steps:
- name: get-reports
type: call
call: "concur.list-expense-reports"
with:
period: "{{report_period}}"
status: "SUBMITTED"
- name: create-review-task
type: call
call: "servicenow-expense.create-incident"
with:
short_description: "Expense policy exception review — period {{report_period}}"
description: "{{get-reports.exception_count}} reports exceed the ${{policy_limit_usd}} threshold for the period {{report_period}}. Review required."
category: "expense_compliance"
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports"
inputParameters:
- name: period
in: query
- name: status
in: query
operations:
- name: list-expense-reports
method: GET
- type: http
namespace: servicenow-expense
baseUri: "https://caterpillar.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
Processes customer returns by creating a SAP returns order, updating the Salesforce case, issuing a credit memo, and notifying the dealer services team via Teams.
naftiko: "0.5"
info:
label: "SAP Customer Returns Processing"
description: "Processes customer returns by creating a SAP returns order, updating the Salesforce case, issuing a credit memo, and notifying the dealer services team via Teams."
tags:
- customer-service
- returns
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: returns
port: 8080
tools:
- name: process-return
description: "Given a Salesforce case ID and return reason, create a SAP returns order, update the case, and notify dealer services."
inputParameters:
- name: case_id
in: body
type: string
description: "Salesforce case ID."
- name: return_reason
in: body
type: string
description: "Return reason code."
steps:
- name: get-case
type: call
call: "salesforce.get-case"
with:
case_id: "{{case_id}}"
- name: create-returns-order
type: call
call: "sap-s4.create-returns-order"
with:
customer: "{{get-case.account_sap_id}}"
material: "{{get-case.product_number}}"
reason: "{{return_reason}}"
- name: update-case
type: call
call: "salesforce.update-case"
with:
case_id: "{{case_id}}"
status: "Return In Progress"
sap_returns_order: "{{create-returns-order.order_number}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "dealer-services"
text: "Return processed: SAP order {{create-returns-order.order_number}} for case {{case_id}}. Reason: {{return_reason}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- name: update-case
method: PATCH
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_RETURNS_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: returns-orders
path: "/A_ReturnsOrder"
operations:
- name: create-returns-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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes fixed asset capitalization in SAP, updates the ServiceNow CMDB, logs in Snowflake for reporting, and notifies the finance team via Teams.
naftiko: "0.5"
info:
label: "SAP Fixed Asset Capitalization Workflow"
description: "Processes fixed asset capitalization in SAP, updates the ServiceNow CMDB, logs in Snowflake for reporting, and notifies the finance team via Teams."
tags:
- finance
- asset-management
- sap
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: capitalize-asset
description: "Given asset details, create the SAP fixed asset record, update ServiceNow CMDB, log for reporting, and notify finance."
inputParameters:
- name: asset_description
in: body
type: string
description: "Description of the asset."
- name: cost_center
in: body
type: string
description: "SAP cost center."
- name: acquisition_value
in: body
type: number
description: "Acquisition value in USD."
steps:
- name: create-asset
type: call
call: "sap-s4.create-fixed-asset"
with:
description: "{{asset_description}}"
cost_center: "{{cost_center}}"
acquisition_value: "{{acquisition_value}}"
- name: update-cmdb
type: call
call: "servicenow.create-ci"
with:
name: "{{asset_description}}"
asset_tag: "{{create-asset.asset_number}}"
cost_center: "{{cost_center}}"
- name: log-capitalization
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO asset_capitalizations VALUES ('{{create-asset.asset_number}}', '{{asset_description}}', {{acquisition_value}}, '{{cost_center}}', CURRENT_TIMESTAMP())"
- name: notify-finance
type: call
call: "msteams.send-message"
with:
channel_id: "fixed-assets"
text: "Asset capitalized: {{create-asset.asset_number}} - {{asset_description}}. Value: ${{acquisition_value}}. Cost center: {{cost_center}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: fixed-assets
path: "/A_FixedAsset"
operations:
- name: create-fixed-asset
method: POST
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb
path: "/table/cmdb_ci_hardware"
operations:
- name: create-ci
method: POST
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves goods receipt document details from Caterpillar's SAP system including posting date, quantity, and storage location.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Lookup"
description: "Retrieves goods receipt document details from Caterpillar's SAP system including posting date, quantity, and storage location."
tags:
- logistics
- erp
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-goods-receipt
description: "Given a SAP material document number, retrieve the posting date, quantity received, storage location, and movement type from Caterpillar's SAP system."
inputParameters:
- name: doc_number
in: body
type: string
description: "SAP material document number."
call: "sap-s4.get-goods-receipt"
with:
doc_number: "{{doc_number}}"
outputParameters:
- name: posting_date
type: string
mapping: "$.d.PostingDate"
- name: quantity
type: number
mapping: "$.d.Quantity"
- name: storage_location
type: string
mapping: "$.d.StorageLocation"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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('{{doc_number}}')"
inputParameters:
- name: doc_number
in: path
operations:
- name: get-goods-receipt
method: GET
Reconciles intercompany invoices across SAP company codes, flags mismatches, logs discrepancies in Snowflake, and alerts the corporate accounting team via Teams.
naftiko: "0.5"
info:
label: "SAP Intercompany Invoice Reconciliation"
description: "Reconciles intercompany invoices across SAP company codes, flags mismatches, logs discrepancies in Snowflake, and alerts the corporate accounting team via Teams."
tags:
- finance
- accounting
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: reconcile-intercompany
description: "Given two SAP company codes and a fiscal period, compare intercompany balances, log discrepancies, and alert accounting."
inputParameters:
- name: company_code_1
in: body
type: string
description: "First SAP company code."
- name: company_code_2
in: body
type: string
description: "Second SAP company code."
- name: fiscal_period
in: body
type: string
description: "Fiscal period for reconciliation."
steps:
- name: get-balances-1
type: call
call: "sap-s4.get-intercompany-balance"
with:
company_code: "{{company_code_1}}"
partner: "{{company_code_2}}"
period: "{{fiscal_period}}"
- name: get-balances-2
type: call
call: "sap-s4.get-intercompany-balance"
with:
company_code: "{{company_code_2}}"
partner: "{{company_code_1}}"
period: "{{fiscal_period}}"
- name: log-discrepancy
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO intercompany_recon VALUES ('{{company_code_1}}', '{{company_code_2}}', '{{fiscal_period}}', {{get-balances-1.balance}}, {{get-balances-2.balance}}, CURRENT_TIMESTAMP())"
- name: alert-accounting
type: call
call: "msteams.send-message"
with:
channel_id: "corporate-accounting"
text: "Intercompany recon: {{company_code_1}} vs {{company_code_2}} for {{fiscal_period}}. Balance 1: {{get-balances-1.balance}}, Balance 2: {{get-balances-2.balance}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: journal-entries
path: "/A_JournalEntry?$filter=CompanyCode eq '{{company_code}}' and TradingPartner eq '{{partner}}'"
inputParameters:
- name: company_code
in: query
- name: partner
in: query
operations:
- name: get-intercompany-balance
method: GET
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When inventory falls below reorder point in SAP, creates a purchase requisition, notifies the procurement team via Teams, and logs the event in Snowflake.
naftiko: "0.5"
info:
label: "SAP Inventory Reorder Point Alert"
description: "When inventory falls below reorder point in SAP, creates a purchase requisition, notifies the procurement team via Teams, and logs the event in Snowflake."
tags:
- supply-chain
- procurement
- sap
- microsoft-teams
- snowflake
capability:
exposes:
- type: mcp
namespace: supply-chain
port: 8080
tools:
- name: handle-reorder-alert
description: "Given a material number and plant, check SAP inventory levels, create a purchase requisition if below reorder point, notify procurement, and log the event."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: plant
in: body
type: string
description: "SAP plant code."
steps:
- name: check-inventory
type: call
call: "sap-s4.get-inventory"
with:
material: "{{material_number}}"
plant: "{{plant}}"
- name: create-pr
type: call
call: "sap-s4.create-purchase-requisition"
with:
material: "{{material_number}}"
plant: "{{plant}}"
quantity: "{{check-inventory.reorder_quantity}}"
- name: notify-procurement
type: call
call: "msteams.send-message"
with:
channel_id: "procurement-alerts"
text: "Reorder alert: Material {{material_number}} at plant {{plant}} below threshold. PR {{create-pr.pr_number}} created for qty {{check-inventory.reorder_quantity}}."
- name: log-event
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO inventory_reorder_events VALUES ('{{material_number}}', '{{plant}}', '{{create-pr.pr_number}}', CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inventory
path: "/A_MatlStkInAcctMod(Material='{{material}}',Plant='{{plant}}')"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-inventory
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Retrieves material master record details from Caterpillar's SAP S/4HANA system including description, unit of measure, and material group.
naftiko: "0.5"
info:
label: "SAP Material Master Data Lookup"
description: "Retrieves material master record details from Caterpillar's SAP S/4HANA system including description, unit of measure, and material group."
tags:
- erp
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-material-master
description: "Given a SAP material number, retrieve the material description, base unit of measure, material group, and plant data from Caterpillar's SAP S/4HANA system."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number, e.g. 000000000000012345."
call: "sap-s4.get-material"
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
- name: base_uom
type: string
mapping: "$.d.BaseUnit"
- name: material_group
type: string
mapping: "$.d.MaterialGroup"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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 SAP MRP identifies a material shortage, checks supplier lead times in Coupa, creates a ServiceNow priority task, and escalates to supply chain leadership via Teams.
naftiko: "0.5"
info:
label: "SAP Material Shortage Escalation"
description: "When SAP MRP identifies a material shortage, checks supplier lead times in Coupa, creates a ServiceNow priority task, and escalates to supply chain leadership via Teams."
tags:
- supply-chain
- manufacturing
- sap
- coupa
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain
port: 8080
tools:
- name: escalate-shortage
description: "Given a material number and plant, verify the shortage in SAP MRP, check supplier alternatives in Coupa, create a priority task, and escalate."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: plant
in: body
type: string
description: "SAP plant code."
- name: required_date
in: body
type: string
description: "Required delivery date in YYYY-MM-DD format."
steps:
- name: get-mrp-status
type: call
call: "sap-s4.get-mrp-elements"
with:
material: "{{material_number}}"
plant: "{{plant}}"
- name: check-suppliers
type: call
call: "coupa.get-supplier-catalog"
with:
material: "{{material_number}}"
- name: create-task
type: call
call: "servicenow.create-task"
with:
short_description: "Material shortage: {{material_number}} at {{plant}}"
priority: "1"
description: "Shortage qty: {{get-mrp-status.shortage_qty}}. Required by: {{required_date}}. Supplier lead times: {{check-suppliers.lead_times}}."
- name: escalate
type: call
call: "msteams.send-message"
with:
channel_id: "supply-chain-leadership"
text: "SHORTAGE ALERT: Material {{material_number}} at plant {{plant}}. Shortage: {{get-mrp-status.shortage_qty}} units needed by {{required_date}}. Task: {{create-task.number}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: mrp-elements
path: "/MRPMaterial(Material='{{material}}',MRPPlant='{{plant}}')/to_MRPElement"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-mrp-elements
method: GET
- type: http
namespace: coupa
baseUri: "https://caterpillar.coupahost.com/api"
authentication:
type: bearer
token: "$secrets.coupa_api_token"
resources:
- name: catalog
path: "/catalog_items?material={{material}}"
inputParameters:
- name: material
in: query
operations:
- name: get-supplier-catalog
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks the status of all SAP S/4HANA period-end close tasks for Caterpillar and posts a completion report to the Finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Period-End Financial Close Status"
description: "Checks the status of all SAP S/4HANA period-end close tasks for Caterpillar and posts a completion report to the Finance Microsoft Teams channel."
tags:
- finance
- erp
- sap
- period-close
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: check-period-close-status
description: "Query SAP S/4HANA for the status of all period-end close tasks (journal entries, intercompany reconciliations, accruals) for a given fiscal year and period. Post a summary to the Finance Teams channel. Use at month-end or quarter-end close."
inputParameters:
- name: fiscal_year
in: body
type: string
description: "SAP fiscal year, e.g. 2026."
- name: fiscal_period
in: body
type: string
description: "SAP fiscal period (01-12)."
steps:
- name: get-close-status
type: call
call: "sap-close.get-period-close"
with:
fiscal_year: "{{fiscal_year}}"
fiscal_period: "{{fiscal_period}}"
- name: post-to-finance
type: call
call: "msteams-fin.send-message"
with:
channel: "finance-close"
text: "Period Close FY{{fiscal_year}}/P{{fiscal_period}}: {{get-close-status.complete_count}} complete, {{get-close-status.pending_count}} pending."
consumes:
- type: http
namespace: sap-close
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/FAM_PERIOD_CLOSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close-items
path: "/PeriodCloseItems"
inputParameters:
- name: fiscal_year
in: query
- name: fiscal_period
in: query
operations:
- name: get-period-close
method: GET
- type: http
namespace: msteams-fin
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves plant maintenance work order details from Caterpillar's SAP PM module including status, planned dates, and functional location.
naftiko: "0.5"
info:
label: "SAP Plant Maintenance Order Lookup"
description: "Retrieves plant maintenance work order details from Caterpillar's SAP PM module including status, planned dates, and functional location."
tags:
- manufacturing
- maintenance
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-maintenance-order
description: "Given a SAP maintenance order number, retrieve the order type, status, planned start/end dates, and functional location from Caterpillar's SAP PM system."
inputParameters:
- name: order_number
in: body
type: string
description: "SAP maintenance order number."
call: "sap-s4.get-maint-order"
with:
order_number: "{{order_number}}"
outputParameters:
- name: order_type
type: string
mapping: "$.d.MaintenanceOrderType"
- name: status
type: string
mapping: "$.d.OrderStatusText"
- name: planned_start
type: string
mapping: "$.d.MaintOrdBasicStartDate"
- name: functional_location
type: string
mapping: "$.d.FunctionalLocation"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/MaintenanceOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-maint-order
method: GET
When a production order is completed in SAP, confirms goods receipt, updates the Snowflake analytics warehouse, and posts a completion summary to the operations Teams channel.
naftiko: "0.5"
info:
label: "SAP Production Order Completion Workflow"
description: "When a production order is completed in SAP, confirms goods receipt, updates the Snowflake analytics warehouse, and posts a completion summary to the operations Teams channel."
tags:
- manufacturing
- erp
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: manufacturing
port: 8080
tools:
- name: complete-production-order
description: "Given a SAP production order number, confirm the goods movement, update production analytics in Snowflake, and notify the operations team."
inputParameters:
- name: order_number
in: body
type: string
description: "SAP production order number."
steps:
- name: get-order
type: call
call: "sap-s4.get-production-order"
with:
order_number: "{{order_number}}"
- name: confirm-goods
type: call
call: "sap-s4.post-goods-movement"
with:
order_number: "{{order_number}}"
movement_type: "101"
quantity: "{{get-order.target_quantity}}"
- name: update-analytics
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO production_completions VALUES ('{{order_number}}', '{{get-order.material}}', {{get-order.target_quantity}}, CURRENT_TIMESTAMP())"
- name: notify-ops
type: call
call: "msteams.send-message"
with:
channel_id: "production-ops"
text: "Production order {{order_number}} completed. Material: {{get-order.material}}, Qty: {{get-order.target_quantity}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS"
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
- name: goods-movements
path: "/A_ProductionOrder('{{order_number}}')/to_GoodsMovement"
inputParameters:
- name: order_number
in: path
operations:
- name: post-goods-movement
method: POST
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Looks up a Caterpillar SAP S/4HANA purchase order by number and returns header status, supplier details, total value, and currency.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up a Caterpillar SAP S/4HANA purchase order by number and returns header status, supplier details, total value, and currency."
tags:
- finance
- erp
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, retrieve the PO header status, supplier name, total value, and currency from Caterpillar's SAP S/4HANA system. Use for procurement tracking, AP invoice matching, or supplier queries."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number, e.g. 4500087654."
call: "sap-s4.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: supplier
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-s4
baseUri: "https://caterpillar-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
Processes SAP quality inspection lot results, updates the material status, creates a Jira follow-up if defects are found, and notifies the quality team via Teams.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Processor"
description: "Processes SAP quality inspection lot results, updates the material status, creates a Jira follow-up if defects are found, and notifies the quality team via Teams."
tags:
- manufacturing
- quality
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: quality
port: 8080
tools:
- name: process-inspection-lot
description: "Given a SAP inspection lot number, retrieve results, update material disposition, create Jira tasks for failed inspections, and notify the quality team."
inputParameters:
- name: inspection_lot
in: body
type: string
description: "SAP inspection lot number."
steps:
- name: get-results
type: call
call: "sap-s4.get-inspection-results"
with:
lot_number: "{{inspection_lot}}"
- name: update-disposition
type: call
call: "sap-s4.update-usage-decision"
with:
lot_number: "{{inspection_lot}}"
decision: "{{get-results.recommended_decision}}"
- name: create-follow-up
type: call
call: "jira.create-issue"
with:
project: "QUAL"
issuetype: "Task"
summary: "Inspection lot {{inspection_lot}}: {{get-results.disposition}}"
description: "Material: {{get-results.material}}. Defect rate: {{get-results.defect_rate}}%."
- name: notify-quality
type: call
call: "msteams.send-message"
with:
channel_id: "quality-control"
text: "Inspection lot {{inspection_lot}} processed. Material: {{get-results.material}}. Disposition: {{get-results.disposition}}. Defect rate: {{get-results.defect_rate}}%."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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: "/InspectionLot('{{lot_number}}')"
inputParameters:
- name: lot_number
in: path
operations:
- name: get-inspection-results
method: GET
- name: update-usage-decision
method: PATCH
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks equipment shipments from SAP logistics, updates the Salesforce dealer order status, and sends delivery notifications via Teams to the dealer support team.
naftiko: "0.5"
info:
label: "SAP Transport Shipment Tracking Chain"
description: "Tracks equipment shipments from SAP logistics, updates the Salesforce dealer order status, and sends delivery notifications via Teams to the dealer support team."
tags:
- logistics
- shipping
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: track-shipment
description: "Given a SAP delivery number, retrieve shipment status, update the Salesforce order record, and notify the dealer support team."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP outbound delivery number."
steps:
- name: get-delivery
type: call
call: "sap-s4.get-delivery-status"
with:
delivery: "{{delivery_number}}"
- name: update-salesforce
type: call
call: "salesforce.update-order-status"
with:
order_id: "{{get-delivery.sales_order}}"
shipping_status: "{{get-delivery.goods_issue_status}}"
tracking_number: "{{get-delivery.tracking_number}}"
- name: notify-dealer-support
type: call
call: "msteams.send-message"
with:
channel_id: "dealer-logistics"
text: "Shipment {{delivery_number}} status: {{get-delivery.goods_issue_status}}. Tracking: {{get-delivery.tracking_number}}. ETA: {{get-delivery.planned_delivery_date}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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}}')"
inputParameters:
- name: delivery
in: path
operations:
- name: get-delivery-status
method: GET
- type: http
namespace: salesforce
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: update-order-status
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves vendor master record details from Caterpillar's SAP S/4HANA system including company name, payment terms, and account group.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master record details from Caterpillar's SAP S/4HANA system including company name, payment terms, and account group."
tags:
- procurement
- erp
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-vendor
description: "Given a SAP vendor number, retrieve the vendor name, payment terms, account group, and country from Caterpillar's SAP system."
inputParameters:
- name: vendor_number
in: body
type: string
description: "SAP vendor account number."
call: "sap-s4.get-vendor"
with:
vendor_number: "{{vendor_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.SupplierName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: account_group
type: string
mapping: "$.d.SupplierAccountGroup"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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_number}}')"
inputParameters:
- name: vendor_number
in: path
operations:
- name: get-vendor
method: GET
Looks up an IT asset record in Caterpillar's ServiceNow CMDB by asset tag and returns model, location, and assignment details.
naftiko: "0.5"
info:
label: "ServiceNow Asset Inventory Lookup"
description: "Looks up an IT asset record in Caterpillar's ServiceNow CMDB by asset tag and returns model, location, and assignment details."
tags:
- it-operations
- asset-management
- servicenow
capability:
exposes:
- type: mcp
namespace: it-assets
port: 8080
tools:
- name: get-asset
description: "Given a ServiceNow asset tag, retrieve the asset model, location, assigned user, and status from Caterpillar's CMDB."
inputParameters:
- name: asset_tag
in: body
type: string
description: "ServiceNow asset tag identifier."
call: "servicenow.get-asset"
with:
asset_tag: "{{asset_tag}}"
outputParameters:
- name: model
type: string
mapping: "$.result.model_category.display_value"
- name: location
type: string
mapping: "$.result.location.display_value"
- name: assigned_to
type: string
mapping: "$.result.assigned_to.display_value"
- name: status
type: string
mapping: "$.result.install_status"
consumes:
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb-assets
path: "/table/alm_hardware?sysparm_query=asset_tag={{asset_tag}}"
inputParameters:
- name: asset_tag
in: query
operations:
- name: get-asset
method: GET
Creates a ServiceNow change request for a planned Caterpillar infrastructure change, routes for CAB approval, and notifies stakeholders via Microsoft Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Management Approval Gate"
description: "Creates a ServiceNow change request for a planned Caterpillar infrastructure change, routes for CAB approval, and notifies stakeholders via Microsoft Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: open-change-request
description: "Given change details (title, description, risk, scheduled window), create a ServiceNow change request and notify the CAB Teams channel. Use for planned infrastructure, deployment, or configuration changes requiring formal approval."
inputParameters:
- name: change_title
in: body
type: string
description: "Short title describing the change."
- name: change_description
in: body
type: string
description: "Full description including rollback plan."
- name: risk_level
in: body
type: string
description: "Risk classification: low, medium, or high."
- name: scheduled_start
in: body
type: string
description: "Planned start datetime in ISO 8601 format."
steps:
- name: create-change
type: call
call: "servicenow-chg.create-change"
with:
short_description: "{{change_title}}"
description: "{{change_description}}"
risk: "{{risk_level}}"
planned_start: "{{scheduled_start}}"
- name: notify-cab
type: call
call: "msteams-cab.send-message"
with:
channel: "change-advisory-board"
text: "Change Request: {{change_title}} | Risk: {{risk_level}} | Scheduled: {{scheduled_start}} | CHG: {{create-change.number}}"
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://caterpillar.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-cab
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Reconciles ServiceNow CMDB entries against Azure AD device inventory and SAP asset records, flags discrepancies, and creates remediation tasks.
naftiko: "0.5"
info:
label: "ServiceNow CMDB Reconciliation Workflow"
description: "Reconciles ServiceNow CMDB entries against Azure AD device inventory and SAP asset records, flags discrepancies, and creates remediation tasks."
tags:
- it-operations
- asset-management
- servicenow
- azure-active-directory
- sap
capability:
exposes:
- type: mcp
namespace: cmdb
port: 8080
tools:
- name: reconcile-cmdb
description: "Given a CI class, compare ServiceNow CMDB records against Azure AD and SAP, identify discrepancies, and create remediation tasks."
inputParameters:
- name: ci_class
in: body
type: string
description: "CMDB configuration item class, e.g. cmdb_ci_computer."
steps:
- name: get-cmdb-records
type: call
call: "servicenow.get-cmdb-records"
with:
ci_class: "{{ci_class}}"
- name: get-azure-devices
type: call
call: "azuread.get-devices"
with:
filter: "operatingSystem eq 'Windows'"
- name: get-sap-assets
type: call
call: "sap-s4.get-asset-list"
with:
asset_class: "{{ci_class}}"
- name: create-remediation
type: call
call: "servicenow.create-task"
with:
short_description: "CMDB reconciliation: {{ci_class}} discrepancies found"
assignment_group: "CMDB_Management"
description: "CMDB count: {{get-cmdb-records.count}}. Azure devices: {{get-azure-devices.count}}. SAP assets: {{get-sap-assets.count}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb
path: "/table/{{ci_class}}"
inputParameters:
- name: ci_class
in: path
operations:
- name: get-cmdb-records
method: GET
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: devices
path: "/devices"
operations:
- name: get-devices
method: GET
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: assets
path: "/A_FixedAsset"
operations:
- name: get-asset-list
method: GET
On a P1 incident in ServiceNow, enriches the incident with Datadog alert details, assigns the on-call engineer, and sends an alert to the IT operations Microsoft Teams channel.
naftiko: "0.5"
info:
label: "ServiceNow P1 Incident Triage Chain"
description: "On a P1 incident in ServiceNow, enriches the incident with Datadog alert details, assigns the on-call engineer, and sends an alert to the IT operations Microsoft Teams channel."
tags:
- itsm
- incident-response
- servicenow
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: itsm-ops
port: 8080
tools:
- name: handle-p1-incident
description: "Given a ServiceNow incident number and Datadog monitor alert ID, enrich the incident work notes with alert context, assign to the on-call queue, and post a P1 alert to the IT Operations Teams channel. Invoke immediately upon P1 incident creation."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number, e.g. INC0034567."
- name: datadog_alert_id
in: body
type: string
description: "Datadog monitor alert ID that triggered this incident."
steps:
- name: get-alert
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{datadog_alert_id}}"
- name: update-incident
type: call
call: "servicenow-update.update-incident"
with:
number: "{{incident_number}}"
work_notes: "Datadog Monitor: {{get-alert.name}} | State: {{get-alert.overall_state}} | Metric: {{get-alert.query}}"
assignment_group: "IT_Oncall"
- name: post-alert
type: call
call: "msteams-ops.send-message"
with:
channel: "it-operations"
text: "P1 Incident {{incident_number}}: {{get-alert.name}} — Datadog alert {{datadog_alert_id}} | Assigned to on-call."
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-update
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident/{{number}}"
inputParameters:
- name: number
in: path
operations:
- name: update-incident
method: PATCH
- type: http
namespace: msteams-ops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Routes engineering documents uploaded to SharePoint through an approval workflow in ServiceNow, updates the document metadata upon approval, and notifies stakeholders via Teams.
naftiko: "0.5"
info:
label: "SharePoint Document Approval Routing"
description: "Routes engineering documents uploaded to SharePoint through an approval workflow in ServiceNow, updates the document metadata upon approval, and notifies stakeholders via Teams."
tags:
- document-management
- approval
- sharepoint
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: docs
port: 8080
tools:
- name: route-document-approval
description: "Given a SharePoint document ID, create a ServiceNow approval workflow, and notify approvers via Teams."
inputParameters:
- name: document_id
in: body
type: string
description: "SharePoint document ID."
- name: site_id
in: body
type: string
description: "SharePoint site ID."
steps:
- name: get-document
type: call
call: "sharepoint.get-document"
with:
site_id: "{{site_id}}"
document_id: "{{document_id}}"
- name: create-approval
type: call
call: "servicenow.create-approval"
with:
short_description: "Document approval: {{get-document.name}}"
description: "Author: {{get-document.author}}. Version: {{get-document.version}}."
approver: "{{get-document.approver_email}}"
- name: notify-approvers
type: call
call: "msteams.send-message"
with:
channel_id: "document-approvals"
text: "Document pending approval: {{get-document.name}} (v{{get-document.version}}) by {{get-document.author}}. ServiceNow: {{create-approval.number}}."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: documents
path: "/sites/{{site_id}}/drive/items/{{document_id}}"
inputParameters:
- name: site_id
in: path
- name: document_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a Snowflake data pipeline task fails, retrieves error details, creates a Jira incident ticket, retries the task, and notifies the data engineering team via Teams.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Failure Recovery"
description: "When a Snowflake data pipeline task fails, retrieves error details, creates a Jira incident ticket, retries the task, and notifies the data engineering team via Teams."
tags:
- data-engineering
- pipeline
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a Snowflake task name and run ID, retrieve failure details, create a Jira ticket, attempt retry, and notify the team."
inputParameters:
- name: task_name
in: body
type: string
description: "Snowflake task name."
- name: run_id
in: body
type: string
description: "Failed task run identifier."
steps:
- name: get-failure-details
type: call
call: "snowflake.get-task-history"
with:
task_name: "{{task_name}}"
run_id: "{{run_id}}"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "DATA"
issuetype: "Bug"
summary: "Pipeline failure: {{task_name}} run {{run_id}}"
description: "Error: {{get-failure-details.error_message}}. Failed at: {{get-failure-details.error_timestamp}}."
- name: retry-task
type: call
call: "snowflake.execute-task"
with:
task_name: "{{task_name}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "data-engineering"
text: "Pipeline failure: {{task_name}}. Error: {{get-failure-details.error_message}}. Jira: {{create-jira.key}}. Retry initiated."
consumes:
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/statements"
operations:
- name: get-task-history
method: POST
- name: execute-task
method: POST
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Runs row count and null rate checks on key Caterpillar Snowflake data tables and posts quality results to Power BI and alerts the data engineering team via Teams if thresholds are breached.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Pipeline Monitor"
description: "Runs row count and null rate checks on key Caterpillar Snowflake data tables and posts quality results to Power BI and alerts the data engineering team via Teams if thresholds are breached."
tags:
- data
- analytics
- snowflake
- power-bi
- data-quality
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-data-quality-check
description: "Given a Snowflake table and quality thresholds, run row count and null rate validation, push results to a Power BI streaming dataset, and alert Teams if thresholds are exceeded. Use for daily ETL quality gate enforcement."
inputParameters:
- name: table_name
in: body
type: string
description: "Fully qualified Snowflake table, e.g. CAT_DW.SALES.DEALER_ORDERS."
- name: min_row_count
in: body
type: integer
description: "Minimum expected row count."
- name: max_null_rate
in: body
type: number
description: "Maximum acceptable null rate (0.0–1.0)."
steps:
- name: run-quality-check
type: call
call: "snowflake-dq.execute-statement"
with:
statement: "SELECT COUNT(*) as row_count, SUM(CASE WHEN key_col IS NULL THEN 1 ELSE 0 END)/COUNT(*) as null_rate FROM {{table_name}}"
- name: push-results
type: call
call: "powerbi-dq.push-rows"
with:
dataset_id: "$secrets.powerbi_dq_dataset_id"
table: "QualityResults"
rows: "{{run-quality-check.data}}"
- name: alert-data-team
type: call
call: "msteams-data.send-message"
with:
channel: "data-engineering"
text: "DQ Check {{table_name}}: {{run-quality-check.row_count}} rows, {{run-quality-check.null_rate}} null rate."
consumes:
- type: http
namespace: snowflake-dq
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: powerbi-dq
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}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-data
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Executes the Caterpillar manufacturing KPI analytics pipeline in Snowflake and publishes results to a Tableau workbook for operational reporting.
naftiko: "0.5"
info:
label: "Snowflake Manufacturing Analytics Refresh"
description: "Executes the Caterpillar manufacturing KPI analytics pipeline in Snowflake and publishes results to a Tableau workbook for operational reporting."
tags:
- data
- analytics
- snowflake
- tableau
- manufacturing
capability:
exposes:
- type: mcp
namespace: manufacturing-analytics
port: 8080
tools:
- name: refresh-manufacturing-kpis
description: "Run the Snowflake manufacturing KPI stored procedure for a given plant and reporting period, then trigger a Tableau workbook extract refresh. Use before production operations reviews or plant manager briefings."
inputParameters:
- name: plant_code
in: body
type: string
description: "Caterpillar plant code, e.g. CAT-AURORA."
- name: report_period
in: body
type: string
description: "Reporting period in YYYY-MM format."
steps:
- name: run-kpi-proc
type: call
call: "snowflake-mfg.execute-statement"
with:
statement: "CALL CAT_DW.MANUFACTURING.REFRESH_PLANT_KPIS('{{plant_code}}', '{{report_period}}')"
- name: refresh-tableau
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "$secrets.tableau_mfg_workbook_id"
site_id: "$secrets.tableau_site_id"
consumes:
- type: http
namespace: snowflake-mfg
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: tableau
baseUri: "https://prod.tableau.caterpillar.com/api/2.8"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbook-refreshes
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: site_id
in: path
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Queries Caterpillar's Snowflake data warehouse for parts demand forecast data by part number and region.
naftiko: "0.5"
info:
label: "Snowflake Parts Demand Forecast Query"
description: "Queries Caterpillar's Snowflake data warehouse for parts demand forecast data by part number and region."
tags:
- supply-chain
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-parts-forecast
description: "Given a part number and region code, retrieve the 90-day demand forecast, current inventory level, and recommended reorder quantity from Caterpillar's Snowflake warehouse."
inputParameters:
- name: part_number
in: body
type: string
description: "Caterpillar part number."
- name: region
in: body
type: string
description: "Region code, e.g. NA, EMEA, APAC."
call: "snowflake.query-forecast"
with:
part_number: "{{part_number}}"
region: "{{region}}"
outputParameters:
- name: forecast_90d
type: number
mapping: "$.data[0].FORECAST_90D"
- name: current_inventory
type: number
mapping: "$.data[0].CURRENT_INVENTORY"
- name: reorder_qty
type: number
mapping: "$.data[0].REORDER_QTY"
consumes:
- type: http
namespace: snowflake
baseUri: "https://caterpillar.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: demand-forecast
path: "/statements"
operations:
- name: query-forecast
method: POST
When SolarWinds raises a network device alert, enriches it with node details and creates a ServiceNow incident for the network operations team.
naftiko: "0.5"
info:
label: "SolarWinds Network Device Alert Handler"
description: "When SolarWinds raises a network device alert, enriches it with node details and creates a ServiceNow incident for the network operations team."
tags:
- observability
- solarwinds
- servicenow
- networking
- incident-response
capability:
exposes:
- type: mcp
namespace: network-ops
port: 8080
tools:
- name: handle-network-alert
description: "Given a SolarWinds node ID and alert message, fetch device details from SolarWinds, create a ServiceNow network incident, and post an alert to the network operations Teams channel. Use for automated network fault management."
inputParameters:
- name: node_id
in: body
type: string
description: "SolarWinds node ID for the affected device."
- name: alert_message
in: body
type: string
description: "Alert message text from SolarWinds."
steps:
- name: get-node
type: call
call: "solarwinds.get-node"
with:
node_id: "{{node_id}}"
- name: create-net-incident
type: call
call: "servicenow-net.create-incident"
with:
short_description: "Network alert: {{get-node.node_name}} — {{alert_message}}"
description: "Device: {{get-node.node_name}} | IP: {{get-node.ip_address}} | Location: {{get-node.location}}"
category: "network"
consumes:
- type: http
namespace: solarwinds
baseUri: "https://caterpillar-solarwinds.example.com/api/v1"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: nodes
path: "/nodes/{{node_id}}"
inputParameters:
- name: node_id
in: path
operations:
- name: get-node
method: GET
- type: http
namespace: servicenow-net
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
When SolarWinds detects a network outage, creates a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the network operations Teams channel.
naftiko: "0.5"
info:
label: "SolarWinds Network Outage Response Chain"
description: "When SolarWinds detects a network outage, creates a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the network operations Teams channel."
tags:
- network
- incident-management
- solarwinds
- servicenow
- pagerduty
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: network
port: 8080
tools:
- name: handle-network-outage
description: "Given a SolarWinds alert ID and affected node, create a P1 incident, page the on-call engineer, and notify the NOC team."
inputParameters:
- name: alert_id
in: body
type: string
description: "SolarWinds alert ID."
- name: node_name
in: body
type: string
description: "Affected network node name."
steps:
- name: get-alert
type: call
call: "solarwinds.get-alert"
with:
alert_id: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Network outage: {{node_name}} - {{get-alert.alert_message}}"
impact: "1"
urgency: "1"
assignment_group: "Network_Operations"
- name: page-oncall
type: call
call: "pagerduty.create-incident"
with:
service_id: "network-ops"
title: "Network outage: {{node_name}}"
urgency: "high"
- name: notify-noc
type: call
call: "msteams.send-message"
with:
channel_id: "network-operations"
text: "NETWORK OUTAGE: {{node_name}} down. SNOW {{create-incident.number}}. PagerDuty incident created. Alert: {{get-alert.alert_message}}."
consumes:
- type: http
namespace: solarwinds
baseUri: "https://caterpillar-solarwinds.corp.cat.com/SolarWinds/InformationService/v3/Json"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: alerts
path: "/Query?query=SELECT+*+FROM+Orion.AlertActive+WHERE+AlertObjectID={{alert_id}}"
inputParameters:
- name: alert_id
in: query
operations:
- name: get-alert
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.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: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Performs three-way match between a supplier invoice in Coupa, the purchase order in SAP, and the goods receipt, then routes discrepancies to the AP team via ServiceNow.
naftiko: "0.5"
info:
label: "Supplier Invoice Three-Way Match"
description: "Performs three-way match between a supplier invoice in Coupa, the purchase order in SAP, and the goods receipt, then routes discrepancies to the AP team via ServiceNow."
tags:
- finance
- accounts-payable
- coupa
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: three-way-match
description: "Given a Coupa invoice ID, retrieve the invoice details, match against the SAP purchase order and goods receipt, and create a ServiceNow task if discrepancies are found."
inputParameters:
- name: invoice_id
in: body
type: string
description: "Coupa invoice ID."
steps:
- name: get-invoice
type: call
call: "coupa.get-invoice"
with:
invoice_id: "{{invoice_id}}"
- name: get-po
type: call
call: "sap-s4.get-po"
with:
po_number: "{{get-invoice.po_number}}"
- name: get-gr
type: call
call: "sap-s4.get-goods-receipt"
with:
po_number: "{{get-invoice.po_number}}"
- name: create-discrepancy-task
type: call
call: "servicenow.create-task"
with:
short_description: "Invoice match discrepancy: Invoice {{invoice_id}} vs PO {{get-invoice.po_number}}"
assignment_group: "Accounts_Payable"
description: "Invoice amount: {{get-invoice.total}}. PO amount: {{get-po.total_value}}. GR quantity: {{get-gr.quantity}}."
consumes:
- type: http
namespace: coupa
baseUri: "https://caterpillar.coupahost.com/api"
authentication:
type: bearer
token: "$secrets.coupa_api_token"
resources:
- name: invoices
path: "/invoices/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- name: goods-receipts
path: "/A_PurchaseOrder('{{po_number}}')/to_GoodsReceipt"
inputParameters:
- name: po_number
in: path
operations:
- name: get-goods-receipt
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Orchestrates new supplier onboarding by creating vendor master in SAP, setting up the supplier in Coupa, generating a Salesforce partner record, and notifying procurement.
naftiko: "0.5"
info:
label: "Supplier Onboarding Orchestrator"
description: "Orchestrates new supplier onboarding by creating vendor master in SAP, setting up the supplier in Coupa, generating a Salesforce partner record, and notifying procurement."
tags:
- procurement
- supplier-management
- sap
- coupa
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: onboard-supplier
description: "Given supplier details, create records in SAP, Coupa, and Salesforce, then notify the procurement team."
inputParameters:
- name: supplier_name
in: body
type: string
description: "Legal name of the supplier."
- name: tax_id
in: body
type: string
description: "Supplier tax identification number."
- name: category
in: body
type: string
description: "Supplier category: raw-materials, components, services."
steps:
- name: create-sap-vendor
type: call
call: "sap-s4.create-supplier"
with:
supplier_name: "{{supplier_name}}"
tax_id: "{{tax_id}}"
account_group: "{{category}}"
- name: create-coupa-supplier
type: call
call: "coupa.create-supplier"
with:
name: "{{supplier_name}}"
tax_id: "{{tax_id}}"
sap_vendor_number: "{{create-sap-vendor.vendor_number}}"
- name: create-sf-partner
type: call
call: "salesforce.create-account"
with:
name: "{{supplier_name}}"
type: "Supplier"
sap_vendor: "{{create-sap-vendor.vendor_number}}"
- name: notify-procurement
type: call
call: "msteams.send-message"
with:
channel_id: "procurement-onboarding"
text: "New supplier onboarded: {{supplier_name}}. SAP vendor: {{create-sap-vendor.vendor_number}}. Coupa ID: {{create-coupa-supplier.id}}. SF account: {{create-sf-partner.id}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://caterpillar-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"
operations:
- name: create-supplier
method: POST
- type: http
namespace: coupa
baseUri: "https://caterpillar.coupahost.com/api"
authentication:
type: bearer
token: "$secrets.coupa_api_token"
resources:
- name: suppliers
path: "/suppliers"
operations:
- name: create-supplier
method: POST
- type: http
namespace: salesforce
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Detects Terraform infrastructure drift in Azure environments, creates a Jira remediation task, commits the drift report to GitHub, and alerts the platform team via Teams.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Drift Detector"
description: "Detects Terraform infrastructure drift in Azure environments, creates a Jira remediation task, commits the drift report to GitHub, and alerts the platform team via Teams."
tags:
- infrastructure
- compliance
- terraform
- jira
- github
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: platform
port: 8080
tools:
- name: detect-drift
description: "Given a Terraform workspace name, check for infrastructure drift, create a remediation Jira task, log to GitHub, and notify the platform team."
inputParameters:
- name: workspace_name
in: body
type: string
description: "Terraform Cloud workspace name."
steps:
- name: check-drift
type: call
call: "terraform.get-drift-status"
with:
workspace: "{{workspace_name}}"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "INFRA"
issuetype: "Bug"
summary: "Terraform drift detected: {{workspace_name}}"
description: "{{check-drift.drift_count}} resources drifted. Details: {{check-drift.drift_summary}}."
- name: log-to-github
type: call
call: "github.create-issue"
with:
repo: "caterpillar/infrastructure-drift-reports"
title: "Drift report: {{workspace_name}}"
body: "{{check-drift.drift_details}}"
- name: alert-team
type: call
call: "msteams.send-message"
with:
channel_id: "platform-engineering"
text: "Infrastructure drift detected in workspace {{workspace_name}}: {{check-drift.drift_count}} resources changed. Jira: {{create-jira.key}}."
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/organizations/caterpillar/workspaces/{{workspace}}"
inputParameters:
- name: workspace
in: path
operations:
- name: get-drift-status
method: GET
- type: http
namespace: jira
baseUri: "https://caterpillar.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: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: issues
path: "/repos/{{repo}}/issues"
inputParameters:
- name: repo
in: path
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Initiates the annual performance review cycle by pulling employee rosters from Workday, creating review tasks in Jira, and notifying managers via Teams.
naftiko: "0.5"
info:
label: "Workday Annual Review Cycle Launcher"
description: "Initiates the annual performance review cycle by pulling employee rosters from Workday, creating review tasks in Jira, and notifying managers via Teams."
tags:
- hr
- performance-management
- workday
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: launch-review-cycle
description: "Given a review period and business unit, pull the employee roster from Workday, create Jira tasks for each manager, and send reminders."
inputParameters:
- name: review_period
in: body
type: string
description: "Review period, e.g. 2025-Annual."
- name: business_unit
in: body
type: string
description: "Workday supervisory organization."
steps:
- name: get-roster
type: call
call: "workday.get-org-roster"
with:
org_id: "{{business_unit}}"
- name: create-review-tasks
type: call
call: "jira.create-issue"
with:
project: "HR"
issuetype: "Task"
summary: "{{review_period}} performance reviews for {{business_unit}}"
description: "Complete performance reviews for {{get-roster.employee_count}} direct reports by deadline."
- name: notify-managers
type: call
call: "msteams.send-message"
with:
channel_id: "hr-performance"
text: "Annual review cycle {{review_period}} launched for {{business_unit}}. {{get-roster.employee_count}} reviews to complete. Jira: {{create-review-tasks.key}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: org-roster
path: "/caterpillar/workers?supervisoryOrganization={{org_id}}"
inputParameters:
- name: org_id
in: query
operations:
- name: get-org-roster
method: GET
- type: http
namespace: jira
baseUri: "https://caterpillar.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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Workday for Caterpillar employees who have not completed open enrollment and sends personalized Microsoft Teams reminders before the deadline.
naftiko: "0.5"
info:
label: "Workday Benefits Open Enrollment Reminder"
description: "Queries Workday for Caterpillar employees who have not completed open enrollment and sends personalized Microsoft Teams reminders before the deadline."
tags:
- hr
- benefits
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-benefits
port: 8080
tools:
- name: send-enrollment-reminders
description: "Retrieve all Caterpillar employees from Workday who have not completed benefit elections for the current plan year, and post a targeted reminder to the HR announcements Teams channel. Use in the final week of open enrollment."
inputParameters:
- name: plan_year
in: body
type: string
description: "Benefit plan year, e.g. 2026."
- name: enrollment_deadline
in: body
type: string
description: "Enrollment deadline date in YYYY-MM-DD format."
steps:
- name: get-pending-enrollments
type: call
call: "workday-benefits.list-pending"
with:
plan_year: "{{plan_year}}"
status: "Not_Started"
- name: send-reminder
type: call
call: "msteams-benefits.send-message"
with:
channel: "hr-announcements"
text: "Open Enrollment Reminder: {{get-pending-enrollments.count}} employees have not yet elected benefits for plan year {{plan_year}}. Deadline: {{enrollment_deadline}}."
consumes:
- type: http
namespace: workday-benefits
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: benefit-elections
path: "/caterpillar/benefitElections"
inputParameters:
- name: plan_year
in: query
- name: status
in: query
operations:
- name: list-pending
method: GET
- type: http
namespace: msteams-benefits
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves compensation band details for a given job profile from Caterpillar's Workday HCM system.
naftiko: "0.5"
info:
label: "Workday Compensation Band Lookup"
description: "Retrieves compensation band details for a given job profile from Caterpillar's Workday HCM system."
tags:
- hr
- compensation
- workday
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-compensation-band
description: "Given a Workday job profile ID, retrieve the compensation band minimum, midpoint, and maximum for Caterpillar's pay structure."
inputParameters:
- name: job_profile_id
in: body
type: string
description: "Workday job profile identifier."
call: "workday.get-comp-band"
with:
job_profile_id: "{{job_profile_id}}"
outputParameters:
- name: minimum
type: string
mapping: "$.compensationBand.minimum"
- name: midpoint
type: string
mapping: "$.compensationBand.midpoint"
- name: maximum
type: string
mapping: "$.compensationBand.maximum"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: comp-bands
path: "/caterpillar/compensationBands/{{job_profile_id}}"
inputParameters:
- name: job_profile_id
in: path
operations:
- name: get-comp-band
method: GET
When an employee separation is recorded in Workday, disables the Azure AD account, revokes Salesforce access, and opens a ServiceNow offboarding checklist task.
naftiko: "0.5"
info:
label: "Workday Employee Offboarding Workflow"
description: "When an employee separation is recorded in Workday, disables the Azure AD account, revokes Salesforce access, and opens a ServiceNow offboarding checklist task."
tags:
- hr
- offboarding
- workday
- azure-active-directory
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, disable the Azure AD account, revoke Salesforce user access, and open a ServiceNow offboarding ticket. Invoke when HR records a separation event."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID of the departing employee."
- name: termination_date
in: body
type: string
description: "Last day of employment in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: "workday-offboard.get-worker"
with:
worker_id: "{{employee_id}}"
- name: disable-aad-user
type: call
call: "azure-ad.disable-user"
with:
user_id: "{{get-worker.azure_object_id}}"
- name: deactivate-sf-user
type: call
call: "salesforce-deact.update-user"
with:
user_id: "{{get-worker.salesforce_id}}"
- name: open-offboard-ticket
type: call
call: "servicenow-ob.create-incident"
with:
short_description: "Offboarding: {{get-worker.display_name}} — {{termination_date}}"
category: "hr_offboarding"
consumes:
- type: http
namespace: workday-offboard
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/caterpillar/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: salesforce-deact
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: servicenow-ob
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Checks employee training compliance in Workday Learning, flags overdue certifications, creates ServiceNow follow-up tasks, and notifies managers via Teams.
naftiko: "0.5"
info:
label: "Workday Learning Compliance Tracker"
description: "Checks employee training compliance in Workday Learning, flags overdue certifications, creates ServiceNow follow-up tasks, and notifies managers via Teams."
tags:
- hr
- compliance
- training
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: check-training-compliance
description: "Given an employee ID, check Workday Learning for overdue required training, create ServiceNow tasks for overdue items, and notify the employee's manager."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
steps:
- name: get-training-status
type: call
call: "workday.get-learning-assignments"
with:
worker_id: "{{employee_id}}"
- name: create-follow-up
type: call
call: "servicenow.create-task"
with:
short_description: "Overdue training compliance: {{get-training-status.employee_name}}"
description: "Overdue courses: {{get-training-status.overdue_courses}}"
assignment_group: "HR_Compliance"
- name: notify-manager
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-training-status.manager_email}}"
text: "Training compliance alert: {{get-training-status.employee_name}} has {{get-training-status.overdue_count}} overdue required courses. Task: {{create-follow-up.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: learning
path: "/caterpillar/learningAssignments?worker={{worker_id}}&status=overdue"
inputParameters:
- name: worker_id
in: query
operations:
- name: get-learning-assignments
method: GET
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/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: chat-messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Returns the current Caterpillar headcount by department and cost center from Workday for workforce planning, cost allocation, and financial reporting.
naftiko: "0.5"
info:
label: "Workday Payroll Headcount Snapshot"
description: "Returns the current Caterpillar headcount by department and cost center from Workday for workforce planning, cost allocation, and financial reporting."
tags:
- hr
- payroll
- headcount
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-snapshot
description: "Returns a list of active Caterpillar employees grouped by department and cost center from Workday. Use for workforce planning, headcount budgeting, or cost center financial reporting."
call: "workday-hcm.headcount-export"
outputParameters:
- name: employees
type: array
mapping: "$.data[*]"
consumes:
- type: http
namespace: workday-hcm
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: worker-export
path: "/caterpillar/workers"
operations:
- name: headcount-export
method: GET
When an employee transfers to a new position in Workday, updates their AD group memberships in Azure AD, reassigns ServiceNow tickets, and notifies the new manager via Teams.
naftiko: "0.5"
info:
label: "Workday Position Transfer Orchestrator"
description: "When an employee transfers to a new position in Workday, updates their AD group memberships in Azure AD, reassigns ServiceNow tickets, and notifies the new manager via Teams."
tags:
- hr
- identity
- workday
- azure-active-directory
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: process-transfer
description: "Given a Workday employee ID and new position ID, update Azure AD group memberships, reassign open ServiceNow tickets, and notify the new manager."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
- name: new_position_id
in: body
type: string
description: "New Workday position ID."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: update-groups
type: call
call: "azuread.update-group-membership"
with:
user_upn: "{{get-worker.work_email}}"
new_department: "{{new_position_id}}"
- name: reassign-tickets
type: call
call: "servicenow.reassign-tickets"
with:
caller_id: "{{get-worker.work_email}}"
new_assignment_group: "{{new_position_id}}"
- name: notify-manager
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.new_manager_email}}"
text: "{{get-worker.display_name}} has transferred to your team. AD groups updated and {{reassign-tickets.count}} tickets reassigned."
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: "/caterpillar/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/users/{{user_upn}}/memberOf"
inputParameters:
- name: user_upn
in: path
operations:
- name: update-group-membership
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tickets
path: "/table/incident"
operations:
- name: reassign-tickets
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Syncs high-priority dealer support tickets from Zendesk to ServiceNow, enriches with Salesforce account data, and alerts the support team via Teams.
naftiko: "0.5"
info:
label: "Zendesk Dealer Support Ticket Sync"
description: "Syncs high-priority dealer support tickets from Zendesk to ServiceNow, enriches with Salesforce account data, and alerts the support team via Teams."
tags:
- customer-service
- support
- zendesk
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: support
port: 8080
tools:
- name: sync-dealer-ticket
description: "Given a Zendesk ticket ID, sync it to ServiceNow with enriched Salesforce account data and notify the support team."
inputParameters:
- name: ticket_id
in: body
type: string
description: "Zendesk ticket ID."
steps:
- name: get-ticket
type: call
call: "zendesk.get-ticket"
with:
ticket_id: "{{ticket_id}}"
- name: get-account
type: call
call: "salesforce.get-account"
with:
account_id: "{{get-ticket.organization_id}}"
- name: create-snow-case
type: call
call: "servicenow.create-case"
with:
short_description: "{{get-ticket.subject}}"
description: "Dealer: {{get-account.dealer_name}}. Tier: {{get-account.tier}}. {{get-ticket.description}}"
priority: "{{get-ticket.priority}}"
- name: notify-support
type: call
call: "msteams.send-message"
with:
channel_id: "dealer-support"
text: "Dealer support ticket synced: {{get-ticket.subject}} from {{get-account.dealer_name}} ({{get-account.tier}}). SNOW: {{create-snow-case.number}}."
consumes:
- type: http
namespace: zendesk
baseUri: "https://caterpillar.zendesk.com/api/v2"
authentication:
type: bearer
token: "$secrets.zendesk_token"
resources:
- name: tickets
path: "/tickets/{{ticket_id}}"
inputParameters:
- name: ticket_id
in: path
operations:
- name: get-ticket
method: GET
- type: http
namespace: salesforce
baseUri: "https://caterpillar.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
- type: http
namespace: servicenow
baseUri: "https://caterpillar.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cases
path: "/table/sn_customerservice_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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Enriches new Salesforce leads from the Caterpillar dealer pipeline with ZoomInfo firmographic data including company size, revenue, and primary industry.
naftiko: "0.5"
info:
label: "ZoomInfo Lead Enrichment for Dealer Pipeline"
description: "Enriches new Salesforce leads from the Caterpillar dealer pipeline with ZoomInfo firmographic data including company size, revenue, and primary industry."
tags:
- crm
- sales
- salesforce
- zoominfo
- lead-management
capability:
exposes:
- type: mcp
namespace: lead-enrichment
port: 8080
tools:
- name: enrich-dealer-lead
description: "Given a Salesforce lead ID, fetch the company from ZoomInfo to get firmographic details (revenue, employee count, industry), then update the Salesforce lead record. Use when new dealer or distribution partner leads require qualification."
inputParameters:
- name: lead_id
in: body
type: string
description: "Salesforce lead record ID."
steps:
- name: get-lead
type: call
call: "salesforce-lead.get-lead"
with:
lead_id: "{{lead_id}}"
- name: enrich-company
type: call
call: "zoominfo.search-company"
with:
company_name: "{{get-lead.Company}}"
country: "{{get-lead.Country}}"
- name: update-lead
type: call
call: "salesforce-lead-update.update-lead"
with:
lead_id: "{{lead_id}}"
annual_revenue: "{{enrich-company.revenue}}"
number_of_employees: "{{enrich-company.employee_count}}"
industry: "{{enrich-company.industry}}"
consumes:
- type: http
namespace: salesforce-lead
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: company-search
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: salesforce-lead-update
baseUri: "https://caterpillar.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: update-lead
method: PATCH