Caterpillar Capabilities

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

Sort
Expand

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