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