Honeywell Capabilities

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

Sort
Expand

Compares ADP payroll totals against Workday headcount, logs variances in Snowflake, and alerts the payroll team via Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Validation Chain"
  description: "Compares ADP payroll totals against Workday headcount, logs variances 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: validate-payroll
          description: "Given a pay period, compare ADP and Workday data, log variances, and alert payroll."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier."
          steps:
            - name: get-adp
              type: call
              call: "adp.get-payroll-summary"
              with:
                period: "{{pay_period}}"
            - name: get-workday
              type: call
              call: "workday.get-headcount"
              with:
                date: "{{pay_period}}"
            - name: log-variance
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO payroll_variances VALUES ('{{pay_period}}',{{get-adp.employee_count}},{{get-workday.active_count}},CURRENT_TIMESTAMP())"
            - name: alert-payroll
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "payroll"
                text: "Payroll validation {{pay_period}}: ADP={{get-adp.employee_count}}, Workday={{get-workday.active_count}}. Gross: ${{get-adp.gross_total}}."
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/pay-data-input?payPeriod={{period}}"
          inputParameters:
            - name: 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: "/honeywell/workers?count=true&activeOnly=true"
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.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

Manages aerospace parts certification by validating specs in SAP, creating quality records in ServiceNow, generating certification docs in SharePoint, and notifying the quality team via Teams.

naftiko: "0.5"
info:
  label: "Aerospace Parts Certification Workflow"
  description: "Manages aerospace parts certification by validating specs in SAP, creating quality records in ServiceNow, generating certification docs in SharePoint, and notifying the quality team via Teams."
  tags:
    - aerospace
    - quality
    - sap
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: certify-aerospace-part
          description: "Given a part number and lot, validate against SAP specs, create quality records, generate certification documentation, and notify the team."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "Aerospace part number."
            - name: lot_number
              in: body
              type: string
              description: "Manufacturing lot number."
          steps:
            - name: validate-specs
              type: call
              call: "sap-s4.get-inspection-results"
              with:
                part: "{{part_number}}"
                lot: "{{lot_number}}"
            - name: create-quality-record
              type: call
              call: "servicenow.create-quality-case"
              with:
                short_description: "Certification: Part {{part_number}} Lot {{lot_number}}"
                description: "Inspection results: {{validate-specs.pass_rate}}% pass. Test count: {{validate-specs.test_count}}."
            - name: generate-cert-doc
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "quality-certifications"
                folder: "Aerospace/{{part_number}}"
                name: "CERT-{{lot_number}}.pdf"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "aerospace-quality"
                text: "Parts certification complete: {{part_number}} Lot {{lot_number}}. Pass rate: {{validate-specs.pass_rate}}%. SNOW: {{create-quality-record.number}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection
          path: "/InspectionLot?$filter=Material eq '{{part}}' and Batch eq '{{lot}}'"
          inputParameters:
            - name: part
              in: query
            - name: lot
              in: query
          operations:
            - name: get-inspection-results
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: quality-cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-quality-case
              method: POST
    - 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/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-document
              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

Uses Anthropic to analyze customer technical queries, searches Confluence knowledge base, retrieves product specs from SAP, and generates comprehensive support responses.

naftiko: "0.5"
info:
  label: "AI-Powered Technical Support Agent"
  description: "Uses Anthropic to analyze customer technical queries, searches Confluence knowledge base, retrieves product specs from SAP, and generates comprehensive support responses."
  tags:
    - customer-service
    - ai
    - anthropic
    - confluence
    - sap
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: resolve-tech-query
          description: "Given a customer question and product model, search knowledge base, pull specs, and generate an AI-powered answer."
          inputParameters:
            - name: question
              in: body
              type: string
              description: "Customer technical question."
            - name: product_model
              in: body
              type: string
              description: "Honeywell product model number."
          steps:
            - name: search-kb
              type: call
              call: "confluence.search"
              with:
                query: "{{product_model}} {{question}}"
            - name: get-specs
              type: call
              call: "sap-s4.get-product-specs"
              with:
                model: "{{product_model}}"
            - name: generate-answer
              type: call
              call: "anthropic.generate-response"
              with:
                context: "KB results: {{search-kb.results}}. Product specs: {{get-specs.specifications}}"
                question: "{{question}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://honeywell.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql=text~'{{query}}'"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{model}}')"
          inputParameters:
            - name: model
              in: path
          operations:
            - name: get-product-specs
              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: generate-response
              method: POST

Submits a Honeywell policy document or engineering specification to the Anthropic API for AI-powered summarization and stores the result in SharePoint.

naftiko: "0.5"
info:
  label: "Anthropic Document Summarization"
  description: "Submits a Honeywell policy document or engineering specification to the Anthropic API for AI-powered summarization and stores the result in SharePoint."
  tags:
    - ai
    - document-management
    - anthropic
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ai-ops
      port: 8080
      tools:
        - name: summarize-document
          description: "Given a SharePoint document URL, retrieve the document content, send it to the Anthropic API for concise summarization, and save the summary back to SharePoint as a new page."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "The SharePoint URL of the document to summarize."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the summary should be stored."
          steps:
            - name: get-document
              type: call
              call: "sharepoint-doc.get-file-content"
              with:
                document_url: "{{document_url}}"
            - name: generate-summary
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-opus-4-5"
                prompt: "Summarize the following Honeywell document in 3–5 bullet points: {{get-document.content}}"
            - name: save-summary
              type: call
              call: "sharepoint-save.create-page"
              with:
                site_id: "{{site_id}}"
                title: "AI Summary: {{get-document.filename}}"
                content: "{{generate-summary.completion}}"
  consumes:
    - type: http
      namespace: sharepoint-doc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{document_url}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: document_url
              in: path
          operations:
            - name: get-file-content
              method: GET
    - 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: sharepoint-save
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: pages
          path: "/sites/{{site_id}}/pages"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-page
              method: POST

Fetches a pending SAP Ariba purchase requisition, validates budget in SAP S/4HANA, and submits approval or rejection back to Ariba.

naftiko: "0.5"
info:
  label: "Ariba Procurement Request Approval"
  description: "Fetches a pending SAP Ariba purchase requisition, validates budget in SAP S/4HANA, and submits approval or rejection back to Ariba."
  tags:
    - procurement
    - finance
    - sap-ariba
    - sap
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: approve-purchase-requisition
          description: "Given a SAP Ariba requisition ID, validate available budget in SAP S/4HANA and approve or reject the requisition in Ariba based on the budget check result."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba purchase requisition ID."
            - name: cost_center
              in: body
              type: string
              description: "The cost center to validate budget against."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: "sap-budget.get-budget-status"
              with:
                cost_center: "{{cost_center}}"
                amount: "{{get-requisition.total_amount}}"
            - name: submit-decision
              type: call
              call: "ariba-approval.approve-requisition"
              with:
                requisition_id: "{{requisition_id}}"
                decision: "{{check-budget.status}}"
                comment: "Budget check result: {{check-budget.available_balance}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap-budget
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budget
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget-status
              method: GET
    - type: http
      namespace: ariba-approval
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: approvals
          path: "/{{requisition_id}}/approve"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: approve-requisition
              method: POST

Identifies inactive Azure AD users, reclaims unused M365 licenses, logs savings in ServiceNow, and reports to IT management via Teams.

naftiko: "0.5"
info:
  label: "Azure AD License Optimization"
  description: "Identifies inactive Azure AD users, reclaims unused M365 licenses, logs savings in ServiceNow, and reports 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: optimize-licenses
          description: "Given inactivity threshold, find inactive users, reclaim licenses, log action, and report savings."
          inputParameters:
            - name: inactive_days
              in: body
              type: number
              description: "Inactivity threshold in days."
          steps:
            - name: find-inactive
              type: call
              call: "azuread.get-inactive-users"
              with:
                days: "{{inactive_days}}"
            - name: reclaim
              type: call
              call: "azuread.remove-licenses"
              with:
                user_ids: "{{find-inactive.user_ids}}"
            - name: log-action
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "License reclamation: {{find-inactive.count}} licenses"
            - name: report
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "it-cost-management"
                text: "License optimization: {{find-inactive.count}} M365 licenses reclaimed. Savings: ${{reclaim.monthly_savings}}/month."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-inactive-users
              method: GET
            - name: remove-licenses
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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

When Azure Cost Management detects spending anomalies, creates Jira investigation tasks, applies budget alerts, and notifies the FinOps team via Teams.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Handler"
  description: "When Azure Cost Management detects spending anomalies, creates Jira investigation tasks, applies budget alerts, and notifies the FinOps team via Teams."
  tags:
    - cloud
    - cost-optimization
    - microsoft-azure
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure cost anomaly alert, investigate the spike, create Jira task, and notify FinOps."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: anomaly_date
              in: body
              type: string
              description: "Date of the cost anomaly."
          steps:
            - name: get-anomaly
              type: call
              call: "azure.get-cost-anomaly"
              with:
                subscription_id: "{{subscription_id}}"
                date: "{{anomaly_date}}"
            - name: create-investigation
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                issuetype: "Task"
                summary: "Azure cost anomaly: {{subscription_id}} on {{anomaly_date}}"
                description: "Anomalous spend: ${{get-anomaly.anomaly_amount}}. Resource group: {{get-anomaly.resource_group}}. Service: {{get-anomaly.service_name}}."
            - name: notify-finops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finops"
                text: "Cost anomaly: ${{get-anomaly.anomaly_amount}} spike in {{get-anomaly.resource_group}} ({{get-anomaly.service_name}}). Jira: {{create-investigation.key}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-anomalies
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-anomaly
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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 Azure Cost Management for the top five over-budget resource groups and posts a weekly optimization report to the cloud FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cost Optimization Report"
  description: "Queries Azure Cost Management for the top five over-budget resource groups and posts a weekly optimization report to the cloud FinOps Teams channel."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finops-reporting
      port: 8080
      tools:
        - name: publish-azure-cost-report
          description: "Query Azure Cost Management for resource groups exceeding budget thresholds, format a ranked list of the top over-budget groups, and post the weekly FinOps digest to the cloud channel in Microsoft Teams."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to query costs for."
            - name: billing_period
              in: body
              type: string
              description: "The billing period in YYYYMM format, e.g. 202603."
          steps:
            - name: get-cost-data
              type: call
              call: "azure-cost.get-usage-details"
              with:
                subscription_id: "{{subscription_id}}"
                billing_period: "{{billing_period}}"
            - name: post-report
              type: call
              call: "msteams-finops.post-channel-message"
              with:
                channel_id: "$secrets.finops_channel_id"
                message: "Azure cost report for {{billing_period}}: Total spend {{get-cost-data.total_cost}} {{get-cost-data.currency}}. Top over-budget group: {{get-cost-data.top_group}}."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: usage-details
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Consumption/usageDetails"
          inputParameters:
            - name: subscription_id
              in: path
            - name: billing_period
              in: query
          operations:
            - name: get-usage-details
              method: GET
    - 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: post-channel-message
              method: POST

Retrieves Azure resource cost data for a given subscription and time period from Honeywell's Azure Cost Management API.

naftiko: "0.5"
info:
  label: "Azure Resource Cost Lookup"
  description: "Retrieves Azure resource cost data for a given subscription and time period from Honeywell's Azure Cost Management API."
  tags:
    - cloud
    - cost-management
    - microsoft-azure
capability:
  exposes:
    - type: mcp
      namespace: cloud
      port: 8080
      tools:
        - name: get-resource-cost
          description: "Given an Azure subscription ID and date range, retrieve the total cost, cost by resource group, and cost trend."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "azure.get-cost-data"
          with:
            subscription_id: "{{subscription_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.properties.rows[0][0]"
            - name: currency
              type: string
              mapping: "$.properties.rows[0][1]"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-data
              method: POST

When a Honeywell building automation system triggers an HVAC or fire safety alert, creates a ServiceNow incident, dispatches a field technician via Salesforce Field Service, and notifies building management via Teams.

naftiko: "0.5"
info:
  label: "Building Automation Alert Response Orchestrator"
  description: "When a Honeywell building automation system triggers an HVAC or fire safety alert, creates a ServiceNow incident, dispatches a field technician via Salesforce Field Service, and notifies building management via Teams."
  tags:
    - building-automation
    - iot
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: building-ops
      port: 8080
      tools:
        - name: handle-building-alert
          description: "Given a building alert ID and building code, retrieve alert details, create a ServiceNow incident, dispatch a technician, and notify building management."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Building automation alert identifier."
            - name: building_code
              in: body
              type: string
              description: "Building facility code."
          steps:
            - name: get-alert
              type: call
              call: "honeywell-bms.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Building alert: {{get-alert.alert_type}} at {{building_code}}"
                impact: "{{get-alert.severity}}"
                assignment_group: "Building_Operations"
            - name: dispatch-technician
              type: call
              call: "salesforce.create-work-order"
              with:
                subject: "{{get-alert.alert_type}} response: {{building_code}}"
                priority: "{{get-alert.severity}}"
                location: "{{building_code}}"
            - name: notify-management
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "building-operations"
                text: "Building alert: {{get-alert.alert_type}} at {{building_code}}. SNOW: {{create-incident.number}}. Technician dispatched: WO {{dispatch-technician.work_order_id}}."
  consumes:
    - type: http
      namespace: honeywell-bms
      baseUri: "https://buildings.honeywell.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.honeywell_bms_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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: salesforce
      baseUri: "https://honeywell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: work-orders
          path: "/sobjects/WorkOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves submitted SAP Concur expense reports, validates them against Honeywell policy rules, and flags non-compliant reports in ServiceNow for manager review.

naftiko: "0.5"
info:
  label: "Concur Expense Report Auditor"
  description: "Retrieves submitted SAP Concur expense reports, validates them against Honeywell policy rules, and flags non-compliant reports in ServiceNow for manager review."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: finance-compliance
      port: 8080
      tools:
        - name: audit-expense-report
          description: "Given a SAP Concur expense report ID, retrieve line items, validate against Honeywell travel and expense policy, and open a ServiceNow task if any violations are found."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: flag-violation
              type: call
              call: "servicenow-fin.create-incident"
              with:
                short_description: "Expense policy violation: Report {{report_id}}"
                description: "Concur report {{report_id}} submitted by {{get-report.employee_name}} contains items requiring manager review."
                category: "finance_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/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow-fin
      baseUri: "https://honeywell.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

Audits SAP Concur expense reports against travel policy, flags violations, creates ServiceNow compliance tasks, and notifies the compliance team via Teams.

naftiko: "0.5"
info:
  label: "Concur Travel Expense Audit Chain"
  description: "Audits SAP Concur expense reports against travel policy, flags violations, creates ServiceNow compliance tasks, and notifies the compliance team via Teams."
  tags:
    - travel
    - compliance
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: audit-expenses
          description: "Given a Concur expense report ID, validate against policy, flag violations, and notify compliance."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense audit: Report {{report_id}} - {{get-report.violations_count}} violations"
                assignment_group: "Expense_Compliance"
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "expense-compliance"
                text: "Expense audit: Report {{report_id}} by {{get-report.employee_name}}. {{get-report.violations_count}} policy violations. Total: ${{get-report.total_amount}}. Task: {{create-task.number}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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

Searches Honeywell's Confluence for technical specification documents by keyword and returns page titles, IDs, and last modified dates.

naftiko: "0.5"
info:
  label: "Confluence Technical Spec Search"
  description: "Searches Honeywell's Confluence for technical specification documents by keyword and returns page titles, IDs, and last modified dates."
  tags:
    - documentation
    - engineering
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: docs
      port: 8080
      tools:
        - name: search-specs
          description: "Given a search query, find technical specification pages in Honeywell's Confluence wiki."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query for technical specs."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://honeywell.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql=type=page AND text~'{{query}}'&limit=10"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET

When Honeywell's connected plant platform detects a process anomaly, retrieves sensor data, creates a SAP maintenance notification, alerts the process engineer via Teams, and logs in Snowflake.

naftiko: "0.5"
info:
  label: "Connected Plant Anomaly Response"
  description: "When Honeywell's connected plant platform detects a process anomaly, retrieves sensor data, creates a SAP maintenance notification, alerts the process engineer via Teams, and logs in Snowflake."
  tags:
    - manufacturing
    - iot
    - process-control
    - sap
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: plant-ops
      port: 8080
      tools:
        - name: respond-to-anomaly
          description: "Given an anomaly alert ID and plant unit, retrieve sensor readings, create maintenance notification, alert engineers, and log the event."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "Connected plant anomaly alert ID."
            - name: plant_unit
              in: body
              type: string
              description: "Plant unit identifier."
          steps:
            - name: get-sensor-data
              type: call
              call: "honeywell-process.get-readings"
              with:
                anomaly_id: "{{anomaly_id}}"
                unit: "{{plant_unit}}"
            - name: create-notification
              type: call
              call: "sap-s4.create-maint-notification"
              with:
                notification_type: "M2"
                functional_location: "{{plant_unit}}"
                description: "Process anomaly: {{get-sensor-data.anomaly_type}}. Deviation: {{get-sensor-data.deviation_pct}}%"
            - name: alert-engineer
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "process-engineering"
                text: "ANOMALY: {{get-sensor-data.anomaly_type}} at {{plant_unit}}. Deviation: {{get-sensor-data.deviation_pct}}%. SAP notification: {{create-notification.number}}."
            - name: log-event
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO plant_anomalies VALUES ('{{anomaly_id}}', '{{plant_unit}}', '{{get-sensor-data.anomaly_type}}', {{get-sensor-data.deviation_pct}}, CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: honeywell-process
      baseUri: "https://process.honeywell.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.honeywell_process_token"
      resources:
        - name: readings
          path: "/anomalies/{{anomaly_id}}/readings"
          inputParameters:
            - name: anomaly_id
              in: path
          operations:
            - name: get-readings
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/MaintenanceNotification"
          operations:
            - name: create-maint-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://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Enriches incoming customer service tickets by pulling account data from Salesforce, contract details from SAP, and generating an AI summary via Anthropic before routing to the appropriate team.

naftiko: "0.5"
info:
  label: "Customer Service Ticket Enrichment Chain"
  description: "Enriches incoming customer service tickets by pulling account data from Salesforce, contract details from SAP, and generating an AI summary via Anthropic before routing to the appropriate team."
  tags:
    - customer-service
    - salesforce
    - sap
    - anthropic
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: service
      port: 8080
      tools:
        - name: enrich-service-ticket
          description: "Given a ServiceNow case ID, enrich with Salesforce account data, SAP contract info, and AI summary."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "ServiceNow case ID."
          steps:
            - name: get-case
              type: call
              call: "servicenow.get-case"
              with:
                case_id: "{{case_id}}"
            - name: get-account
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{get-case.account_id}}"
            - name: get-contract
              type: call
              call: "sap-s4.get-service-contract"
              with:
                customer_id: "{{get-account.sap_customer_id}}"
            - name: generate-summary
              type: call
              call: "anthropic.summarize"
              with:
                text: "Customer: {{get-account.name}}. Contract tier: {{get-contract.tier}}. Issue: {{get-case.description}}. History: {{get-account.case_history}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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: sap-s4
      baseUri: "https://honeywell-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=Customer eq '{{customer_id}}'"
          inputParameters:
            - name: customer_id
              in: query
          operations:
            - name: get-service-contract
              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

Deploys ML models from Databricks to production, creates ServiceNow change records, and notifies the data science team via Teams.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Pipeline"
  description: "Deploys ML models from Databricks to production, creates ServiceNow change records, and notifies the data science team via Teams."
  tags:
    - data-science
    - ml-ops
    - databricks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mlops
      port: 8080
      tools:
        - name: deploy-model
          description: "Given a model name and version, deploy to serving endpoint, log the change, and notify the team."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "MLflow model name."
            - name: model_version
              in: body
              type: string
              description: "Model version."
          steps:
            - name: deploy
              type: call
              call: "databricks.deploy-endpoint"
              with:
                model_name: "{{model_name}}"
                version: "{{model_version}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "ML deploy: {{model_name}} v{{model_version}}"
                type: "standard"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-science"
                text: "ML model deployed: {{model_name}} v{{model_version}}. Endpoint: {{deploy.endpoint_url}}. Change: {{create-change.number}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://honeywell.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: endpoints
          path: "/serving-endpoints"
          operations:
            - name: deploy-endpoint
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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 Datadog for application latency metrics across Honeywell's microservices including p50, p95, and p99 response times.

naftiko: "0.5"
info:
  label: "Datadog Application Latency Check"
  description: "Queries Datadog for application latency metrics across Honeywell's microservices including p50, p95, and p99 response times."
  tags:
    - monitoring
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-latency-metrics
          description: "Given a service name, retrieve p50, p95, and p99 latency metrics from Honeywell's Datadog monitoring."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Application service name."
          call: "datadog.query-latency"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: p50_ms
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: p95_ms
              type: number
              mapping: "$.series[1].pointlist[-1][1]"
            - name: p99_ms
              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-latency
              method: GET

When Datadog detects a cloud cost anomaly, queries AWS Cost Explorer for spend details and opens a ServiceNow ticket for investigation.

naftiko: "0.5"
info:
  label: "Datadog Cloud Cost Anomaly Responder"
  description: "When Datadog detects a cloud cost anomaly, queries AWS Cost Explorer for spend details and opens a ServiceNow ticket for investigation."
  tags:
    - cloud
    - observability
    - cost-management
    - datadog
    - aws
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given a Datadog cost anomaly alert ID, retrieve detailed spend breakdowns from AWS Cost Explorer and open a ServiceNow investigation ticket with full context."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert ID for the cost anomaly."
            - name: account_id
              in: body
              type: string
              description: "The AWS account ID where the anomaly was detected."
          steps:
            - name: get-alert
              type: call
              call: "datadog-alerts.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-cost-detail
              type: call
              call: "aws-cost.get-cost-and-usage"
              with:
                account_id: "{{account_id}}"
                service: "{{get-alert.affected_service}}"
            - name: create-ticket
              type: call
              call: "servicenow-cost.create-incident"
              with:
                short_description: "Cloud cost anomaly: {{get-alert.affected_service}} in {{account_id}}"
                description: "Datadog Alert: {{alert_id}}\nAffected Service: {{get-alert.affected_service}}\nEstimated Overage: {{get-cost-detail.total_cost}}"
                category: "cloud_cost"
  consumes:
    - type: http
      namespace: datadog-alerts
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: alerts
          path: "/monitor/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: aws-cost
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_cost_token"
      resources:
        - name: cost-and-usage
          path: "/GetCostAndUsage"
          operations:
            - name: get-cost-and-usage
              method: POST
    - type: http
      namespace: servicenow-cost
      baseUri: "https://honeywell.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 a Dynatrace SLO is breached, retrieves the SLO details, creates a Jira improvement task, and posts a report to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Dynatrace SLO Breach Reporter"
  description: "When a Dynatrace SLO is breached, retrieves the SLO details, creates a Jira improvement task, and posts a report to the engineering Teams channel."
  tags:
    - observability
    - slo
    - dynatrace
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-ops
      port: 8080
      tools:
        - name: handle-slo-breach
          description: "Given a Dynatrace SLO ID and the service name, retrieve SLO breach details, open a Jira improvement task, and notify the responsible engineering team in Microsoft Teams."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "The Dynatrace SLO entity ID."
            - name: service_name
              in: body
              type: string
              description: "The name of the affected service."
          steps:
            - name: get-slo
              type: call
              call: "dynatrace-slo.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: create-task
              type: call
              call: "jira-slo.create-issue"
              with:
                project_key: "PLAT"
                issuetype: "Task"
                summary: "SLO breach: {{service_name}} — {{get-slo.name}}"
                description: "SLO: {{get-slo.name}}\nCurrent value: {{get-slo.evaluatedPercentage}}%\nTarget: {{get-slo.target}}%\nService: {{service_name}}"
            - name: notify-team
              type: call
              call: "msteams-slo.post-channel-message"
              with:
                channel_id: "$secrets.platform_channel_id"
                message: "SLO breach detected for {{service_name}}: {{get-slo.name}} at {{get-slo.evaluatedPercentage}}%. Jira task: {{create-task.key}}"
  consumes:
    - type: http
      namespace: dynatrace-slo
      baseUri: "https://honeywell.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Api-Token"
        value: "$secrets.dynatrace_api_token"
        placement: header
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: jira-slo
      baseUri: "https://honeywell.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: msteams-slo
      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: post-channel-message
              method: POST

Retrieves SLO compliance status from Honeywell's Dynatrace environment including current error budget, burn rate, and compliance percentage.

naftiko: "0.5"
info:
  label: "Dynatrace SLO Compliance Check"
  description: "Retrieves SLO compliance status from Honeywell's Dynatrace environment including current error budget, burn rate, and compliance percentage."
  tags:
    - monitoring
    - sre
    - dynatrace
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-slo-status
          description: "Given a Dynatrace SLO ID, retrieve the current compliance percentage, error budget remaining, and burn rate."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "Dynatrace SLO identifier."
          call: "dynatrace.get-slo"
          with:
            slo_id: "{{slo_id}}"
          outputParameters:
            - name: compliance_pct
              type: number
              mapping: "$.slo.evaluatedPercentage"
            - name: error_budget_pct
              type: number
              mapping: "$.slo.errorBudgetBurnRate.burnRateVisualizationEnabled"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://honeywell.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET

When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence across ServiceNow, Microsoft Graph, and Microsoft Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              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-employee.full_name}}"
                category: "hr_onboarding"
                assigned_to: "IT_Onboarding"
            - name: provision-account
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-employee.full_name}}"
                mail: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient: "{{get-employee.work_email}}"
                message: "Welcome to Honeywell, {{get-employee.first_name}}! Your IT 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: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

When a new hire is created in Workday, provisions an Okta account with appropriate groups, opens a ServiceNow onboarding ticket, and sends welcome instructions via Outlook.

naftiko: "0.5"
info:
  label: "Employee Onboarding with Okta Provisioning"
  description: "When a new hire is created in Workday, provisions an Okta account with appropriate groups, opens a ServiceNow onboarding ticket, and sends welcome instructions via Outlook."
  tags:
    - hr
    - onboarding
    - workday
    - okta
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: onboard-with-okta
          description: "Given a Workday employee ID, provision Okta account, create ServiceNow onboarding ticket, and send welcome email."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "Employee start date YYYY-MM-DD."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: provision-okta
              type: call
              call: "okta.create-user"
              with:
                email: "{{get-worker.work_email}}"
                first_name: "{{get-worker.first_name}}"
                last_name: "{{get-worker.last_name}}"
                department: "{{get-worker.department}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "New hire onboarding: {{get-worker.display_name}}"
                category: "hr_onboarding"
                start_date: "{{start_date}}"
            - name: send-welcome
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-worker.personal_email}}"
                subject: "Welcome to Honeywell - Your Account Details"
                body: "Welcome {{get-worker.first_name}}! Your Okta account ({{get-worker.work_email}}) has been provisioned. Start date: {{start_date}}. Onboarding ticket: {{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: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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

Processes engineering change requests by creating a SAP change record, updating the product BOM, creating review tasks in Jira, and notifying stakeholders via Teams.

naftiko: "0.5"
info:
  label: "Engineering Change Request Workflow"
  description: "Processes engineering change requests by creating a SAP change record, updating the product BOM, creating review tasks in Jira, and notifying stakeholders via Teams."
  tags:
    - engineering
    - change-management
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: process-ecr
          description: "Given an ECR number, material, and change description, create the SAP change, Jira review tasks, and notify stakeholders."
          inputParameters:
            - name: ecr_number
              in: body
              type: string
              description: "Engineering change request number."
            - name: material_number
              in: body
              type: string
              description: "Affected material number."
            - name: change_description
              in: body
              type: string
              description: "Change description."
          steps:
            - name: create-change
              type: call
              call: "sap-s4.create-engineering-change"
              with:
                ecr: "{{ecr_number}}"
                material: "{{material_number}}"
                description: "{{change_description}}"
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "ECR"
                issuetype: "Task"
                summary: "Review ECR {{ecr_number}}: {{material_number}}"
                description: "{{change_description}}"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-changes"
                text: "ECR {{ecr_number}} submitted for material {{material_number}}. Review task: {{create-review.key}}. {{change_description}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_ENGINEERING_CHANGE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: changes
          path: "/A_EngineeringChange"
          operations:
            - name: create-engineering-change
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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 a GitHub release is published, triggers CI/CD via GitHub Actions, creates a ServiceNow change record, and notifies the release team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Actions Release Deployment Chain"
  description: "When a GitHub release is published, triggers CI/CD via GitHub Actions, creates a ServiceNow change record, and notifies the release 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 repo and release tag, trigger deployment, log the change, and notify the team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: tag
              in: body
              type: string
              description: "Release tag."
          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: "honeywell/{{repo}}"
                workflow: "deploy.yml"
                ref: "{{tag}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Deploy {{repo}} {{tag}}"
                type: "standard"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "releases"
                text: "Release deployed: {{repo}} {{tag}}. Change: {{create-change.number}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/honeywell/{{repo}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
        - name: 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://honeywell.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

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog event, and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog event, and alerts the engineering Teams channel."
  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 pipeline failure event, open a Jira bug in the engineering project, create a Datadog event for tracking, and post an alert to the engineering Teams channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. honeywell/platform-core."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the pipeline failed."
            - name: run_url
              in: body
              type: string
              description: "The URL to the failed GitHub Actions run."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the pipeline."
          steps:
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_name}} / {{branch}} — {{workflow_name}}"
                description: "Workflow: {{workflow_name}}\nRepo: {{repo_name}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nRun: {{run_url}}"
            - name: post-datadog-event
              type: call
              call: "datadog.create-event"
              with:
                title: "CI Failure: {{repo_name}} {{branch}}"
                text: "Workflow {{workflow_name}} failed on {{branch}}. Jira: {{create-jira-bug.key}}"
                alert_type: "error"
            - name: notify-engineering
              type: call
              call: "msteams-eng.post-channel-message"
              with:
                channel_id: "$secrets.engineering_channel_id"
                message: "Pipeline failure in {{repo_name}} on {{branch}} | Jira: {{create-jira-bug.key}} | {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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
      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: post-channel-message
              method: POST

Lists GitHub Dependabot vulnerability alerts for critical severity across Honeywell repositories and creates Jira tickets for each unresolved critical dependency.

naftiko: "0.5"
info:
  label: "GitHub Dependency Vulnerability Triage"
  description: "Lists GitHub Dependabot vulnerability alerts for critical severity across Honeywell repositories and creates Jira tickets for each unresolved critical dependency."
  tags:
    - devops
    - security
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-triage
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given a GitHub organization name, list all open Dependabot alerts with critical severity, and create a Jira security issue for each alert that does not yet have one."
          inputParameters:
            - name: org_name
              in: body
              type: string
              description: "The GitHub organization name, e.g. honeywell."
          steps:
            - name: get-alerts
              type: call
              call: "github-vuln.list-org-dependabot-alerts"
              with:
                org: "{{org_name}}"
                severity: "critical"
                state: "open"
            - name: create-jira-issue
              type: call
              call: "jira-vuln.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Dependabot critical alerts in {{org_name}}: {{get-alerts.total_count}} open"
                description: "Organization: {{org_name}}\nCritical open alerts: {{get-alerts.total_count}}\nTop package: {{get-alerts.top_package}}"
  consumes:
    - type: http
      namespace: github-vuln
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/orgs/{{org}}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-org-dependabot-alerts
              method: GET
    - type: http
      namespace: jira-vuln
      baseUri: "https://honeywell.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

Retrieves pull request status, review approvals, and CI check results for a given PR in Honeywell's GitHub organization.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Status Check"
  description: "Retrieves pull request status, review approvals, and CI check results for a given PR in Honeywell's GitHub organization."
  tags:
    - devops
    - code-review
    - github
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-pr-status
          description: "Given a repository name and PR number, retrieve the PR status, approval count, and CI check results."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository name within Honeywell org."
            - name: pr_number
              in: body
              type: number
              description: "Pull request number."
          call: "github.get-pr"
          with:
            repo: "{{repo}}"
            pr_number: "{{pr_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: mergeable
              type: boolean
              mapping: "$.mergeable"
            - name: review_count
              type: number
              mapping: "$.reviews.length"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/honeywell/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pr
              method: GET

Triggers a GitHub Advanced Security scan on a Honeywell repository, retrieves the alert summary, and posts critical findings to Jira and Teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Scan"
  description: "Triggers a GitHub Advanced Security scan on a Honeywell repository, retrieves the alert summary, and posts critical findings to Jira and Teams."
  tags:
    - devops
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: run-security-scan
          description: "Given a GitHub repository name, trigger a code scanning run, retrieve critical security alerts, create Jira security issues for each, and post a summary to the security Teams channel."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. honeywell/iot-platform."
          steps:
            - name: get-alerts
              type: call
              call: "github.list-code-scanning-alerts"
              with:
                repo: "{{repo_name}}"
                severity: "critical"
            - name: create-security-issue
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Security alerts in {{repo_name}}: {{get-alerts.total_count}} critical findings"
                description: "Repo: {{repo_name}}\nCritical alerts: {{get-alerts.total_count}}\nTop finding: {{get-alerts.first_alert_description}}"
            - name: notify-security
              type: call
              call: "msteams-sec.post-channel-message"
              with:
                channel_id: "$secrets.security_channel_id"
                message: "Security scan: {{repo_name}} has {{get-alerts.total_count}} critical alerts. Jira: {{create-security-issue.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: list-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira-sec
      baseUri: "https://honeywell.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: msteams-sec
      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: post-channel-message
              method: POST

When GitHub Advanced Security finds vulnerabilities, creates Jira remediation tasks, logs in ServiceNow, and notifies the security team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Remediation"
  description: "When GitHub Advanced Security finds vulnerabilities, creates Jira remediation tasks, logs in ServiceNow, and notifies the security team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: remediate-vuln
          description: "Given a GitHub repo and alert number, create remediation tasks and notify the security team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
            - name: alert_number
              in: body
              type: number
              description: "Security alert number."
          steps:
            - name: get-alert
              type: call
              call: "github.get-security-alert"
              with:
                repo: "honeywell/{{repo}}"
                alert: "{{alert_number}}"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                issuetype: "Bug"
                summary: "Vuln: {{get-alert.cve_id}} in {{repo}}"
                priority: "{{get-alert.severity}}"
            - name: log-incident
              type: call
              call: "servicenow.create-security-incident"
              with:
                short_description: "GitHub vuln: {{get-alert.cve_id}} in {{repo}}"
                severity: "{{get-alert.severity}}"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "appsec"
                text: "Vulnerability: {{get-alert.cve_id}} in {{repo}} ({{get-alert.severity}}). Jira: {{create-jira.key}}. SNOW: {{log-incident.number}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: alerts
          path: "/repos/{{repo}}/code-scanning/alerts/{{alert}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert
              in: path
          operations:
            - name: get-security-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://honeywell.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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: 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

Fetches a supplier invoice from SAP Ariba, validates it against the corresponding purchase order in SAP S/4HANA, and triggers payment workflow or flags discrepancies.

naftiko: "0.5"
info:
  label: "Honeywell Supplier Invoice Processing"
  description: "Fetches a supplier invoice from SAP Ariba, validates it against the corresponding purchase order in SAP S/4HANA, and triggers payment workflow or flags discrepancies."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - invoice-processing
capability:
  exposes:
    - type: mcp
      namespace: ap-automation
      port: 8080
      tools:
        - name: process-supplier-invoice
          description: "Given a SAP Ariba invoice ID, retrieve invoice details, match against the SAP S/4HANA purchase order, and either approve the payment workflow or raise a discrepancy flag."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba supplier invoice ID."
          steps:
            - name: get-invoice
              type: call
              call: "ariba-inv.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po-match
              type: call
              call: "sap-po-match.get-po"
              with:
                po_number: "{{get-invoice.purchase_order_number}}"
            - name: submit-payment
              type: call
              call: "ariba-pay.approve-invoice"
              with:
                invoice_id: "{{invoice_id}}"
                po_total: "{{get-po-match.total_value}}"
  consumes:
    - type: http
      namespace: ariba-inv
      baseUri: "https://openapi.ariba.com/api/invoice-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-po-match
      baseUri: "https://honeywell-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
    - type: http
      namespace: ariba-pay
      baseUri: "https://openapi.ariba.com/api/invoice-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoice-approvals
          path: "/{{invoice_id}}/approve"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: approve-invoice
              method: POST

Checks Informatica Intelligent Cloud Services pipeline run status and alerts via Teams if any pipelines have failed in the last hour.

naftiko: "0.5"
info:
  label: "Informatica Data Pipeline Monitoring"
  description: "Checks Informatica Intelligent Cloud Services pipeline run status and alerts via Teams if any pipelines have failed in the last hour."
  tags:
    - data
    - monitoring
    - informatica
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-pipeline-ops
      port: 8080
      tools:
        - name: monitor-informatica-pipelines
          description: "List recent Informatica IICS pipeline runs, identify any failures in the last hour, and send an alert to the data engineering Teams channel with failure details."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The Informatica IICS organization ID."
          steps:
            - name: get-failed-runs
              type: call
              call: "informatica.list-activity-log"
              with:
                org_id: "{{org_id}}"
                status: "FAILED"
            - name: send-alert
              type: call
              call: "msteams-informatica.post-channel-message"
              with:
                channel_id: "$secrets.data_eng_channel_id"
                message: "Informatica pipeline alert: {{get-failed-runs.count}} pipelines failed in the last hour. First failure: {{get-failed-runs.first_pipeline_name}}"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://usw3.dm-us.informaticacloud.com/saas/public/core/v3"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: activity-log
          path: "/activityLog"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-activity-log
              method: GET
    - type: http
      namespace: msteams-informatica
      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: post-channel-message
              method: POST

When an Informatica data pipeline fails, retrieves error details, creates a Jira incident, retries the pipeline, and notifies the data engineering team via Teams.

naftiko: "0.5"
info:
  label: "Informatica ETL Pipeline Failure Handler"
  description: "When an Informatica data pipeline fails, retrieves error details, creates a Jira incident, retries the pipeline, and notifies the data engineering team via Teams."
  tags:
    - data-engineering
    - pipeline
    - informatica
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given an Informatica job name, retrieve failure details, create Jira ticket, retry, and notify team."
          inputParameters:
            - name: job_name
              in: body
              type: string
              description: "Informatica job name."
            - name: run_id
              in: body
              type: string
              description: "Failed run ID."
          steps:
            - name: get-error
              type: call
              call: "informatica.get-job-status"
              with:
                job_name: "{{job_name}}"
                run_id: "{{run_id}}"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                issuetype: "Bug"
                summary: "ETL failure: {{job_name}}"
                description: "Error: {{get-error.error_message}}"
            - name: retry
              type: call
              call: "informatica.restart-job"
              with:
                job_name: "{{job_name}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-engineering"
                text: "ETL failure: {{job_name}}. Error: {{get-error.error_message}}. Jira: {{create-jira.key}}. Retry initiated."
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://honeywell.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job/{{job_name}}/runs/{{run_id}}"
          inputParameters:
            - name: job_name
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-job-status
              method: GET
            - name: restart-job
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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 a P1 incident is created in ServiceNow, pages the on-call via PagerDuty, creates a dedicated Teams channel for the war room, pulls impacted service data from Datadog, and updates Jira.

naftiko: "0.5"
info:
  label: "IT P1 Incident War Room Launcher"
  description: "When a P1 incident is created in ServiceNow, pages the on-call via PagerDuty, creates a dedicated Teams channel for the war room, pulls impacted service data from Datadog, and updates Jira."
  tags:
    - incident-management
    - it-operations
    - servicenow
    - pagerduty
    - microsoft-teams
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: launch-war-room
          description: "Given a ServiceNow P1 incident number, page on-call, create war room channel, gather impact data, and create Jira tracking."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{get-incident.assignment_group}}"
                title: "P1: {{get-incident.short_description}}"
                urgency: "high"
            - name: get-impact
              type: call
              call: "datadog.get-service-status"
              with:
                service: "{{get-incident.cmdb_ci}}"
            - name: create-tracker
              type: call
              call: "jira.create-issue"
              with:
                project: "INC"
                issuetype: "Bug"
                summary: "P1 {{incident_number}}: {{get-incident.short_description}}"
                priority: "Highest"
            - name: notify-war-room
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "p1-war-room"
                text: "P1 WAR ROOM: {{incident_number}} - {{get-incident.short_description}}. Impact: {{get-impact.error_rate}}% error rate. PagerDuty engaged. Jira: {{create-tracker.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - 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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: service-status
          path: "/query"
          operations:
            - name: get-service-status
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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 backlog summary statistics for a Honeywell Jira project including open issues by priority, story point totals, and sprint capacity.

naftiko: "0.5"
info:
  label: "Jira Project Backlog Summary"
  description: "Retrieves backlog summary statistics for a Honeywell Jira project including open issues by priority, story point totals, and sprint capacity."
  tags:
    - project-management
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-backlog-summary
          description: "Given a Jira project key, retrieve the count of open issues by priority, total story points, and current sprint details."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key, e.g. HBT, AER."
          call: "jira.search-issues"
          with:
            project_key: "{{project_key}}"
          outputParameters:
            - name: total_open
              type: number
              mapping: "$.total"
            - name: critical_count
              type: number
              mapping: "$.issues[?(@.fields.priority.name=='Critical')].length"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://honeywell.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search?jql=project={{project_key}} AND status!=Done"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: search-issues
              method: GET

Fetches sprint velocity data from Jira for a Honeywell engineering team and publishes a digest to a Confluence page and Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Fetches sprint velocity data from Jira for a Honeywell engineering team and publishes a digest to a Confluence page and Teams channel."
  tags:
    - devops
    - reporting
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity-report
          description: "Given a Jira board ID and sprint ID, retrieve completed story points and velocity metrics, update the team's Confluence velocity page, and post a summary to the team Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID for the engineering team."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-report
              type: call
              call: "jira-agile.get-sprint-report"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: update-confluence
              type: call
              call: "confluence.update-page"
              with:
                page_id: "$secrets.velocity_confluence_page_id"
                content: "Sprint {{sprint_id}} Velocity: {{get-sprint-report.completed_points}} points. Committed: {{get-sprint-report.committed_points}}"
            - name: notify-team
              type: call
              call: "msteams-agile.post-channel-message"
              with:
                channel_id: "$secrets.engineering_channel_id"
                message: "Sprint {{sprint_id}} complete. Velocity: {{get-sprint-report.completed_points}} pts. Confluence page updated."
  consumes:
    - type: http
      namespace: jira-agile
      baseUri: "https://honeywell.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://honeywell.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT
    - 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: post-channel-message
              method: POST

Fetches LinkedIn Campaign Manager performance metrics for Honeywell employer brand campaigns and publishes a weekly digest to a SharePoint page.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Campaign Digest"
  description: "Fetches LinkedIn Campaign Manager performance metrics for Honeywell employer brand campaigns and publishes a weekly digest to a SharePoint page."
  tags:
    - marketing
    - social
    - linkedin
    - sharepoint
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-linkedin-campaign
          description: "Given a LinkedIn campaign ID and date range, retrieve impressions, clicks, and applications, then publish a formatted digest to the Honeywell Talent Brand SharePoint site."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn Campaign Manager campaign ID."
            - 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."
          steps:
            - name: get-campaign-stats
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: publish-digest
              type: call
              call: "sharepoint.create-page"
              with:
                site_id: "$secrets.talent_brand_site_id"
                title: "LinkedIn Campaign Report {{campaign_id}} {{start_date}} to {{end_date}}"
                content: "Impressions: {{get-campaign-stats.impressions}} | Clicks: {{get-campaign-stats.clicks}} | Applications: {{get-campaign-stats.applications}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2"
          inputParameters:
            - name: campaign_id
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: pages
          path: "/sites/{{site_id}}/pages"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-page
              method: POST

Syncs open Workday requisitions to LinkedIn job postings, creates Jira hiring tasks, and posts pipeline updates to the recruiting Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Pipeline"
  description: "Syncs open Workday requisitions to LinkedIn job postings, creates Jira hiring tasks, and posts pipeline updates to the recruiting Teams channel."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent
      port: 8080
      tools:
        - name: sync-job-pipeline
          description: "Given a Workday requisition ID, post to LinkedIn, create Jira tracking, and notify recruiting."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday requisition ID."
          steps:
            - name: get-req
              type: call
              call: "workday.get-requisition"
              with:
                req_id: "{{requisition_id}}"
            - name: post-job
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{get-req.job_title}}"
                location: "{{get-req.location}}"
            - name: create-tracker
              type: call
              call: "jira.create-issue"
              with:
                project: "HIRE"
                issuetype: "Task"
                summary: "Recruit: {{get-req.job_title}}"
            - name: notify-recruiting
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "recruiting"
                text: "Job posted: {{get-req.job_title}} in {{get-req.location}}. LinkedIn: {{post-job.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: "/honeywell/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://honeywell.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

Looks up an SAP Plant Maintenance work order status for Honeywell manufacturing operations and returns current status, assigned technician, and completion percentage.

naftiko: "0.5"
info:
  label: "Manufacturing Work Order Status Lookup"
  description: "Looks up an SAP Plant Maintenance work order status for Honeywell manufacturing operations and returns current status, assigned technician, and completion percentage."
  tags:
    - manufacturing
    - operations
    - sap
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-work-order-status
          description: "Given an SAP PM work order number, return the current status, assigned maintenance technician, estimated completion date, and completion percentage."
          inputParameters:
            - name: work_order_number
              in: body
              type: string
              description: "The SAP Plant Maintenance work order number."
          call: "sap-pm.get-work-order"
          with:
            order_number: "{{work_order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.SystemStatus"
            - name: assigned_technician
              type: string
              mapping: "$.d.PersonResponsible"
            - name: completion_percentage
              type: string
              mapping: "$.d.PercentageOfWorkCompleted"
            - name: scheduled_end_date
              type: string
              mapping: "$.d.ScheduledEndDate"
  consumes:
    - type: http
      namespace: sap-pm
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-work-order
              method: GET

Posts a formatted notification to a Honeywell Microsoft Teams channel using an incoming webhook.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Post"
  description: "Posts a formatted notification to a Honeywell Microsoft Teams channel using an incoming webhook."
  tags:
    - communications
    - notifications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: comms
      port: 8080
      tools:
        - name: post-to-teams
          description: "Given a webhook URL and message text, post a notification to the specified Honeywell Teams channel."
          inputParameters:
            - name: webhook_url
              in: body
              type: string
              description: "Teams incoming webhook URL."
            - name: message
              in: body
              type: string
              description: "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

When an employee status changes in Workday, automatically provisions or deprovisions Okta accounts, updates ServiceNow access records, and notifies IT security via Teams.

naftiko: "0.5"
info:
  label: "Okta Identity Lifecycle Automation"
  description: "When an employee status changes in Workday, automatically provisions or deprovisions Okta accounts, updates ServiceNow access records, and notifies IT security via Teams."
  tags:
    - identity
    - hr
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: sync-identity-lifecycle
          description: "Given a Workday employee ID and lifecycle event type, update Okta provisioning, log in ServiceNow, and notify security."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: event_type
              in: body
              type: string
              description: "Lifecycle event: hire, transfer, terminate, leave."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-okta
              type: call
              call: "okta.update-user-lifecycle"
              with:
                email: "{{get-worker.work_email}}"
                action: "{{event_type}}"
            - name: log-access-change
              type: call
              call: "servicenow.create-access-record"
              with:
                short_description: "Identity lifecycle: {{event_type}} for {{get-worker.display_name}}"
                user: "{{get-worker.work_email}}"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "it-security"
                text: "Identity lifecycle event: {{event_type}} for {{get-worker.display_name}} ({{get-worker.work_email}}). Okta status: {{update-okta.status}}. SNOW: {{log-access-change.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: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}/lifecycle/{{action}}"
          inputParameters:
            - name: email
              in: path
            - name: action
              in: path
          operations:
            - name: update-user-lifecycle
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: access-records
          path: "/table/sc_request"
          operations:
            - name: create-access-record
              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

Lists all Okta users without MFA enrolled, cross-references with active Workday employees, and opens a ServiceNow compliance task for the IT security team.

naftiko: "0.5"
info:
  label: "Okta MFA Policy Compliance Audit"
  description: "Lists all Okta users without MFA enrolled, cross-references with active Workday employees, and opens a ServiceNow compliance task for the IT security team."
  tags:
    - security
    - identity
    - okta
    - workday
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-compliance
      port: 8080
      tools:
        - name: audit-mfa-compliance
          description: "Retrieve a list of Okta users without MFA enrolled, verify they are active in Workday, and create a ServiceNow compliance task summarizing the non-compliant accounts."
          steps:
            - name: get-non-mfa-users
              type: call
              call: "okta-audit.list-users-without-mfa"
              with:
                filter: "status eq ACTIVE"
            - name: create-compliance-task
              type: call
              call: "servicenow-audit.create-incident"
              with:
                short_description: "MFA Compliance: {{get-non-mfa-users.count}} active users without MFA"
                description: "Users without MFA enrolled: {{get-non-mfa-users.count}}. Review required for policy compliance."
                category: "security_compliance"
                priority: "2"
  consumes:
    - type: http
      namespace: okta-audit
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          inputParameters:
            - name: filter
              in: query
          operations:
            - name: list-users-without-mfa
              method: GET
    - type: http
      namespace: servicenow-audit
      baseUri: "https://honeywell.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 an employee termination is processed in Workday, deactivates the user in Okta, revokes Salesforce access, and closes all open ServiceNow tickets assigned to them.

naftiko: "0.5"
info:
  label: "Okta User Deprovisioning on Termination"
  description: "When an employee termination is processed in Workday, deactivates the user in Okta, revokes Salesforce access, and closes all open ServiceNow tickets assigned to them."
  tags:
    - hr
    - security
    - offboarding
    - workday
    - okta
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a Workday employee ID for a terminated employee, deactivate their Okta account, revoke Salesforce license, and close any open ServiceNow tickets assigned to them."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the terminated employee."
          steps:
            - name: get-employee
              type: call
              call: "workday-term.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: revoke-salesforce
              type: call
              call: "salesforce-depro.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                is_active: "false"
            - name: close-tickets
              type: call
              call: "servicenow-term.close-user-tickets"
              with:
                assigned_to: "{{get-employee.servicenow_user_id}}"
  consumes:
    - type: http
      namespace: workday-term
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: salesforce-depro
      baseUri: "https://honeywell.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-term
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: assigned_to
              in: query
          operations:
            - name: close-user-tickets
              method: PATCH

Retrieves active session status and last authentication details for a user from Honeywell's Okta identity platform.

naftiko: "0.5"
info:
  label: "Okta User Session Status"
  description: "Retrieves active session status and last authentication details for a user from Honeywell's Okta identity platform."
  tags:
    - identity
    - security
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-session
          description: "Given an Okta user ID, retrieve the active session count, last login time, and MFA status."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "Okta user ID or email."
          call: "okta.get-sessions"
          with:
            user_id: "{{user_id}}"
          outputParameters:
            - name: active_sessions
              type: number
              mapping: "$.length"
            - name: last_login
              type: string
              mapping: "$[0].lastPasswordVerification"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-sessions
              method: GET

Uses OpenAI to generate RFP response drafts by pulling product specs from SAP, customer history from Salesforce, and distributing the draft via SharePoint.

naftiko: "0.5"
info:
  label: "OpenAI RFP Response Generator"
  description: "Uses OpenAI to generate RFP response drafts by pulling product specs from SAP, customer history from Salesforce, and distributing the draft via SharePoint."
  tags:
    - sales
    - ai
    - openai
    - sap
    - salesforce
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: generate-rfp-response
          description: "Given an RFP description and customer ID, pull relevant data, generate AI draft, and store in SharePoint."
          inputParameters:
            - name: rfp_description
              in: body
              type: string
              description: "RFP requirements summary."
            - name: customer_id
              in: body
              type: string
              description: "Salesforce customer account ID."
          steps:
            - name: get-customer
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{customer_id}}"
            - name: get-products
              type: call
              call: "sap-s4.get-product-catalog"
              with:
                category: "{{get-customer.industry}}"
            - name: generate-draft
              type: call
              call: "openai.generate-rfp"
              with:
                rfp: "{{rfp_description}}"
                customer: "{{get-customer.name}}"
                products: "{{get-products.catalog}}"
            - name: store-draft
              type: call
              call: "sharepoint.upload-document"
              with:
                site: "sales-rfps"
                folder: "{{get-customer.name}}"
                content: "{{generate-draft.response}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product"
          operations:
            - name: get-product-catalog
              method: GET
    - 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: generate-rfp
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site}}/drive/root/children"
          inputParameters:
            - name: site
              in: path
          operations:
            - name: upload-document
              method: PUT

Retrieves incident timeline details from Honeywell's PagerDuty including acknowledgment time, resolution time, and escalation history.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Timeline Lookup"
  description: "Retrieves incident timeline details from Honeywell's PagerDuty including acknowledgment time, resolution time, and escalation history."
  tags:
    - incident-management
    - it-operations
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: get-incident-timeline
          description: "Given a PagerDuty incident ID, retrieve the timeline events, MTTA, and MTTR for the incident."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "PagerDuty incident ID."
          call: "pagerduty.get-incident"
          with:
            incident_id: "{{incident_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.incident.status"
            - name: created_at
              type: string
              mapping: "$.incident.created_at"
            - name: resolved_at
              type: string
              mapping: "$.incident.last_status_change_at"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET

Retrieves the current PagerDuty on-call engineer for a given Honeywell service and posts the contact information to Teams on demand.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current PagerDuty on-call engineer for a given Honeywell service and posts the contact information to Teams on demand."
  tags:
    - itsm
    - operations
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: oncall-ops
      port: 8080
      tools:
        - name: get-oncall-contact
          description: "Given a PagerDuty schedule ID, return the name and contact details of the currently on-call engineer and post the information to the designated Teams channel."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID for the service team."
          steps:
            - name: get-oncall
              type: call
              call: "pagerduty-oncall.get-oncall"
              with:
                schedule_id: "{{schedule_id}}"
            - name: notify-channel
              type: call
              call: "msteams-oncall.post-channel-message"
              with:
                channel_id: "$secrets.ops_channel_id"
                message: "Current on-call for schedule {{schedule_id}}: {{get-oncall.user_name}} ({{get-oncall.user_email}})"
  consumes:
    - type: http
      namespace: pagerduty-oncall
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-oncall
              method: GET
    - type: http
      namespace: msteams-oncall
      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: post-channel-message
              method: POST

Retrieves current Palo Alto Networks firewall security policies for Honeywell's industrial network segments and flags any policies allowing unrestricted outbound traffic.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Policy Audit"
  description: "Retrieves current Palo Alto Networks firewall security policies for Honeywell's industrial network segments and flags any policies allowing unrestricted outbound traffic."
  tags:
    - security
    - network
    - palo-alto
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: audit-firewall-policies
          description: "Query Palo Alto Networks for all security policies on the specified device group, identify policies with destination 'any' and action 'allow', and open a ServiceNow security task for each non-compliant rule."
          inputParameters:
            - name: device_group
              in: body
              type: string
              description: "The Palo Alto Panorama device group name to audit."
          steps:
            - name: get-policies
              type: call
              call: "paloalto.list-security-policies"
              with:
                device_group: "{{device_group}}"
            - name: create-audit-task
              type: call
              call: "servicenow-net.create-incident"
              with:
                short_description: "Firewall policy audit: {{get-policies.unrestricted_count}} unrestricted rules in {{device_group}}"
                description: "Device group: {{device_group}}\nPolicies with unrestricted outbound: {{get-policies.unrestricted_count}}\nPolicy names: {{get-policies.policy_names}}"
                category: "network_security"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://honeywell-panorama.honeywell.com/restapi/v10.1"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: security-policies
          path: "/Objects/SecurityRules"
          inputParameters:
            - name: device_group
              in: query
          operations:
            - name: list-security-policies
              method: GET
    - type: http
      namespace: servicenow-net
      baseUri: "https://honeywell.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 Palo Alto Networks detects a threat, creates a ServiceNow security incident, blocks the source in the firewall, and alerts the SOC team via Teams.

naftiko: "0.5"
info:
  label: "Palo Alto Security Incident Response"
  description: "When Palo Alto Networks detects a threat, creates a ServiceNow security incident, blocks the source in the firewall, and alerts the SOC team via Teams."
  tags:
    - security
    - incident-response
    - palo-alto-networks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: respond-to-threat
          description: "Given a Palo Alto alert ID, retrieve threat details, create a security incident, apply block rule, and notify SOC."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Palo Alto threat alert ID."
          steps:
            - name: get-threat
              type: call
              call: "paloalto.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-security-incident"
              with:
                short_description: "Threat: {{get-threat.threat_name}} from {{get-threat.source_ip}}"
                severity: "{{get-threat.severity}}"
            - name: block-source
              type: call
              call: "paloalto.create-block-rule"
              with:
                source_ip: "{{get-threat.source_ip}}"
                rule_name: "auto-block-{{alert_id}}"
            - name: alert-soc
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "soc-alerts"
                text: "THREAT DETECTED: {{get-threat.threat_name}} from {{get-threat.source_ip}}. Auto-blocked. SNOW: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://honeywell-cortex.paloaltonetworks.com/public_api/v1"
      authentication:
        type: apiKey
        key: "$secrets.paloalto_api_key"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
        - name: rules
          path: "/security_rules"
          operations:
            - name: create-block-rule
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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: 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

Triggers multi-level contract approval via Power Automate, logs decisions in ServiceNow, and sends confirmation via Outlook.

naftiko: "0.5"
info:
  label: "Power Automate Contract Approval Flow"
  description: "Triggers multi-level contract approval via Power Automate, logs decisions in ServiceNow, and sends confirmation via Outlook."
  tags:
    - workflow
    - contract-management
    - microsoft-power-automate
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: workflow
      port: 8080
      tools:
        - name: approve-contract
          description: "Given contract details, trigger approval flow, log decision, and notify requestor."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract identifier."
            - name: requestor_email
              in: body
              type: string
              description: "Requestor email."
          steps:
            - name: trigger-approval
              type: call
              call: "power-automate.trigger-flow"
              with:
                flow_id: "contract-approval"
                contract_id: "{{contract_id}}"
            - name: log-decision
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Contract approval: {{contract_id}} - {{trigger-approval.decision}}"
            - name: notify-requestor
              type: call
              call: "outlook.send-email"
              with:
                to: "{{requestor_email}}"
                subject: "Contract {{contract_id}}: {{trigger-approval.decision}}"
                body: "Your contract 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://honeywell.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

Triggers a Power BI dataset refresh for the Honeywell finance dashboard after SAP period-close posting and notifies the finance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Finance Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the Honeywell finance dashboard after SAP period-close posting and notifies the finance team via Microsoft Teams."
  tags:
    - finance
    - reporting
    - power-bi
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: refresh-finance-dashboard
          description: "Trigger a Power BI dataset refresh for the Honeywell financial reporting dashboard, then notify the finance team channel in Microsoft Teams that data is current."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the finance dashboard."
            - name: period
              in: body
              type: string
              description: "The fiscal period being refreshed, e.g. 2026-Q1."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi-fin.refresh-dataset"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: "msteams-finance.post-channel-message"
              with:
                channel_id: "$secrets.finance_channel_id"
                message: "Finance dashboard refreshed for period {{period}}. Power BI dataset {{dataset_id}} is now current."
  consumes:
    - type: http
      namespace: powerbi-fin
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-finance
      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: post-channel-message
              method: POST

Retrieves the latest HVAC performance dashboard refresh status from Honeywell's Power BI workspace.

naftiko: "0.5"
info:
  label: "Power BI HVAC Performance Dashboard Lookup"
  description: "Retrieves the latest HVAC performance dashboard refresh status from Honeywell's Power BI workspace."
  tags:
    - analytics
    - building-automation
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-hvac-dashboard
          description: "Given a Power BI dataset ID, retrieve the last refresh status and timestamp for Honeywell's HVAC performance dashboard."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: "powerbi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: 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: refreshes
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Orchestrates quarterly financial close by verifying SAP period status, reconciling Snowflake analytics, and distributing close status reports via Teams and Outlook.

naftiko: "0.5"
info:
  label: "Quarterly Financial Close Orchestrator"
  description: "Orchestrates quarterly financial close by verifying SAP period status, reconciling Snowflake analytics, and distributing close status reports via Teams and Outlook."
  tags:
    - finance
    - financial-close
    - sap
    - snowflake
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: verify-close
          description: "Given a fiscal period and company code, verify SAP close status, check reconciliation, and distribute reports."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "SAP fiscal period."
            - 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-recon"
              with:
                period: "{{fiscal_period}}"
            - name: post-status
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "finance-close"
                text: "Close status {{fiscal_period}}: SAP={{check-period.status}}. Variance={{check-recon.variance}}."
            - name: email-report
              type: call
              call: "outlook.send-email"
              with:
                to: "finance-leadership@honeywell.com"
                subject: "Q Close Status: {{fiscal_period}}"
                body: "Period status: {{check-period.status}}. Reconciliation variance: {{check-recon.variance}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-recon
              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: 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 workplace safety incident is reported, creates a ServiceNow case, logs in SAP EHS, notifies safety leadership via Teams, and updates the Snowflake safety dashboard.

naftiko: "0.5"
info:
  label: "Safety Incident Reporting Workflow"
  description: "When a workplace safety incident is reported, creates a ServiceNow case, logs in SAP EHS, notifies safety leadership 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-incident
          description: "Given incident details, create records in ServiceNow, SAP EHS, notify leadership, and log in Snowflake."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "Plant facility code."
            - name: incident_type
              in: body
              type: string
              description: "Incident type."
            - name: description
              in: body
              type: string
              description: "Incident description."
            - name: severity
              in: body
              type: string
              description: "Severity level."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Safety: {{incident_type}} at {{plant_code}}"
                severity: "{{severity}}"
            - name: log-ehs
              type: call
              call: "sap-s4.create-ehs-notification"
              with:
                plant: "{{plant_code}}"
                type: "safety"
                description: "{{description}}"
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety-leadership"
                text: "SAFETY: {{incident_type}} at {{plant_code}} ({{severity}}). SNOW: {{create-case.number}}. SAP EHS: {{log-ehs.number}}."
            - name: log-analytics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO safety_incidents VALUES ('{{plant_code}}','{{incident_type}}','{{severity}}',CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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://honeywell-s4.sap.com/sap/opu/odata/sap/API_EHS_NOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ehs
          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://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Audits Honeywell safety instrumented system compliance by pulling configuration data, comparing against standards in Snowflake, creating Jira findings, and reporting via Teams.

naftiko: "0.5"
info:
  label: "Safety System Compliance Audit Chain"
  description: "Audits Honeywell safety instrumented system compliance by pulling configuration data, comparing against standards in Snowflake, creating Jira findings, and reporting via Teams."
  tags:
    - safety
    - compliance
    - process-control
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: audit-safety-compliance
          description: "Given a safety system ID, pull configuration data, compare to standards, log findings, and notify the safety team."
          inputParameters:
            - name: system_id
              in: body
              type: string
              description: "Safety instrumented system identifier."
            - name: plant_code
              in: body
              type: string
              description: "Plant facility code."
          steps:
            - name: get-config
              type: call
              call: "honeywell-safety.get-sis-config"
              with:
                system_id: "{{system_id}}"
            - name: check-standards
              type: call
              call: "snowflake.query-safety-standards"
              with:
                system_type: "{{get-config.system_type}}"
                sil_level: "{{get-config.sil_level}}"
            - name: create-findings
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                issuetype: "Task"
                summary: "SIS audit: {{system_id}} at {{plant_code}}"
                description: "SIL level: {{get-config.sil_level}}. Compliance: {{check-standards.compliance_status}}. Gaps: {{check-standards.gap_count}}."
            - name: report-results
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety-compliance"
                text: "SIS audit complete: {{system_id}} at {{plant_code}}. SIL {{get-config.sil_level}}. Status: {{check-standards.compliance_status}}. Jira: {{create-findings.key}}."
  consumes:
    - type: http
      namespace: honeywell-safety
      baseUri: "https://safety.honeywell.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.honeywell_safety_token"
      resources:
        - name: sis-config
          path: "/systems/{{system_id}}/configuration"
          inputParameters:
            - name: system_id
              in: path
          operations:
            - name: get-sis-config
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-safety-standards
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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

Generates an account health scorecard by aggregating open opportunities, support cases, and NPS data from Salesforce, then publishes to a Power BI dashboard.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Scorecard"
  description: "Generates an account health scorecard by aggregating open opportunities, support cases, and NPS data from Salesforce, then publishes to a Power BI dashboard."
  tags:
    - sales
    - customer-success
    - salesforce
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: account-health
      port: 8080
      tools:
        - name: publish-account-scorecard
          description: "Given a Salesforce account ID, retrieve open opportunity pipeline, open support cases, and last NPS score, then trigger a Power BI dataset refresh so the account health dashboard reflects current data."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID (18-char) to generate the scorecard for."
          steps:
            - name: get-account-data
              type: call
              call: "salesforce-health.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-open-cases
              type: call
              call: "salesforce-cases.query-cases"
              with:
                account_id: "{{account_id}}"
                status: "Open"
            - name: refresh-dashboard
              type: call
              call: "powerbi-health.refresh-dataset"
              with:
                dataset_id: "$secrets.account_health_dataset_id"
  consumes:
    - type: http
      namespace: salesforce-health
      baseUri: "https://honeywell.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: salesforce-cases
      baseUri: "https://honeywell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/query"
          inputParameters:
            - name: account_id
              in: query
            - name: status
              in: query
          operations:
            - name: query-cases
              method: GET
    - type: http
      namespace: powerbi-health
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

After a Salesforce opportunity closes, triggers an NPS survey workflow by creating a survey task for the account owner and logging it in the activity timeline.

naftiko: "0.5"
info:
  label: "Salesforce Customer NPS Survey Trigger"
  description: "After a Salesforce opportunity closes, triggers an NPS survey workflow by creating a survey task for the account owner and logging it in the activity timeline."
  tags:
    - sales
    - customer-success
    - salesforce
    - nps
capability:
  exposes:
    - type: mcp
      namespace: customer-success
      port: 8080
      tools:
        - name: trigger-nps-survey
          description: "Given a Salesforce closed opportunity ID, create an NPS survey follow-up task assigned to the account owner and log a completed activity on the opportunity record."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity ID (18-char) that has been closed."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-nps.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-survey-task
              type: call
              call: "salesforce-task.create-task"
              with:
                what_id: "{{opportunity_id}}"
                owner_id: "{{get-opportunity.owner_id}}"
                subject: "Send NPS survey to {{get-opportunity.account_name}}"
                due_date: "{{get-opportunity.close_date}}"
                status: "Not Started"
  consumes:
    - type: http
      namespace: salesforce-nps
      baseUri: "https://honeywell.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: salesforce-task
      baseUri: "https://honeywell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

Enriches new Salesforce leads with company and contact data from ZoomInfo and updates the lead record with firmographic details.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment"
  description: "Enriches new Salesforce leads with company and contact data from ZoomInfo and updates the lead record with firmographic details."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-intelligence
      port: 8080
      tools:
        - name: enrich-lead
          description: "Given a Salesforce lead ID, look up the lead's company in ZoomInfo, retrieve firmographic data, and update the Salesforce lead record with enriched fields."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead record ID (18-char SFDC 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}}"
                website: "{{get-lead.website}}"
            - name: update-lead
              type: call
              call: "salesforce-lead-update.update-lead"
              with:
                lead_id: "{{lead_id}}"
                employee_count: "{{enrich-company.employee_count}}"
                annual_revenue: "{{enrich-company.annual_revenue}}"
                industry: "{{enrich-company.industry}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://honeywell.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: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-lead-update
      baseUri: "https://honeywell.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

Syncs closed-won Salesforce opportunities to SAP S/4HANA as sales orders and notifies the account team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Sync"
  description: "Syncs closed-won Salesforce opportunities to SAP S/4HANA as sales orders and notifies the account team via Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-erp-sync
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce opportunity ID that has moved to Closed Won, create a corresponding sales order in SAP S/4HANA and post a Teams notification to the account team channel."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity record ID (18-char SFDC ID)."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: "sap-so.create-sales-order"
              with:
                customer_id: "{{get-opportunity.account_sap_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
                description: "{{get-opportunity.name}}"
            - name: notify-team
              type: call
              call: "msteams-notify.post-channel-message"
              with:
                channel_id: "$secrets.sales_teams_channel"
                message: "Opportunity {{get-opportunity.name}} closed won. SAP SO {{create-sales-order.order_id}} created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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-so
      baseUri: "https://honeywell-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: msteams-notify
      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: post-channel-message
              method: POST

Identifies expiring service contracts in SAP, creates renewal opportunities in Salesforce, and notifies account managers with customer health scores via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Pipeline Orchestrator"
  description: "Identifies expiring service contracts in SAP, creates renewal opportunities in Salesforce, and notifies account managers with customer health scores via Teams."
  tags:
    - sales
    - contract-management
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: generate-renewals
          description: "Given an expiration window, find expiring contracts, create Salesforce opportunities, and notify account teams."
          inputParameters:
            - name: days_to_expiry
              in: body
              type: number
              description: "Days until contract expiration."
          steps:
            - name: get-expiring
              type: call
              call: "sap-s4.get-expiring-contracts"
              with:
                days: "{{days_to_expiry}}"
            - name: create-opportunity
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "Renewal: {{get-expiring.customer_name}}"
                type: "Renewal"
                close_date: "{{get-expiring.expiry_date}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales-renewals"
                text: "Renewal pipeline: {{get-expiring.count}} contracts expiring within {{days_to_expiry}} days. Opportunities created in Salesforce."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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"
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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 service contract details from Honeywell's Salesforce instance including contract value, expiration date, and coverage scope.

naftiko: "0.5"
info:
  label: "Salesforce Service Contract Lookup"
  description: "Retrieves service contract details from Honeywell's Salesforce instance including contract value, expiration date, and coverage scope."
  tags:
    - sales
    - contract-management
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: get-service-contract
          description: "Given a Salesforce contract ID, retrieve the contract value, start/end dates, and coverage details for Honeywell service agreements."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Salesforce contract ID."
          call: "salesforce.get-contract"
          with:
            contract_id: "{{contract_id}}"
          outputParameters:
            - name: contract_value
              type: number
              mapping: "$.ContractAmount__c"
            - name: end_date
              type: string
              mapping: "$.EndDate"
            - name: coverage_scope
              type: string
              mapping: "$.Coverage_Scope__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/sobjects/Contract/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET

Converts won Salesforce opportunities into SAP sales orders, validates pricing, updates Salesforce with the SAP order number, and confirms via Outlook.

naftiko: "0.5"
info:
  label: "Salesforce to SAP Order Sync"
  description: "Converts won Salesforce opportunities into SAP sales orders, validates pricing, updates Salesforce with the SAP order number, and confirms via Outlook."
  tags:
    - sales
    - order-management
    - salesforce
    - sap
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: sync-order
          description: "Given a Salesforce opportunity ID, create SAP sales order, update SF, and send confirmation."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opp
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-order
              type: call
              call: "sap-s4.create-sales-order"
              with:
                sold_to: "{{get-opp.sap_customer_id}}"
                materials: "{{get-opp.line_items}}"
            - name: update-sf
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_order: "{{create-order.order_number}}"
            - name: send-confirmation
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-opp.contact_email}}"
                subject: "Order Confirmed: {{create-order.order_number}}"
                body: "SAP Order {{create-order.order_number}} created. Delivery: {{create-order.delivery_date}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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://honeywell-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 cost analysis reports to product management via Outlook.

naftiko: "0.5"
info:
  label: "SAP BOM Cost Analysis Chain"
  description: "Retrieves bill of materials from SAP, calculates cost rollup via Snowflake, and distributes cost analysis reports to product management via Outlook."
  tags:
    - engineering
    - cost-management
    - sap
    - snowflake
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: analyze-bom-cost
          description: "Given a material number and plant, retrieve BOM, calculate cost rollup, and email the report."
          inputParameters:
            - name: material
              in: body
              type: string
              description: "SAP 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}}"
                plant: "{{plant}}"
            - name: calc-cost
              type: call
              call: "snowflake.query-cost-rollup"
              with:
                material: "{{material}}"
            - name: send-report
              type: call
              call: "outlook.send-email"
              with:
                to: "product-cost@honeywell.com"
                subject: "BOM Cost: {{material}} at {{plant}}"
                body: "Total: ${{calc-cost.total_cost}}. Components: {{get-bom.component_count}}. Top cost: {{calc-cost.top_component}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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://honeywell.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

Processes customer returns by creating a SAP returns order, updating the Salesforce case, and notifying customer service via Teams.

naftiko: "0.5"
info:
  label: "SAP Customer Returns Workflow"
  description: "Processes customer returns by creating a SAP returns order, updating the Salesforce case, and notifying customer service 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 SAP returns order, update case, and notify service team."
          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-return
              type: call
              call: "sap-s4.create-returns-order"
              with:
                customer: "{{get-case.sap_customer_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"
            - name: notify-service
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "customer-service"
                text: "Return processed: SAP {{create-return.order_number}} for case {{case_id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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://honeywell-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
          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

Manages fixed asset lifecycle by capitalizing in SAP, registering in ServiceNow CMDB, logging in Snowflake, and notifying finance via Teams.

naftiko: "0.5"
info:
  label: "SAP Fixed Asset Lifecycle Manager"
  description: "Manages fixed asset lifecycle by capitalizing in SAP, registering in ServiceNow CMDB, logging in Snowflake, and notifying finance via Teams."
  tags:
    - finance
    - asset-management
    - sap
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: manage-asset-lifecycle
          description: "Given asset details, capitalize in SAP, register in CMDB, log event, and notify finance."
          inputParameters:
            - name: description
              in: body
              type: string
              description: "Asset description."
            - name: cost_center
              in: body
              type: string
              description: "Cost center."
            - name: value
              in: body
              type: number
              description: "Acquisition value."
          steps:
            - name: create-asset
              type: call
              call: "sap-s4.create-fixed-asset"
              with:
                description: "{{description}}"
                cost_center: "{{cost_center}}"
                value: "{{value}}"
            - name: register-cmdb
              type: call
              call: "servicenow.create-ci"
              with:
                name: "{{description}}"
                asset_tag: "{{create-asset.asset_number}}"
            - name: log-event
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO asset_events VALUES ('{{create-asset.asset_number}}', 'capitalize', {{value}}, CURRENT_TIMESTAMP())"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "fixed-assets"
                text: "Asset capitalized: {{create-asset.asset_number}} - {{description}}. Value: ${{value}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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: create-fixed-asset
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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://honeywell.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 real-time inventory snapshot from Honeywell's SAP HANA database for a given plant and material group.

naftiko: "0.5"
info:
  label: "SAP HANA Inventory Snapshot"
  description: "Retrieves real-time inventory snapshot from Honeywell's SAP HANA database for a given plant and material group."
  tags:
    - supply-chain
    - inventory
    - sap-hana
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-inventory-snapshot
          description: "Given a plant code and material group, retrieve the current inventory levels, reorder points, and safety stock quantities."
          inputParameters:
            - name: plant
              in: body
              type: string
              description: "SAP plant code."
            - name: material_group
              in: body
              type: string
              description: "SAP material group."
          call: "sap-hana.query-inventory"
          with:
            plant: "{{plant}}"
            material_group: "{{material_group}}"
          outputParameters:
            - name: total_quantity
              type: number
              mapping: "$.results[0].total_qty"
            - name: below_reorder
              type: number
              mapping: "$.results[0].below_reorder_count"
  consumes:
    - type: http
      namespace: sap-hana
      baseUri: "https://honeywell-hana.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?$filter=Plant eq '{{plant}}' and MaterialGroup eq '{{material_group}}'"
          inputParameters:
            - name: plant
              in: query
            - name: material_group
              in: query
          operations:
            - name: query-inventory
              method: GET

Reconciles intercompany balances across SAP company codes, logs variances in Snowflake, and alerts the corporate accounting team via Teams.

naftiko: "0.5"
info:
  label: "SAP Intercompany Balance Reconciliation"
  description: "Reconciles intercompany balances across SAP company codes, logs variances 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 company codes and fiscal period, compare balances, log variances, and alert accounting."
          inputParameters:
            - name: company_1
              in: body
              type: string
              description: "First SAP company code."
            - name: company_2
              in: body
              type: string
              description: "Second SAP company code."
            - name: period
              in: body
              type: string
              description: "Fiscal period."
          steps:
            - name: get-balance-1
              type: call
              call: "sap-s4.get-ic-balance"
              with:
                company: "{{company_1}}"
                partner: "{{company_2}}"
            - name: get-balance-2
              type: call
              call: "sap-s4.get-ic-balance"
              with:
                company: "{{company_2}}"
                partner: "{{company_1}}"
            - name: log-variance
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO ic_recon VALUES ('{{company_1}}','{{company_2}}','{{period}}',{{get-balance-1.balance}},{{get-balance-2.balance}},CURRENT_TIMESTAMP())"
            - name: alert-accounting
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "corporate-accounting"
                text: "IC Recon {{period}}: {{company_1}} balance={{get-balance-1.balance}}, {{company_2}} balance={{get-balance-2.balance}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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}}' and TradingPartner eq '{{partner}}'"
          inputParameters:
            - name: company
              in: query
            - name: partner
              in: query
          operations:
            - name: get-ic-balance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.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 material master record details from Honeywell's SAP S/4HANA system including description, unit of measure, and material group.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master record details from Honeywell'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, and material group from Honeywell's SAP system."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          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://honeywell-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 material shortages, checks supplier lead times, creates purchase requisitions, and escalates to supply chain leadership via Teams.

naftiko: "0.5"
info:
  label: "SAP Material Shortage Response"
  description: "When SAP MRP identifies material shortages, checks supplier lead times, creates purchase requisitions, and escalates to supply chain leadership via Teams."
  tags:
    - supply-chain
    - procurement
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: respond-to-shortage
          description: "Given a material number and plant, verify shortage, check supplier alternatives, create PR, and escalate."
          inputParameters:
            - name: material
              in: body
              type: string
              description: "SAP material number."
            - name: plant
              in: body
              type: string
              description: "SAP plant code."
          steps:
            - name: get-mrp
              type: call
              call: "sap-s4.get-mrp-elements"
              with:
                material: "{{material}}"
                plant: "{{plant}}"
            - name: create-pr
              type: call
              call: "sap-s4.create-purchase-requisition"
              with:
                material: "{{material}}"
                plant: "{{plant}}"
                quantity: "{{get-mrp.shortage_qty}}"
            - name: escalate
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply-chain-alerts"
                text: "Material shortage: {{material}} at plant {{plant}}. Shortage: {{get-mrp.shortage_qty}}. PR {{create-pr.pr_number}} created."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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
          path: "/MRPMaterial(Material='{{material}}',MRPPlant='{{plant}}')/to_MRPElement"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-mrp-elements
              method: GET
        - name: pr
          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

Retrieves plant maintenance work order status from Honeywell's SAP PM module including planned dates, priority, and functional location.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Status"
  description: "Retrieves plant maintenance work order status from Honeywell's SAP PM module including planned dates, priority, and functional location."
  tags:
    - manufacturing
    - maintenance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-maint-order-status
          description: "Given a SAP maintenance order number, retrieve the order type, status, and planned completion date."
          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: status
              type: string
              mapping: "$.d.OrderStatusText"
            - name: planned_end
              type: string
              mapping: "$.d.MaintOrdBasicEndDate"
            - name: functional_location
              type: string
              mapping: "$.d.FunctionalLocation"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maint-orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-maint-order
              method: GET

Orchestrates the procure-to-pay cycle by matching invoices against SAP POs and goods receipts, routing exceptions to the AP team in ServiceNow, and posting payment status to Teams.

naftiko: "0.5"
info:
  label: "SAP Procurement to Payment Chain"
  description: "Orchestrates the procure-to-pay cycle by matching invoices against SAP POs and goods receipts, routing exceptions to the AP team in ServiceNow, and posting payment status to Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: process-invoice-match
          description: "Given a SAP invoice document number, perform three-way match, route exceptions, and notify the AP team."
          inputParameters:
            - name: invoice_doc
              in: body
              type: string
              description: "SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: "sap-s4.get-invoice"
              with:
                doc_number: "{{invoice_doc}}"
            - name: get-po
              type: call
              call: "sap-s4.get-po"
              with:
                po_number: "{{get-invoice.po_reference}}"
            - name: route-exception
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Invoice match: {{invoice_doc}} vs PO {{get-invoice.po_reference}}"
                assignment_group: "Accounts_Payable"
            - name: notify-ap
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "accounts-payable"
                text: "Invoice {{invoice_doc}} processed. PO: {{get-invoice.po_reference}}. Amount: {{get-invoice.amount}}. Task: {{route-exception.number}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{doc_number}}')"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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

When production orders complete in SAP, confirms goods receipt, updates Snowflake analytics, and notifies the operations team via Teams.

naftiko: "0.5"
info:
  label: "SAP Production Order Completion Chain"
  description: "When production orders complete in SAP, confirms goods receipt, updates Snowflake analytics, and notifies the operations team via Teams."
  tags:
    - manufacturing
    - erp
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: complete-order
          description: "Given a SAP production order, confirm goods, update analytics, and notify operations."
          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: "{{order_number}}"
            - name: confirm-goods
              type: call
              call: "sap-s4.post-goods-receipt"
              with:
                order: "{{order_number}}"
                quantity: "{{get-order.target_qty}}"
            - name: update-analytics
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO production_completions VALUES ('{{order_number}}','{{get-order.material}}',{{get-order.target_qty}},CURRENT_TIMESTAMP())"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "production-ops"
                text: "Production order {{order_number}} complete. Material: {{get-order.material}}, Qty: {{get-order.target_qty}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_ProductionOrder('{{order}}')"
          inputParameters:
            - name: order
              in: path
          operations:
            - name: get-production-order
              method: GET
            - name: post-goods-receipt
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.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

Optimizes production scheduling by pulling demand forecasts from Snowflake, checking material availability in SAP, creating production orders, and notifying the planning team via Teams.

naftiko: "0.5"
info:
  label: "SAP Production Scheduling Optimizer"
  description: "Optimizes production scheduling by pulling demand forecasts from Snowflake, checking material availability in SAP, creating production orders, and notifying the planning team via Teams."
  tags:
    - manufacturing
    - planning
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: optimize-schedule
          description: "Given a plant code and planning period, pull demand forecasts, check material availability, and create optimized production orders."
          inputParameters:
            - name: plant
              in: body
              type: string
              description: "SAP plant code."
            - name: period
              in: body
              type: string
              description: "Planning period in YYYY-WW format."
          steps:
            - name: get-demand
              type: call
              call: "snowflake.query-demand-forecast"
              with:
                plant: "{{plant}}"
                period: "{{period}}"
            - name: check-materials
              type: call
              call: "sap-s4.check-material-availability"
              with:
                plant: "{{plant}}"
                materials: "{{get-demand.required_materials}}"
            - name: create-orders
              type: call
              call: "sap-s4.create-production-orders"
              with:
                plant: "{{plant}}"
                schedule: "{{get-demand.optimized_schedule}}"
            - name: notify-planning
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "production-planning"
                text: "Production schedule optimized for plant {{plant}}, week {{period}}. {{create-orders.order_count}} orders created. Material availability: {{check-materials.availability_pct}}%."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-demand-forecast
              method: POST
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-availability
          path: "/A_MaterialAvailability"
          operations:
            - name: check-material-availability
              method: GET
        - name: production-orders
          path: "/A_ProductionOrder"
          operations:
            - name: create-production-orders
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a Honeywell SAP S/4HANA purchase order by number and returns header status, vendor, and total value."
  tags:
    - finance
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and currency from Honeywell's SAP S/4HANA instance."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500012345."
          call: "sap-erp.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://honeywell-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
              outputRawFormat: xml

Processes SAP quality inspection results, updates material disposition, creates Jira follow-ups for failures, and notifies quality control via Teams.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Processor"
  description: "Processes SAP quality inspection results, updates material disposition, creates Jira follow-ups for failures, and notifies quality control via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: process-inspection
          description: "Given a SAP inspection lot, process results, create follow-ups, and notify quality team."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "SAP inspection lot number."
          steps:
            - name: get-results
              type: call
              call: "sap-s4.get-inspection"
              with:
                lot: "{{lot_number}}"
            - name: create-follow-up
              type: call
              call: "jira.create-issue"
              with:
                project: "QUAL"
                issuetype: "Task"
                summary: "Inspection {{lot_number}}: {{get-results.disposition}}"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-control"
                text: "Inspection {{lot_number}} processed. Material: {{get-results.material}}. Disposition: {{get-results.disposition}}. Defect rate: {{get-results.defect_rate}}%."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: lots
          path: "/InspectionLot('{{lot}}')"
          inputParameters:
            - name: lot
              in: path
          operations:
            - name: get-inspection
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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 outbound deliveries from SAP logistics, updates Salesforce order status, and sends delivery notifications to the customer via Outlook.

naftiko: "0.5"
info:
  label: "SAP Shipment Delivery Tracker"
  description: "Tracks outbound deliveries from SAP logistics, updates Salesforce order status, and sends delivery notifications to the customer via Outlook."
  tags:
    - logistics
    - shipping
    - sap
    - salesforce
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: track-delivery
          description: "Given a SAP delivery number, retrieve shipment status, update Salesforce, and notify the customer."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery number."
          steps:
            - name: get-delivery
              type: call
              call: "sap-s4.get-delivery"
              with:
                delivery: "{{delivery_number}}"
            - name: update-sf
              type: call
              call: "salesforce.update-order"
              with:
                order_id: "{{get-delivery.sales_order}}"
                status: "{{get-delivery.status}}"
                tracking: "{{get-delivery.tracking_number}}"
            - name: notify-customer
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-delivery.customer_email}}"
                subject: "Shipment Update: {{delivery_number}}"
                body: "Your order is {{get-delivery.status}}. Tracking: {{get-delivery.tracking_number}}. ETA: {{get-delivery.eta}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://honeywell.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
              method: PATCH
    - 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

Onboards new suppliers by creating SAP vendor master records, setting up supplier portals in Salesforce, and notifying procurement via Teams.

naftiko: "0.5"
info:
  label: "SAP Supplier Onboarding Orchestrator"
  description: "Onboards new suppliers by creating SAP vendor master records, setting up supplier portals in Salesforce, and notifying procurement via Teams."
  tags:
    - procurement
    - supplier-management
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier details, create SAP vendor, Salesforce partner account, and notify procurement."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Supplier legal name."
            - name: tax_id
              in: body
              type: string
              description: "Tax identification number."
            - name: category
              in: body
              type: string
              description: "Supplier category."
          steps:
            - name: create-vendor
              type: call
              call: "sap-s4.create-supplier"
              with:
                name: "{{supplier_name}}"
                tax_id: "{{tax_id}}"
                category: "{{category}}"
            - name: create-partner
              type: call
              call: "salesforce.create-account"
              with:
                name: "{{supplier_name}}"
                type: "Supplier"
                sap_id: "{{create-vendor.vendor_number}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement"
                text: "Supplier onboarded: {{supplier_name}}. SAP: {{create-vendor.vendor_number}}. Salesforce: {{create-partner.id}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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: salesforce
      baseUri: "https://honeywell.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

Retrieves vendor payment status from Honeywell's SAP system including outstanding invoices, payment due dates, and payment block status.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Status Lookup"
  description: "Retrieves vendor payment status from Honeywell's SAP system including outstanding invoices, payment due dates, and payment block status."
  tags:
    - finance
    - accounts-payable
    - sap
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: get-payment-status
          description: "Given a SAP vendor number, retrieve outstanding invoice count, total amount due, and next payment date from Honeywell's SAP system."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor account number."
          call: "sap-s4.get-vendor-payments"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: outstanding_count
              type: number
              mapping: "$.d.results.length"
            - name: total_amount
              type: number
              mapping: "$.d.TotalAmount"
            - name: next_payment_date
              type: string
              mapping: "$.d.NextPaymentDate"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendor-invoices
          path: "/A_SupplierInvoice?$filter=InvoicingParty eq '{{vendor_number}}' and PaymentIsBlocked eq false"
          inputParameters:
            - name: vendor_number
              in: query
          operations:
            - name: get-vendor-payments
              method: GET

Optimizes warehouse operations by analyzing SAP WM storage bin utilization, recommending reallocations via Snowflake analytics, and notifying the warehouse team via Teams.

naftiko: "0.5"
info:
  label: "SAP Warehouse Management Optimization"
  description: "Optimizes warehouse operations by analyzing SAP WM storage bin utilization, recommending reallocations via Snowflake analytics, and notifying the warehouse team via Teams."
  tags:
    - logistics
    - warehouse
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: optimize-warehouse
          description: "Given a warehouse number, analyze bin utilization, generate reallocation recommendations, and notify the team."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "SAP warehouse number."
          steps:
            - name: get-utilization
              type: call
              call: "sap-s4.get-bin-utilization"
              with:
                warehouse: "{{warehouse}}"
            - name: get-recommendations
              type: call
              call: "snowflake.query-optimization"
              with:
                warehouse: "{{warehouse}}"
                utilization: "{{get-utilization.data}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "warehouse-ops"
                text: "Warehouse {{warehouse}} optimization: Utilization {{get-utilization.avg_pct}}%. {{get-recommendations.reallocation_count}} bins need reallocation."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_MGMT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bins
          path: "/StorageBin?$filter=Warehouse eq '{{warehouse}}'"
          inputParameters:
            - name: warehouse
              in: query
          operations:
            - name: get-bin-utilization
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-optimization
              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

Creates a ServiceNow change request for a planned system update, routes it for CAB approval, and notifies stakeholders in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Workflow"
  description: "Creates a ServiceNow change request for a planned system update, routes it for CAB approval, and notifies stakeholders in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a system name, change description, and planned implementation window, create a ServiceNow normal change request, assign it to the CAB approval group, and notify the stakeholders channel in Teams."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "The name of the system or service being changed."
            - name: change_description
              in: body
              type: string
              description: "A detailed description of the planned change."
            - name: planned_start
              in: body
              type: string
              description: "Planned start datetime in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned end datetime in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow-chg.create-change-request"
              with:
                short_description: "Change: {{system_name}}"
                description: "{{change_description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
                type: "normal"
                assignment_group: "CAB"
            - name: notify-stakeholders
              type: call
              call: "msteams-chg.post-channel-message"
              with:
                channel_id: "$secrets.itops_channel_id"
                message: "Change request submitted for {{system_name}}. SNOW: {{create-change.number}}. Planned: {{planned_start}} to {{planned_end}}. Awaiting CAB approval."
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://honeywell.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-request
              method: POST
    - type: http
      namespace: msteams-chg
      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: post-channel-message
              method: POST

Reconciles ServiceNow CMDB against Azure AD device inventory, flags discrepancies, and creates remediation tasks.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Discovery Reconciliation"
  description: "Reconciles ServiceNow CMDB against Azure AD device inventory, flags discrepancies, and creates remediation tasks."
  tags:
    - it-operations
    - asset-management
    - servicenow
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: cmdb
      port: 8080
      tools:
        - name: reconcile-cmdb
          description: "Given a CI class, compare CMDB against Azure AD devices and create remediation tasks for discrepancies."
          inputParameters:
            - name: ci_class
              in: body
              type: string
              description: "CMDB CI class."
          steps:
            - name: get-cmdb
              type: call
              call: "servicenow.get-ci-list"
              with:
                ci_class: "{{ci_class}}"
            - name: get-azure-devices
              type: call
              call: "azuread.get-devices"
              with:
                filter: "deviceOS eq 'Windows'"
            - name: create-remediation
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "CMDB reconciliation: {{ci_class}} discrepancies"
                assignment_group: "CMDB_Management"
                description: "CMDB: {{get-cmdb.count}} records. Azure: {{get-azure-devices.count}} devices."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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-ci-list
              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

When a P1 incident is raised in ServiceNow, correlates it with Dynatrace alerts, assigns the on-call engineer via PagerDuty, and posts a war-room message to Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Response Handler"
  description: "When a P1 incident is raised in ServiceNow, correlates it with Dynatrace alerts, assigns the on-call engineer via PagerDuty, and posts a war-room message to Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - dynatrace
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow P1 incident number, fetch alert details from Dynatrace, trigger a PagerDuty incident for on-call escalation, and post a war-room message to Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-read.get-incident"
              with:
                number: "{{incident_number}}"
            - name: get-dynatrace-alert
              type: call
              call: "dynatrace.get-problem"
              with:
                problem_id: "{{get-incident.dynatrace_problem_id}}"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "P1: {{get-incident.short_description}}"
                service_id: "$secrets.pagerduty_service_id"
                details: "SNOW: {{incident_number}} | Dynatrace: {{get-dynatrace-alert.title}}"
            - name: post-warroom
              type: call
              call: "msteams-war.post-channel-message"
              with:
                channel_id: "$secrets.warroom_channel_id"
                message: "P1 INCIDENT: {{get-incident.short_description}} | PagerDuty: {{page-oncall.incident_id}} | Dynatrace: {{get-dynatrace-alert.impact_level}}"
  consumes:
    - type: http
      namespace: servicenow-read
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: dynatrace
      baseUri: "https://honeywell.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Api-Token"
        value: "$secrets.dynatrace_api_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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-war
      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: post-channel-message
              method: POST

Searches Honeywell's ServiceNow knowledge base for articles matching a query and returns the top results with titles, snippets, and article IDs.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches Honeywell's ServiceNow knowledge base for articles matching a query and returns the top results with titles, snippets, and article IDs."
  tags:
    - it-operations
    - knowledge-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: search-knowledge
          description: "Given a search query, retrieve matching knowledge articles from Honeywell's ServiceNow knowledge base."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query text."
          call: "servicenow.search-kb"
          with:
            query: "{{query}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: knowledge
          path: "/table/kb_knowledge?sysparm_query=short_descriptionLIKE{{query}}&sysparm_limit=10"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search-kb
              method: GET

Routes engineering documents from SharePoint through approval in ServiceNow and notifies approvers via Teams.

naftiko: "0.5"
info:
  label: "SharePoint Engineering Document Workflow"
  description: "Routes engineering documents from SharePoint through approval in ServiceNow and notifies approvers via Teams."
  tags:
    - document-management
    - engineering
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: docs
      port: 8080
      tools:
        - name: route-doc-approval
          description: "Given a SharePoint document ID, create approval workflow and notify approvers."
          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-doc
              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-doc.name}}"
                approver: "{{get-doc.approver}}"
            - name: notify-approvers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "engineering-docs"
                text: "Document pending approval: {{get-doc.name}} v{{get-doc.version}}. SNOW: {{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://honeywell.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

Queries Honeywell's Snowflake data warehouse for building automation analytics including HVAC efficiency, occupancy rates, and energy consumption.

naftiko: "0.5"
info:
  label: "Snowflake Building Analytics Query"
  description: "Queries Honeywell's Snowflake data warehouse for building automation analytics including HVAC efficiency, occupancy rates, and energy consumption."
  tags:
    - iot
    - building-automation
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-building-analytics
          description: "Given a building ID and date range, retrieve HVAC efficiency score, occupancy rate, and energy consumption from Honeywell's Snowflake warehouse."
          inputParameters:
            - name: building_id
              in: body
              type: string
              description: "Building identifier."
            - name: period
              in: body
              type: string
              description: "Reporting period, e.g. 2026-Q1."
          call: "snowflake.query-building"
          with:
            building_id: "{{building_id}}"
            period: "{{period}}"
          outputParameters:
            - name: hvac_efficiency
              type: number
              mapping: "$.data[0].HVAC_EFFICIENCY"
            - name: occupancy_rate
              type: number
              mapping: "$.data[0].OCCUPANCY_RATE"
            - name: energy_kwh
              type: number
              mapping: "$.data[0].ENERGY_KWH"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-building
              method: POST

Runs data quality validation queries in Snowflake and publishes results to a Power BI dashboard, alerting via Teams if thresholds are breached.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Quality Check"
  description: "Runs data quality validation queries in Snowflake and publishes results to a Power BI dashboard, alerting via Teams if thresholds are breached."
  tags:
    - data
    - analytics
    - snowflake
    - power-bi
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: run-pipeline-quality-check
          description: "Execute a named data quality check in Snowflake, publish the result to Power BI, and send a Teams alert if the quality score falls below the threshold."
          inputParameters:
            - name: check_name
              in: body
              type: string
              description: "The name of the Snowflake data quality check stored procedure to run."
            - name: quality_threshold
              in: body
              type: number
              description: "Minimum acceptable quality score (0–100). Alerts are sent if score is below this value."
          steps:
            - name: run-check
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL data_quality.{{check_name}}()"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "$secrets.powerbi_dq_dataset_id"
            - name: send-alert
              type: call
              call: "msteams-data.post-channel-message"
              with:
                channel_id: "$secrets.data_eng_channel_id"
                message: "Data quality check {{check_name}} completed. Score: {{run-check.quality_score}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.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
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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: post-channel-message
              method: POST

When Snowflake data quality checks fail, creates Jira tickets for data stewards and notifies the data governance team via Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert Handler"
  description: "When Snowflake data quality checks fail, creates Jira tickets for data stewards and notifies the data governance team via Teams."
  tags:
    - data-governance
    - data-quality
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: handle-dq-alert
          description: "Given a Snowflake task name and failure details, create Jira ticket and notify data stewards."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake DQ task name."
            - name: dataset
              in: body
              type: string
              description: "Affected dataset name."
          steps:
            - name: get-details
              type: call
              call: "snowflake.get-task-results"
              with:
                task: "{{task_name}}"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "DQ"
                issuetype: "Bug"
                summary: "DQ failure: {{dataset}} - {{get-details.failure_count}} records"
            - name: notify-stewards
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-governance"
                text: "Data quality alert: {{dataset}}. {{get-details.failure_count}} records failed. Jira: {{create-jira.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: get-task-results
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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

Aggregates building energy consumption data from Snowflake, generates a Power BI dashboard refresh, and distributes sustainability reports via Outlook.

naftiko: "0.5"
info:
  label: "Snowflake Energy Consumption Report Pipeline"
  description: "Aggregates building energy consumption data from Snowflake, generates a Power BI dashboard refresh, and distributes sustainability reports via Outlook."
  tags:
    - sustainability
    - energy-management
    - snowflake
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a building portfolio and period, aggregate energy data, refresh the dashboard, and email the report."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "Building portfolio identifier."
            - name: period
              in: body
              type: string
              description: "Reporting period."
          steps:
            - name: query-energy
              type: call
              call: "snowflake.query-energy-data"
              with:
                portfolio: "{{portfolio_id}}"
                period: "{{period}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.trigger-refresh"
              with:
                dataset_id: "energy-portfolio-dashboard"
            - name: send-report
              type: call
              call: "outlook.send-email"
              with:
                to: "sustainability@honeywell.com"
                subject: "Energy Report: Portfolio {{portfolio_id}} - {{period}}"
                body: "Total consumption: {{query-energy.total_kwh}} kWh. Cost: ${{query-energy.total_cost}}. vs target: {{query-energy.variance_pct}}%."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://honeywell.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-energy-data
              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

When a supplier quality issue is detected, creates a SAP quality notification, opens a corrective action in Jira, updates the supplier risk score in Salesforce, and notifies procurement via Teams.

naftiko: "0.5"
info:
  label: "Supplier Quality Nonconformance Handler"
  description: "When a supplier quality issue is detected, creates a SAP quality notification, opens a corrective action in Jira, updates the supplier risk score in Salesforce, and notifies procurement via Teams."
  tags:
    - quality
    - procurement
    - sap
    - jira
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: handle-supplier-ncr
          description: "Given a supplier ID, part number, and defect details, create records across SAP, Jira, and Salesforce, and alert procurement."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "SAP supplier number."
            - name: part_number
              in: body
              type: string
              description: "Defective part number."
            - name: defect_description
              in: body
              type: string
              description: "Description of the quality issue."
          steps:
            - name: create-qn
              type: call
              call: "sap-s4.create-quality-notification"
              with:
                notification_type: "Q3"
                supplier: "{{supplier_id}}"
                material: "{{part_number}}"
                description: "{{defect_description}}"
            - name: create-capa
              type: call
              call: "jira.create-issue"
              with:
                project: "SQUAL"
                issuetype: "Bug"
                summary: "Supplier NCR: {{supplier_id}} part {{part_number}}"
                description: "SAP QN: {{create-qn.notification_number}}. Defect: {{defect_description}}"
            - name: update-supplier-risk
              type: call
              call: "salesforce.update-supplier-record"
              with:
                supplier_id: "{{supplier_id}}"
                ncr_count_increment: 1
                last_ncr_date: "today"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supplier-quality"
                text: "Supplier NCR: {{supplier_id}} for part {{part_number}}. SAP QN: {{create-qn.notification_number}}. CAPA Jira: {{create-capa.key}}."
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://honeywell-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://honeywell.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: salesforce
      baseUri: "https://honeywell.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: supplier-records
          path: "/sobjects/Supplier__c/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: update-supplier-record
              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

Creates and configures a new Terraform Cloud workspace for a Honeywell product team, seeds it with variable sets, and notifies the team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Provisioner"
  description: "Creates and configures a new Terraform Cloud workspace for a Honeywell product team, seeds it with variable sets, and notifies the team via Microsoft Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-terraform-workspace
          description: "Given a team name and environment, create a Terraform Cloud workspace, apply the standard Honeywell variable set, and notify the team channel in Microsoft Teams."
          inputParameters:
            - name: team_name
              in: body
              type: string
              description: "The product team name, used as the workspace prefix."
            - name: environment
              in: body
              type: string
              description: "The target environment: dev, staging, or prod."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to notify upon completion."
          steps:
            - name: create-workspace
              type: call
              call: "terraform.create-workspace"
              with:
                name: "{{team_name}}-{{environment}}"
                organization: "honeywell"
            - name: assign-varset
              type: call
              call: "terraform-varset.assign-variable-set"
              with:
                workspace_id: "{{create-workspace.workspace_id}}"
                varset_id: "$secrets.terraform_standard_varset_id"
            - name: notify-team
              type: call
              call: "msteams-infra.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Workspace {{team_name}}-{{environment}} created in Terraform Cloud. ID: {{create-workspace.workspace_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/honeywell/workspaces"
          operations:
            - name: create-workspace
              method: POST
    - type: http
      namespace: terraform-varset
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: variable-set-workspaces
          path: "/varsets/{{varset_id}}/relationships/workspaces"
          inputParameters:
            - name: varset_id
              in: path
          operations:
            - name: assign-variable-set
              method: POST
    - type: http
      namespace: msteams-infra
      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: post-channel-message
              method: POST

Detects Terraform infrastructure drift, creates Jira remediation tasks, and notifies the platform engineering team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection Remediation"
  description: "Detects Terraform infrastructure drift, creates Jira remediation tasks, and notifies the platform engineering team via Teams."
  tags:
    - infrastructure
    - compliance
    - terraform
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: platform
      port: 8080
      tools:
        - name: detect-and-remediate-drift
          description: "Given a Terraform workspace, check for drift, create Jira tasks, and alert the team."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace name."
          steps:
            - name: check-drift
              type: call
              call: "terraform.get-drift"
              with:
                workspace: "{{workspace}}"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                issuetype: "Bug"
                summary: "Drift: {{workspace}} - {{check-drift.drift_count}} resources"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "platform-engineering"
                text: "Drift detected: {{workspace}}. {{check-drift.drift_count}} resources. 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/honeywell/workspaces/{{workspace}}"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: get-drift
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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

Checks the status of a Terraform Cloud workspace including latest run status, drift detection, and resource count for Honeywell infrastructure.

naftiko: "0.5"
info:
  label: "Terraform Workspace Status Check"
  description: "Checks the status of a Terraform Cloud workspace including latest run status, drift detection, and resource count for Honeywell infrastructure."
  tags:
    - infrastructure
    - devops
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: platform
      port: 8080
      tools:
        - name: get-workspace-status
          description: "Given a Terraform workspace name, retrieve the latest run status, resource count, and last apply time."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name."
          call: "terraform.get-workspace"
          with:
            workspace_name: "{{workspace_name}}"
          outputParameters:
            - name: run_status
              type: string
              mapping: "$.data.attributes.current-run.status"
            - name: resource_count
              type: number
              mapping: "$.data.attributes.resource-count"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/honeywell/workspaces/{{workspace_name}}"
          inputParameters:
            - name: workspace_name
              in: path
          operations:
            - name: get-workspace
              method: GET

When a contractor engagement ends in Workday, deprovisions Okta access, closes ServiceNow tickets, reclaims laptop via ITSM, and notifies the sponsor via Teams.

naftiko: "0.5"
info:
  label: "Workday Contractor Offboarding Chain"
  description: "When a contractor engagement ends in Workday, deprovisions Okta access, closes ServiceNow tickets, reclaims laptop via ITSM, and notifies the sponsor via Teams."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: offboard-contractor
          description: "Given a Workday contingent worker ID, deprovision Okta, close tickets, reclaim assets, and notify sponsor."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday contingent worker ID."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: deprovision-okta
              type: call
              call: "okta.deactivate-user"
              with:
                email: "{{get-worker.work_email}}"
            - name: close-tickets
              type: call
              call: "servicenow.close-user-tickets"
              with:
                user_email: "{{get-worker.work_email}}"
            - name: notify-sponsor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-worker.sponsor_email}}"
                text: "Contractor {{get-worker.display_name}} offboarded. Okta deactivated. {{close-tickets.closed_count}} tickets closed."
  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: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}/lifecycle/deactivate"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tickets
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks employee training compliance in Workday Learning, flags overdue certifications, creates ServiceNow tasks, and notifies managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Check"
  description: "Checks employee training compliance in Workday Learning, flags overdue certifications, creates ServiceNow 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
          description: "Given an employee ID, check for overdue training, create follow-up tasks, and notify manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          steps:
            - name: get-training
              type: call
              call: "workday.get-learning-status"
              with:
                worker_id: "{{employee_id}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Overdue training: {{get-training.employee_name}}"
                description: "Overdue: {{get-training.overdue_courses}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-training.manager_email}}"
                text: "Training alert: {{get-training.employee_name}} has {{get-training.overdue_count}} overdue courses. Task: {{create-task.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: "/honeywell/learningAssignments?worker={{worker_id}}&status=overdue"
          inputParameters:
            - name: worker_id
              in: query
          operations:
            - name: get-learning-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://honeywell.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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves organizational hierarchy information from Honeywell's Workday HCM for a given employee including manager chain and direct reports.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves organizational hierarchy information from Honeywell's Workday HCM for a given employee including manager chain and direct reports."
  tags:
    - hr
    - organization
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-org-chart
          description: "Given a Workday employee ID, retrieve the employee's manager, manager's manager, and list of direct reports."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
          call: "workday.get-org-hierarchy"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: manager_name
              type: string
              mapping: "$.manager.displayName"
            - name: direct_reports_count
              type: number
              mapping: "$.directReports.length"
            - name: department
              type: string
              mapping: "$.department"
  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: "/honeywell/workers/{{employee_id}}?expand=manager,directReports"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-org-hierarchy
              method: GET

Exports current headcount by department and cost center from Workday for finance reporting and headcount planning.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Exports current headcount by department and cost center from Workday for finance reporting and headcount planning."
  tags:
    - hr
    - finance
    - reporting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns the current headcount grouped by department and cost center from Workday. Use for monthly headcount planning, finance reviews, or cost center allocation audits."
          call: "workday-hcm.get-headcount"
          outputParameters:
            - name: workers
              type: array
              mapping: "$.Report_Entry"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.Employee_ID"
                - name: full_name
                  type: string
                  mapping: "$.Full_Name"
                - name: department
                  type: string
                  mapping: "$.Department"
                - name: cost_center
                  type: string
                  mapping: "$.Cost_Center"
                - name: employment_type
                  type: string
                  mapping: "$.Employment_Type"
  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: headcount-report
          path: "/honeywell/reports/headcount_by_department"
          operations:
            - name: get-headcount
              method: GET

Launches annual performance review cycles by pulling employee rosters from Workday, creating Jira tracking tasks, and notifying managers via Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Orchestrator"
  description: "Launches annual performance review cycles by pulling employee rosters from Workday, creating Jira tracking tasks, and notifying managers via Teams."
  tags:
    - hr
    - performance-management
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: launch-reviews
          description: "Given a review period and business unit, create review tasks and notify managers."
          inputParameters:
            - name: review_period
              in: body
              type: string
              description: "Review period identifier."
            - 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-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "HR"
                issuetype: "Task"
                summary: "{{review_period}} reviews for {{business_unit}}"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr-performance"
                text: "Review cycle {{review_period}} launched for {{business_unit}}. {{get-roster.employee_count}} reviews pending."
  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: "/honeywell/workers?supervisoryOrganization={{org_id}}"
          inputParameters:
            - name: org_id
              in: query
          operations:
            - name: get-org-roster
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://honeywell.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

Fetches open job requisitions from Workday Recruiting and publishes a weekly status digest to the HR leadership Confluence page.

naftiko: "0.5"
info:
  label: "Workday Recruiting Pipeline Status"
  description: "Fetches open job requisitions from Workday Recruiting and publishes a weekly status digest to the HR leadership Confluence page."
  tags:
    - hr
    - recruiting
    - workday
    - confluence
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: talent-ops
      port: 8080
      tools:
        - name: publish-recruiting-digest
          description: "Retrieve all open job requisitions from Workday Recruiting, count openings by department, and publish a weekly summary to the HR Confluence space."
          inputParameters:
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID where the recruiting digest should be published."
          steps:
            - name: get-open-reqs
              type: call
              call: "workday-recruit.list-job-requisitions"
              with:
                status: "Open"
            - name: publish-page
              type: call
              call: "confluence-hr.update-page"
              with:
                page_id: "{{confluence_page_id}}"
                content: "Open Requisitions: {{get-open-reqs.total_count}}. By Department: {{get-open-reqs.by_department}}"
  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: "/honeywell/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-job-requisitions
              method: GET
    - type: http
      namespace: confluence-hr
      baseUri: "https://honeywell.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT

When an employee's role changes in Workday, updates their Salesforce profile, adjusts Okta group memberships, and notifies the manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Propagation"
  description: "When an employee's role changes in Workday, updates their Salesforce profile, adjusts Okta group memberships, and notifies the manager via Microsoft Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: propagate-role-change
          description: "Given a Workday employee ID and new role, update the employee's Salesforce user profile, adjust Okta group memberships for the new role, and send a Teams notification to their manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role changed."
            - name: new_role
              in: body
              type: string
              description: "The new job role or title as defined in Workday."
          steps:
            - name: get-employee
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-salesforce-profile
              type: call
              call: "salesforce-role.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                title: "{{new_role}}"
            - name: update-okta-groups
              type: call
              call: "okta-role.update-user-groups"
              with:
                user_id: "{{get-employee.okta_user_id}}"
                role: "{{new_role}}"
            - name: notify-manager
              type: call
              call: "msteams-role.send-message"
              with:
                recipient: "{{get-employee.manager_email}}"
                message: "{{get-employee.full_name}} has been updated to the role {{new_role}} in Salesforce and Okta."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/honeywell/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce-role
      baseUri: "https://honeywell.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: okta-role
      baseUri: "https://honeywell.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: msteams-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a pending time-off request from Workday Absence Management, checks team coverage via Workday, and approves or queues for manager review.

naftiko: "0.5"
info:
  label: "Workday Time-Off Request Approval"
  description: "Retrieves a pending time-off request from Workday Absence Management, checks team coverage via Workday, and approves or queues for manager review."
  tags:
    - hr
    - absence-management
    - workday
    - approval
capability:
  exposes:
    - type: mcp
      namespace: absence-management
      port: 8080
      tools:
        - name: process-time-off-request
          description: "Given a Workday time-off request ID, retrieve request details, check if team coverage meets the minimum threshold, and automatically approve if coverage is sufficient or flag for manager review."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The Workday absence request ID."
          steps:
            - name: get-request
              type: call
              call: "workday-absence.get-absence-request"
              with:
                request_id: "{{request_id}}"
            - name: check-coverage
              type: call
              call: "workday-team.get-team-schedule"
              with:
                cost_center: "{{get-request.cost_center}}"
                start_date: "{{get-request.start_date}}"
                end_date: "{{get-request.end_date}}"
            - name: approve-request
              type: call
              call: "workday-absence-approve.approve-absence"
              with:
                request_id: "{{request_id}}"
                decision: "approved"
  consumes:
    - type: http
      namespace: workday-absence
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absence-requests
          path: "/honeywell/absenceRequests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-absence-request
              method: GET
    - type: http
      namespace: workday-team
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: team-schedule
          path: "/honeywell/teamSchedule"
          inputParameters:
            - name: cost_center
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-team-schedule
              method: GET
    - type: http
      namespace: workday-absence-approve
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absence-approvals
          path: "/honeywell/absenceRequests/{{request_id}}/approve"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: approve-absence
              method: POST

Creates a Zoom meeting for a Salesforce account's executive briefing and sends calendar invites via Microsoft Graph to all attendees.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler for Customer Briefings"
  description: "Creates a Zoom meeting for a Salesforce account's executive briefing and sends calendar invites via Microsoft Graph to all attendees."
  tags:
    - sales
    - communication
    - zoom
    - salesforce
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: customer-engagement
      port: 8080
      tools:
        - name: schedule-customer-briefing
          description: "Given a Salesforce account ID and meeting date/time, create a Zoom meeting, retrieve the join URL, and send calendar invites to all account contacts via Microsoft Graph."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the customer."
            - name: meeting_time
              in: body
              type: string
              description: "The meeting start time in ISO 8601 format."
            - name: duration_minutes
              in: body
              type: integer
              description: "Meeting duration in minutes."
          steps:
            - name: get-account
              type: call
              call: "salesforce-acct.get-account"
              with:
                account_id: "{{account_id}}"
            - name: create-meeting
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "Honeywell Executive Briefing — {{get-account.name}}"
                start_time: "{{meeting_time}}"
                duration: "{{duration_minutes}}"
            - name: send-invite
              type: call
              call: "msgraph-cal.create-event"
              with:
                subject: "Honeywell Executive Briefing — {{get-account.name}}"
                start: "{{meeting_time}}"
                join_url: "{{create-meeting.join_url}}"
  consumes:
    - type: http
      namespace: salesforce-acct
      baseUri: "https://honeywell.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: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: msgraph-cal
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/me/events"
          operations:
            - name: create-event
              method: POST