Danaher Capabilities
Naftiko 0.5 capability definitions for Danaher - 100 capabilities showing integration workflows and service orchestrations.
Retrieves metadata for archived data files in S3.
naftiko: "0.5"
info:
label: "Amazon S3 Data Archive Lookup"
description: "Retrieves metadata for archived data files in S3."
tags:
- data
- cloud
- amazon-s3
capability:
exposes:
- type: mcp
namespace: data-archive
port: 8080
tools:
- name: get-archive-metadata
description: "Given bucket and prefix, return object metadata. Use for archived data."
inputParameters:
- name: bucket
in: body
type: string
description: "S3 bucket."
- name: prefix
in: body
type: string
description: "Key prefix."
call: s3.list-objects
with:
bucket: "{{bucket}}"
prefix: "{{prefix}}"
outputParameters:
- name: object_count
type: integer
mapping: "$.KeyCount"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.aws_s3_auth"
placement: header
resources:
- name: objects
path: "/{{bucket}}?list-type=2&prefix={{prefix}}"
inputParameters:
- name: bucket
in: path
- name: prefix
in: query
operations:
- name: list-objects
method: GET
When AWS Cost Anomaly Detection identifies a significant spend spike across Danaher's AWS accounts, creates a ServiceNow FinOps incident and notifies the cloud governance team in Microsoft Teams.
naftiko: "0.5"
info:
label: "AWS Cost Anomaly to FinOps Incident"
description: "When AWS Cost Anomaly Detection identifies a significant spend spike across Danaher's AWS accounts, creates a ServiceNow FinOps incident and notifies the cloud governance team in Microsoft Teams."
tags:
- cloud
- finops
- aws
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-aws-cost-anomaly
description: "Given an AWS cost anomaly with account ID, service, and excess spend, create a ServiceNow FinOps incident and notify the cloud governance channel in Microsoft Teams. Use when AWS anomaly detection fires above the cost threshold for any Danaher operating company account."
inputParameters:
- name: aws_account_id
in: body
type: string
description: "AWS account ID where the cost anomaly was detected."
- name: service_name
in: body
type: string
description: "AWS service experiencing the anomaly."
- name: excess_spend_usd
in: body
type: string
description: "Estimated excess spend in USD above expected baseline."
- name: opco_name
in: body
type: string
description: "Danaher operating company associated with the AWS account."
steps:
- name: create-finops-incident
type: call
call: servicenow-finops.create-incident
with:
short_description: "AWS Cost Anomaly: {{service_name}} — {{opco_name}} (${{excess_spend_usd}} over budget)"
category: "Cloud FinOps"
urgency: "2"
description: "Account: {{aws_account_id}}\nOpCo: {{opco_name}}\nService: {{service_name}}\nExcess: ${{excess_spend_usd}}"
- name: notify-cloud-governance
type: call
call: msteams-finops.send-message
with:
channel_id: "cloud-governance"
message: "AWS COST ANOMALY: {{opco_name}} / {{service_name}} — ${{excess_spend_usd}} over baseline | Account: {{aws_account_id}} | SNOW: {{create-finops-incident.number}}"
consumes:
- type: http
namespace: servicenow-finops
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Azure AD group memberships across Danaher shared directory.
naftiko: "0.5"
info:
label: "Azure AD Group Membership Lookup"
description: "Retrieves Azure AD group memberships across Danaher shared directory."
tags:
- security
- identity
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: ad-groups
port: 8080
tools:
- name: get-user-groups
description: "Given UPN, return group memberships. Use for access auditing."
inputParameters:
- name: user_upn
in: body
type: string
description: "UPN."
call: azure-ad.get-member-of
with:
upn: "{{user_upn}}"
outputParameters:
- name: group_count
type: integer
mapping: "$.value.length"
consumes:
- type: http
namespace: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.azure_ad_token"
resources:
- name: users
path: "/users/{{upn}}/memberOf"
inputParameters:
- name: upn
in: path
operations:
- name: get-member-of
method: GET
Queries Azure Cost Management for resource group spend.
naftiko: "0.5"
info:
label: "Azure Resource Cost Lookup"
description: "Queries Azure Cost Management for resource group spend."
tags:
- it
- cloud
- microsoft-azure
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: get-resource-cost
description: "Given resource group, return spend. Use for FinOps."
inputParameters:
- name: resource_group
in: body
type: string
description: "Azure resource group."
call: azure.get-cost-summary
with:
rg_name: "{{resource_group}}"
outputParameters:
- name: current_spend
type: number
mapping: "$.properties.rows[0].cost"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: cost
path: "/subscriptions/{{sub}}/resourceGroups/{{rg_name}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: rg_name
in: path
operations:
- name: get-cost-summary
method: POST
Manages calibration scheduling for Beckman Coulter diagnostic instruments by checking due dates, creating work orders, and notifying field service.
naftiko: "0.5"
info:
label: "Beckman Coulter Instrument Calibration Orchestration"
description: "Manages calibration scheduling for Beckman Coulter diagnostic instruments by checking due dates, creating work orders, and notifying field service."
tags:
- quality
- diagnostics
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: instrument-calibration
port: 8080
tools:
- name: schedule-calibration
description: "Given instrument serial number, check due date, create work order, and notify. Use for Beckman Coulter calibration management."
inputParameters:
- name: serial_number
in: body
type: string
description: "Instrument serial number."
steps:
- name: check-due
type: call
call: sap-erp.get-calibration-status
with:
equipment: "{{serial_number}}"
- name: create-wo
type: call
call: servicenow.create-work-order
with:
short_description: "Calibration: BC instrument {{serial_number}}"
due_date: "{{check-due.next_cal_date}}"
assigned_group: "Field_Service_BC"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "beckman-field-service"
text: "Calibration scheduled: BC {{serial_number}}. Due: {{check-due.next_cal_date}}. WO: {{create-wo.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment}}')/calibration"
inputParameters:
- name: equipment
in: path
operations:
- name: get-calibration-status
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages diagnostic reagent lot release for Beckman Coulter products.
naftiko: "0.5"
info:
label: "Beckman Coulter Reagent Lot Release Orchestration"
description: "Manages diagnostic reagent lot release for Beckman Coulter products."
tags:
- quality
- manufacturing
- diagnostics
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lot-release
port: 8080
tools:
- name: release-reagent-lot
description: "Given batch and product, verify QC, release, create CoA, and notify. Use for BC lot release."
inputParameters:
- name: batch_number
in: body
type: string
description: "Batch number."
- name: product_code
in: body
type: string
description: "Product code."
steps:
- name: get-qc
type: call
call: sap-erp.get-inspection
with:
batch: "{{batch_number}}"
- name: release
type: call
call: sap-erp.release-batch
with:
batch: "{{batch_number}}"
- name: create-coa
type: call
call: servicenow.create-task
with:
short_description: "CoA: BC {{batch_number}}"
category: "quality_release"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "bc-distribution"
text: "BC lot {{batch_number}} released. CoA: {{create-coa.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspections
path: "/A_InspectionResult"
operations:
- name: get-inspection
method: GET
- name: batches
path: "/A_BatchRelease"
operations:
- name: release-batch
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Uploads documents to Box for Danaher shared document management.
naftiko: "0.5"
info:
label: "Box Document Upload"
description: "Uploads documents to Box for Danaher shared document management."
tags:
- documentation
- collaboration
- box
capability:
exposes:
- type: mcp
namespace: file-storage
port: 8080
tools:
- name: upload-to-box
description: "Given folder ID and file name, upload to Box. Use for document storage."
inputParameters:
- name: folder_id
in: body
type: string
description: "Folder ID."
- name: file_name
in: body
type: string
description: "File name."
call: box.upload-file
with:
folder_id: "{{folder_id}}"
name: "{{file_name}}"
outputParameters:
- name: file_id
type: string
mapping: "$.entries[0].id"
consumes:
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Validates new Cepheid GeneXpert molecular test cartridges by running QC panels, comparing to reference, and generating validation reports.
naftiko: "0.5"
info:
label: "Cepheid Molecular Test Validation Orchestration"
description: "Validates new Cepheid GeneXpert molecular test cartridges by running QC panels, comparing to reference, and generating validation reports."
tags:
- quality
- diagnostics
- rd
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: test-validation
port: 8080
tools:
- name: validate-test-cartridge
description: "Given cartridge lot and test panel, run QC, compare results, and generate report. Use for Cepheid test validation."
inputParameters:
- name: cartridge_lot
in: body
type: string
description: "Cartridge lot number."
- name: test_panel
in: body
type: string
description: "Test panel name."
steps:
- name: run-qc
type: call
call: snowflake.execute-query
with:
query_name: "cepheid_qc_panel"
params: "{{cartridge_lot}},{{test_panel}}"
- name: compare-reference
type: call
call: snowflake.execute-query
with:
query_name: "cepheid_reference_comparison"
params: "{{cartridge_lot}}"
- name: create-report
type: call
call: servicenow.create-task
with:
short_description: "Validation report: Cepheid {{cartridge_lot}}"
category: "quality_validation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "cepheid-quality"
text: "Validation complete: {{cartridge_lot}}. Pass rate: {{run-qc.pass_rate}}%. Reference match: {{compare-reference.concordance}}%. Report: {{create-report.number}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves clinical trial site status for Danaher diagnostics clinical studies.
naftiko: "0.5"
info:
label: "Clinical Trial Site Status Lookup"
description: "Retrieves clinical trial site status for Danaher diagnostics clinical studies."
tags:
- clinical
- rd
- oracle
capability:
exposes:
- type: mcp
namespace: clinical-sites
port: 8080
tools:
- name: get-site-status
description: "Given study and site ID, return activation status. Use for trial visibility."
inputParameters:
- name: study_id
in: body
type: string
description: "Study ID."
- name: site_id
in: body
type: string
description: "Site ID."
call: oracle-clinical.get-site-status
with:
study_id: "{{study_id}}"
site_id: "{{site_id}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://danaher-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: sites
path: "/studies/{{study_id}}/sites/{{site_id}}"
inputParameters:
- name: study_id
in: path
- name: site_id
in: path
operations:
- name: get-site-status
method: GET
Handles cold chain excursions for temperature-sensitive diagnostics reagents.
naftiko: "0.5"
info:
label: "Cold Chain Monitoring Orchestration"
description: "Handles cold chain excursions for temperature-sensitive diagnostics reagents."
tags:
- supply-chain
- quality
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cold-chain
port: 8080
tools:
- name: handle-excursion
description: "Given shipment, batch, and temperature, create deviation, quarantine, and notify. Use for cold chain breaches."
inputParameters:
- name: shipment_id
in: body
type: string
description: "Shipment ID."
- name: batch_number
in: body
type: string
description: "Batch."
- name: temperature
in: body
type: string
description: "Temperature."
steps:
- name: deviation
type: call
call: servicenow.create-deviation
with:
description: "Cold chain: {{shipment_id}}, {{batch_number}}, {{temperature}}"
priority: "1"
- name: quarantine
type: call
call: sap-erp.update-batch-status
with:
batch: "{{batch_number}}"
status: "quarantine"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "supply-chain"
text: "COLD CHAIN: {{shipment_id}} {{batch_number}} quarantined. Deviation: {{deviation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: deviations
path: "/table/u_deviation"
operations:
- name: create-deviation
method: POST
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_Batch('{{batch}}')"
inputParameters:
- name: batch
in: path
operations:
- name: update-batch-status
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Initiates compliance document review across Danaher operating companies.
naftiko: "0.5"
info:
label: "Compliance Document Review Orchestration"
description: "Initiates compliance document review across Danaher operating companies."
tags:
- compliance
- quality
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance-review
port: 8080
tools:
- name: initiate-review
description: "Given document ID and deadline, create tasks and notify. Use for document reviews."
inputParameters:
- name: document_id
in: body
type: string
description: "Document ID."
- name: review_deadline
in: body
type: string
description: "Deadline."
steps:
- name: get-doc
type: call
call: veeva-vault.get-document
with:
doc_id: "{{document_id}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Review: {{get-doc.title}}"
due_date: "{{review_deadline}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "compliance"
text: "Review: {{get-doc.title}}. Due: {{review_deadline}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/objects/documents/{{doc_id}}"
inputParameters:
- name: doc_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves SOP documents from Confluence across Danaher operating companies.
naftiko: "0.5"
info:
label: "Confluence SOP Retrieval"
description: "Retrieves SOP documents from Confluence across Danaher operating companies."
tags:
- quality
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: sop-library
port: 8080
tools:
- name: get-sop
description: "Given page ID, return title and version. Use for SOP reference."
inputParameters:
- name: page_id
in: body
type: string
description: "Page ID."
call: confluence.get-page
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
consumes:
- type: http
namespace: confluence
baseUri: "https://danaher.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content/{{page_id}}?expand=version"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
Queries CrowdStrike for endpoint threat detections across Danaher.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Lookup"
description: "Queries CrowdStrike for endpoint threat detections across Danaher."
tags:
- security
- endpoint
- crowdstrike
capability:
exposes:
- type: mcp
namespace: endpoint-security
port: 8080
tools:
- name: get-threats
description: "Given hostname, return detection count. Use for security investigation."
inputParameters:
- name: hostname
in: body
type: string
description: "Hostname."
call: crowdstrike.get-detections
with:
filter: "device.hostname:'{{hostname}}'"
outputParameters:
- name: detection_count
type: integer
mapping: "$.meta.pagination.total"
consumes:
- type: http
namespace: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: detections
path: "/detects/queries/detects/v1"
operations:
- name: get-detections
method: GET
Retrieves batch manufacturing records from the Cytiva bioprocess management system, validates GMP compliance completeness in Snowflake, and creates a ServiceNow audit finding if gaps are detected.
naftiko: "0.5"
info:
label: "Cytiva Bioprocess Batch Record Audit"
description: "Retrieves batch manufacturing records from the Cytiva bioprocess management system, validates GMP compliance completeness in Snowflake, and creates a ServiceNow audit finding if gaps are detected."
tags:
- manufacturing
- quality
- gmp
- snowflake
- servicenow
- life-sciences
capability:
exposes:
- type: mcp
namespace: bioprocess-quality
port: 8080
tools:
- name: audit-batch-record-compliance
description: "Given a batch lot number from the Cytiva bioprocess system, validate GMP batch record completeness against the required field checklist in Snowflake and create a ServiceNow audit finding if any mandatory fields are missing or out of specification. Use for cGMP batch release audits."
inputParameters:
- name: batch_lot_number
in: body
type: string
description: "Cytiva bioprocess batch lot number to audit."
- name: product_code
in: body
type: string
description: "Product code for the batch being audited."
steps:
- name: check-batch-completeness
type: call
call: snowflake-batch.run-query
with:
statement: "SELECT field_name, is_complete, value FROM manufacturing.batch_records WHERE lot_number='{{batch_lot_number}}' AND product_code='{{product_code}}' AND is_complete=FALSE ORDER BY field_name"
- name: create-audit-finding
type: call
call: servicenow-audit.create-incident
with:
short_description: "GMP Batch Record Gap: Lot {{batch_lot_number}} ({{product_code}}) — {{check-batch-completeness.row_count}} incomplete fields"
category: "Quality Audit"
urgency: "1"
description: "Lot: {{batch_lot_number}}\nProduct: {{product_code}}\nIncomplete Fields: {{check-batch-completeness.row_count}}\nTop Gap: {{check-batch-completeness.field_name}}"
consumes:
- type: http
namespace: snowflake-batch
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow-audit
baseUri: "https://danaher.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
Monitors Cytiva bioprocess equipment parameters and triggers alerts when out-of-spec conditions are detected.
naftiko: "0.5"
info:
label: "Cytiva Bioprocess Equipment Monitoring Orchestration"
description: "Monitors Cytiva bioprocess equipment parameters and triggers alerts when out-of-spec conditions are detected."
tags:
- manufacturing
- quality
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: bioprocess-monitoring
port: 8080
tools:
- name: handle-equipment-excursion
description: "Given equipment ID, parameter, and value, create deviation, log event, and alert. Use for bioprocess excursions."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment ID."
- name: parameter_name
in: body
type: string
description: "Parameter name."
- name: measured_value
in: body
type: string
description: "Measured value."
steps:
- name: create-deviation
type: call
call: servicenow.create-deviation
with:
description: "Excursion: {{parameter_name}} = {{measured_value}} on {{equipment_id}}"
priority: "2"
- name: log-event
type: call
call: sap-erp.create-process-event
with:
equipment: "{{equipment_id}}"
parameter: "{{parameter_name}}"
value: "{{measured_value}}"
- name: alert
type: call
call: msteams.send-message
with:
channel_id: "cytiva-ops"
text: "ALERT: {{equipment_id}} {{parameter_name}} = {{measured_value}}. Deviation: {{create-deviation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: deviations
path: "/table/u_deviation"
operations:
- name: create-deviation
method: POST
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: events
path: "/A_ProcessEvent"
operations:
- name: create-process-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Deploys ML models from Databricks across Danaher analytics platforms.
naftiko: "0.5"
info:
label: "Databricks ML Model Deployment Orchestration"
description: "Deploys ML models from Databricks across Danaher analytics platforms."
tags:
- rd
- ai
- databricks
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ml-deployment
port: 8080
tools:
- name: deploy-model
description: "Given model name and version, register, create change, and notify. Use for ML deployments."
inputParameters:
- name: model_name
in: body
type: string
description: "Model name."
- name: model_version
in: body
type: string
description: "Version."
steps:
- name: register
type: call
call: databricks.register-model-version
with:
name: "{{model_name}}"
version: "{{model_version}}"
stage: "Production"
- name: change
type: call
call: servicenow.create-change
with:
short_description: "ML: {{model_name}} v{{model_version}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "data-science"
text: "Model {{model_name}} v{{model_version}} deployed. Change: {{change.number}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://danaher.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: models
path: "/mlflow/model-versions/transition-stage"
operations:
- name: register-model-version
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Datadog for application health across Danaher shared platform services.
naftiko: "0.5"
info:
label: "Datadog Application Health Check"
description: "Queries Datadog for application health across Danaher shared platform services."
tags:
- it
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: app-monitoring
port: 8080
tools:
- name: get-app-health
description: "Given service name, return uptime and error rate. Use for application health."
inputParameters:
- name: service_name
in: body
type: string
description: "Datadog service name."
call: datadog.get-service-summary
with:
service: "{{service_name}}"
outputParameters:
- name: uptime_percent
type: number
mapping: "$.data.uptime"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: services
path: "/service_summary?service={{service}}"
inputParameters:
- name: service
in: query
operations:
- name: get-service-summary
method: GET
Tracks Danaher Business System kaizen events by creating Jira epics, assigning tasks, tracking metrics, and notifying leadership.
naftiko: "0.5"
info:
label: "DBS Kaizen Event Tracking Orchestration"
description: "Tracks Danaher Business System kaizen events by creating Jira epics, assigning tasks, tracking metrics, and notifying leadership."
tags:
- manufacturing
- quality
- jira
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: dbs-kaizen
port: 8080
tools:
- name: track-kaizen-event
description: "Given kaizen event details, create tracking epic, capture metrics, and notify. Use for DBS kaizen tracking."
inputParameters:
- name: event_name
in: body
type: string
description: "Kaizen event name."
- name: opco
in: body
type: string
description: "Operating company."
- name: target_metric
in: body
type: string
description: "Target improvement metric."
steps:
- name: create-epic
type: call
call: jira.create-issue
with:
project: "DBS"
issuetype: "Epic"
summary: "Kaizen: {{event_name}} - {{opco}}"
- name: log-baseline
type: call
call: snowflake.execute-query
with:
query_name: "kaizen_baseline_metrics"
params: "{{opco}},{{target_metric}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "dbs-events"
text: "Kaizen '{{event_name}}' started for {{opco}}. Epic: {{create-epic.key}}. Baseline: {{log-baseline.current_value}}"
consumes:
- type: http
namespace: jira
baseUri: "https://danaher.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: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sends contract for signature via DocuSign, updates Salesforce, and notifies legal.
naftiko: "0.5"
info:
label: "DocuSign Contract Execution Orchestration"
description: "Sends contract for signature via DocuSign, updates Salesforce, and notifies legal."
tags:
- legal
- sales
- docusign
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-execution
port: 8080
tools:
- name: send-contract
description: "Given opportunity ID and template, send contract, update CRM, and notify. Use for contracts."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Opportunity ID."
- name: template_id
in: body
type: string
description: "DocuSign template."
steps:
- name: get-opp
type: call
call: salesforce.get-opportunity
with:
opp_id: "{{opportunity_id}}"
- name: send
type: call
call: docusign.create-envelope
with:
template_id: "{{template_id}}"
signer_email: "{{get-opp.contact_email}}"
- name: update
type: call
call: salesforce.update-opportunity
with:
opp_id: "{{opportunity_id}}"
status: "Sent for Signature"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "legal"
text: "Contract sent for {{get-opp.account_name}}. Envelope: {{send.envelope_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opp_id}}"
inputParameters:
- name: opp_id
in: path
operations:
- name: get-opportunity
method: GET
- name: update-opportunity
method: PATCH
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Sends NDAs for signature via DocuSign and updates Salesforce.
naftiko: "0.5"
info:
label: "DocuSign NDA Orchestration"
description: "Sends NDAs for signature via DocuSign and updates Salesforce."
tags:
- legal
- sales
- docusign
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: nda-execution
port: 8080
tools:
- name: send-nda
description: "Given contact email and name, send NDA, track in CRM, and notify. Use for NDA execution."
inputParameters:
- name: contact_email
in: body
type: string
description: "Contact email."
- name: contact_name
in: body
type: string
description: "Contact name."
- name: account_id
in: body
type: string
description: "Salesforce account ID."
steps:
- name: send-envelope
type: call
call: docusign.create-envelope
with:
template_id: "nda-standard"
signer_email: "{{contact_email}}"
signer_name: "{{contact_name}}"
- name: update-crm
type: call
call: salesforce.create-task
with:
account_id: "{{account_id}}"
subject: "NDA sent to {{contact_name}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "legal"
text: "NDA sent to {{contact_name}}. Envelope: {{send-envelope.envelope_id}}"
consumes:
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When an employee termination is processed in Workday, disables the Microsoft 365 account, removes Salesforce license, and creates a ServiceNow offboarding checklist across all Danaher systems.
naftiko: "0.5"
info:
label: "Employee Offboarding Deprovision"
description: "When an employee termination is processed in Workday, disables the Microsoft 365 account, removes Salesforce license, and creates a ServiceNow offboarding checklist across all Danaher systems."
tags:
- hr
- offboarding
- workday
- salesforce
- servicenow
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: deprovision-terminated-employee
description: "Given a Workday worker ID for a terminated employee, disable the Microsoft 365 account, remove the Salesforce user license, and create a comprehensive ServiceNow offboarding task covering all Danaher system access. Use immediately upon confirmed termination."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID of the terminated employee."
steps:
- name: get-worker
type: call
call: workday-offboard.get-worker
with:
worker_id: "{{worker_id}}"
- name: disable-m365
type: call
call: msgraph-offboard.disable-user
with:
user_principal_name: "{{get-worker.work_email}}"
account_enabled: "false"
- name: create-offboarding-task
type: call
call: servicenow-offboard.create-incident
with:
short_description: "Employee Offboarding: {{get-worker.full_name}} ({{get-worker.opco}})"
category: "HR Offboarding"
description: "Worker: {{worker_id}}\nEmployee: {{get-worker.full_name}}\nOpCo: {{get-worker.opco}}\nTermination Date: {{get-worker.termination_date}}\nM365 Disabled: {{disable-m365.status}}"
consumes:
- type: http
namespace: workday-offboard
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/danaher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-offboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_principal_name}}"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: servicenow-offboard
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Processes cross-OpCo employee transfers by updating Workday, Okta, and notifying managers.
naftiko: "0.5"
info:
label: "Employee Transfer Orchestration"
description: "Processes cross-OpCo employee transfers by updating Workday, Okta, and notifying managers."
tags:
- hr
- identity
- workday
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-transfer
port: 8080
tools:
- name: process-transfer
description: "Given worker ID and target OpCo/department, update systems and notify. Use for transfers."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
- name: target_department
in: body
type: string
description: "Target department."
steps:
- name: get-employee
type: call
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
- name: update-okta
type: call
call: okta.update-user-groups
with:
user_email: "{{get-employee.work_email}}"
department: "{{target_department}}"
- name: transfer-assets
type: call
call: servicenow.transfer-assets
with:
user_id: "{{worker_id}}"
department: "{{target_department}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-ops"
text: "Transfer: {{get-employee.first_name}} {{get-employee.last_name}} to {{target_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: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://danaher.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users/{{user_email}}/groups"
inputParameters:
- name: user_email
in: path
operations:
- name: update-user-groups
method: PUT
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/alm_asset"
operations:
- name: transfer-assets
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Handles cleanroom environmental monitoring excursions in manufacturing facilities.
naftiko: "0.5"
info:
label: "Environmental Monitoring Alert Response"
description: "Handles cleanroom environmental monitoring excursions in manufacturing facilities."
tags:
- manufacturing
- quality
- compliance
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-monitoring
port: 8080
tools:
- name: handle-env-excursion
description: "Given sensor, parameter, and value, create incident, deviation, and alert. Use for cleanroom excursions."
inputParameters:
- name: sensor_id
in: body
type: string
description: "Sensor ID."
- name: parameter_name
in: body
type: string
description: "Parameter."
- name: measured_value
in: body
type: string
description: "Value."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Env excursion: {{parameter_name}} at {{sensor_id}}"
priority: "2"
- name: log-deviation
type: call
call: servicenow.create-deviation
with:
description: "{{parameter_name}} = {{measured_value}} at {{sensor_id}}"
- name: alert
type: call
call: msteams.send-message
with:
channel_id: "quality-alerts"
text: "ENV: {{parameter_name}} at {{sensor_id}} = {{measured_value}}. Incident: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.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
- name: deviations
path: "/table/u_deviation"
operations:
- name: create-deviation
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages equipment calibration across Danaher manufacturing and labs.
naftiko: "0.5"
info:
label: "Equipment Calibration Orchestration"
description: "Manages equipment calibration across Danaher manufacturing and labs."
tags:
- quality
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: calibration
port: 8080
tools:
- name: schedule-calibration
description: "Given equipment ID, check due date, create WO, and notify. Use for calibration."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment ID."
steps:
- name: check-due
type: call
call: sap-erp.get-calibration-status
with:
equipment: "{{equipment_id}}"
- name: create-wo
type: call
call: servicenow.create-work-order
with:
short_description: "Calibration: {{equipment_id}}"
due_date: "{{check-due.next_cal_date}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "calibration"
text: "Calibration: {{equipment_id}}. Due: {{check-due.next_cal_date}}. WO: {{create-wo.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment}}')/calibration"
inputParameters:
- name: equipment
in: path
operations:
- name: get-calibration-status
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current status of an FDA regulatory submission for Danaher operating company products.
naftiko: "0.5"
info:
label: "FDA Submission Status Lookup"
description: "Retrieves the current status of an FDA regulatory submission for Danaher operating company products."
tags:
- regulatory
- quality
- veeva-vault
capability:
exposes:
- type: mcp
namespace: regulatory-submissions
port: 8080
tools:
- name: get-submission-status
description: "Given a submission number, return review status and expected date. Use when regulatory checks submission progress."
inputParameters:
- name: submission_number
in: body
type: string
description: "FDA submission number."
call: veeva-vault.get-submission
with:
submission_id: "{{submission_number}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: expected_date
type: string
mapping: "$.data.target_date"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: submissions
path: "/objects/submission__c/{{submission_id}}"
inputParameters:
- name: submission_id
in: path
operations:
- name: get-submission
method: GET
Dispatches field service engineers for instrument repair across Danaher life sciences customers.
naftiko: "0.5"
info:
label: "Field Service Instrument Repair Orchestration"
description: "Dispatches field service engineers for instrument repair across Danaher life sciences customers."
tags:
- service
- diagnostics
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: field-service
port: 8080
tools:
- name: dispatch-repair
description: "Given account ID and issue, create case, find engineer, dispatch, and notify. Use for instrument repair."
inputParameters:
- name: account_id
in: body
type: string
description: "Account ID."
- name: issue_description
in: body
type: string
description: "Issue."
steps:
- name: create-case
type: call
call: salesforce.create-case
with:
account_id: "{{account_id}}"
subject: "Repair: {{issue_description}}"
- name: find-engineer
type: call
call: servicenow.find-available-resource
with:
skill: "instrument_repair"
- name: create-wo
type: call
call: servicenow.create-work-order
with:
case_ref: "{{create-case.case_number}}"
assigned_to: "{{find-engineer.engineer_id}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "field-service"
text: "Engineer {{find-engineer.engineer_name}} dispatched. Case: {{create-case.case_number}}. WO: {{create-wo.number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/table/cmn_schedule_span"
operations:
- name: find-available-resource
method: GET
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug for the engineering team and posts an alert to the engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "GitHub Actions CI Pipeline Failure Alert"
description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug for the engineering team and posts an alert to the engineering Microsoft Teams channel."
tags:
- devops
- cicd
- github
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow failure, create a Jira engineering bug and notify the on-call engineering team in Microsoft Teams with full failure context. Use as part of the CI/CD failure notification pipeline for Danaher digital and software engineering teams."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name where the pipeline failed."
- name: workflow_name
in: body
type: string
description: "Name of the GitHub Actions workflow that failed."
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: commit_sha
in: body
type: string
description: "Commit SHA that triggered the failed pipeline."
- name: log_url
in: body
type: string
description: "URL to the GitHub Actions run log for the failure."
steps:
- name: create-jira-bug
type: call
call: jira.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "CI Failure: {{workflow_name}} on {{repo_name}}"
description: "Repository: {{repo_name}}\nWorkflow: {{workflow_name}}\nRun ID: {{run_id}}\nCommit: {{commit_sha}}\nLogs: {{log_url}}"
- name: notify-engineering
type: call
call: msteams-eng.send-message
with:
channel_id: "engineering-alerts"
message: "CI FAILURE: {{workflow_name}} / {{repo_name}} | Commit: {{commit_sha}} | Jira: {{create-jira-bug.key}} | Logs: {{log_url}}"
consumes:
- type: http
namespace: jira
baseUri: "https://danaher.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-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks GitHub repo for branch protection and security scanning across Danaher engineering.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks GitHub repo for branch protection and security scanning across Danaher engineering."
tags:
- security
- devops
- github
capability:
exposes:
- type: mcp
namespace: repo-compliance
port: 8080
tools:
- name: check-compliance
description: "Given repo name, return protection status. Use for repo governance."
inputParameters:
- name: repo_name
in: body
type: string
description: "Repo name."
call: github.get-repo-settings
with:
repo: "{{repo_name}}"
outputParameters:
- name: branch_protection
type: boolean
mapping: "$.data.branch_protection"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo}}"
inputParameters:
- name: repo
in: path
operations:
- name: get-repo-settings
method: GET
Checks GMP training compliance across Danaher manufacturing facilities.
naftiko: "0.5"
info:
label: "GMP Training Compliance Check"
description: "Checks GMP training compliance across Danaher manufacturing facilities."
tags:
- quality
- compliance
- workday
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-gmp-compliance
description: "Given department, return training completion rate. Use for quality compliance."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
call: workday.get-training-compliance
with:
department: "{{department_code}}"
training_type: "gmp"
outputParameters:
- name: completion_rate
type: number
mapping: "$.data.completion_rate"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/training/compliance"
operations:
- name: get-training-compliance
method: GET
When a Hach connected water quality sensor reports a measurement outside acceptable limits, creates a ServiceNow field inspection ticket and notifies the environmental service team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Hach Water Quality Alert to Field Service"
description: "When a Hach connected water quality sensor reports a measurement outside acceptable limits, creates a ServiceNow field inspection ticket and notifies the environmental service team in Microsoft Teams."
tags:
- iot
- field-service
- water-quality
- servicenow
- microsoft-teams
- hach
capability:
exposes:
- type: mcp
namespace: water-quality-ops
port: 8080
tools:
- name: handle-water-quality-alert
description: "Given a Hach sensor ID, site ID, and out-of-range parameter reading, create a ServiceNow field inspection work order and notify the environmental service team in Microsoft Teams. Use when connected Hach instruments report EPA limit exceedances or instrument calibration failures."
inputParameters:
- name: sensor_id
in: body
type: string
description: "Hach sensor device ID reporting the alert."
- name: site_id
in: body
type: string
description: "Water quality monitoring site ID."
- name: parameter
in: body
type: string
description: "Water quality parameter out of range (e.g., 'pH', 'Turbidity', 'Chlorine')."
- name: measured_value
in: body
type: string
description: "Measured value that triggered the alert."
- name: limit_value
in: body
type: string
description: "Regulatory or operational limit that was exceeded."
steps:
- name: create-inspection-order
type: call
call: servicenow-hach.create-incident
with:
short_description: "Water Quality Alert: {{parameter}} at site {{site_id}} ({{measured_value}} vs limit {{limit_value}})"
category: "Field Inspection"
urgency: "2"
description: "Sensor: {{sensor_id}}\nSite: {{site_id}}\nParameter: {{parameter}}\nMeasured: {{measured_value}}\nLimit: {{limit_value}}"
- name: notify-env-team
type: call
call: msteams-env.send-message
with:
channel_id: "water-quality-ops"
message: "WATER QUALITY ALERT: {{parameter}} at site {{site_id}} — Measured: {{measured_value}} (Limit: {{limit_value}}) | Sensor: {{sensor_id}} | SNOW: {{create-inspection-order.number}}"
consumes:
- type: http
namespace: servicenow-hach
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-env
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Extracts experimental data from IDBS E-WorkBook and loads into Snowflake for analytics.
naftiko: "0.5"
info:
label: "IDBS Electronic Lab Notebook Data Extraction"
description: "Extracts experimental data from IDBS E-WorkBook and loads into Snowflake for analytics."
tags:
- rd
- data
- snowflake
capability:
exposes:
- type: mcp
namespace: eln-data
port: 8080
tools:
- name: extract-eln-data
description: "Given experiment ID, extract data from ELN and load to Snowflake. Use for R&D data integration."
inputParameters:
- name: experiment_id
in: body
type: string
description: "Experiment ID."
call: snowflake.execute-query
with:
query_name: "eln_data_extraction"
params: "{{experiment_id}}"
outputParameters:
- name: records_loaded
type: integer
mapping: "$.data[0].records"
consumes:
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Triggers Informatica Cloud ETL jobs for cross-OpCo data integration.
naftiko: "0.5"
info:
label: "Informatica Data Integration Job Trigger"
description: "Triggers Informatica Cloud ETL jobs for cross-OpCo data integration."
tags:
- data
- integration
- informatica
capability:
exposes:
- type: mcp
namespace: data-integration
port: 8080
tools:
- name: trigger-job
description: "Given task ID, trigger ETL job. Use for data integration."
inputParameters:
- name: task_id
in: body
type: string
description: "Task ID."
call: informatica.start-job
with:
taskId: "{{task_id}}"
outputParameters:
- name: run_id
type: string
mapping: "$.runId"
consumes:
- type: http
namespace: informatica
baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
authentication:
type: bearer
token: "$secrets.informatica_token"
resources:
- name: jobs
path: "/job"
operations:
- name: start-job
method: POST
Creates a bug report in Jira for Danaher engineering teams.
naftiko: "0.5"
info:
label: "Jira Bug Report Creation"
description: "Creates a bug report in Jira for Danaher engineering teams."
tags:
- devops
- engineering
- jira
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: create-bug
description: "Given project key and summary, create Jira bug. Use for defect logging."
inputParameters:
- name: project_key
in: body
type: string
description: "Project key."
- name: summary
in: body
type: string
description: "Summary."
call: jira.create-issue
with:
project: "{{project_key}}"
issuetype: "Bug"
summary: "{{summary}}"
outputParameters:
- name: issue_key
type: string
mapping: "$.key"
consumes:
- type: http
namespace: jira
baseUri: "https://danaher.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
Retrieves completed story points from the current and prior three Jira sprints for an R&D project and publishes a velocity trend report to the project SharePoint site.
naftiko: "0.5"
info:
label: "Jira R&D Sprint Velocity Report"
description: "Retrieves completed story points from the current and prior three Jira sprints for an R&D project and publishes a velocity trend report to the project SharePoint site."
tags:
- devops
- project-management
- jira
- sharepoint
- reporting
capability:
exposes:
- type: mcp
namespace: rd-reporting
port: 8080
tools:
- name: publish-sprint-velocity-report
description: "Given a Jira R&D project key and SharePoint site ID, query the last four sprints' completed story points and publish a velocity trend chart page to SharePoint. Use at the end of each sprint for R&D program management reporting."
inputParameters:
- name: jira_project_key
in: body
type: string
description: "Jira project key for the R&D project (e.g., 'FLOW', 'MICRO', 'WATER')."
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID for the R&D project site."
steps:
- name: get-sprint-metrics
type: call
call: jira-sprint.search-issues
with:
jql: "project={{jira_project_key}} AND sprint in closedSprints() AND status=Done ORDER BY updated DESC"
- name: publish-velocity-report
type: call
call: sharepoint-rd.create-page
with:
site_id: "{{sharepoint_site_id}}"
title: "Sprint Velocity Report — {{jira_project_key}}"
content: "Project: {{jira_project_key}}\nCompleted Stories: {{get-sprint-metrics.total}}\nStory Points Delivered: {{get-sprint-metrics.total_story_points}}\nAverage Velocity: {{get-sprint-metrics.avg_velocity_per_sprint}}"
consumes:
- type: http
namespace: jira-sprint
baseUri: "https://danaher.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues-search
path: "/search"
inputParameters:
- name: jql
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: sharepoint-rd
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: site-pages
path: "/sites/{{site_id}}/pages"
inputParameters:
- name: site_id
in: path
operations:
- name: create-page
method: POST
Checks the preventive maintenance schedule for installed Danaher laboratory instruments in Salesforce and creates upcoming PM work orders in ServiceNow for field service engineers.
naftiko: "0.5"
info:
label: "Lab Instrument Preventive Maintenance Scheduler"
description: "Checks the preventive maintenance schedule for installed Danaher laboratory instruments in Salesforce and creates upcoming PM work orders in ServiceNow for field service engineers."
tags:
- field-service
- preventive-maintenance
- salesforce
- servicenow
- life-sciences
capability:
exposes:
- type: mcp
namespace: pm-scheduling
port: 8080
tools:
- name: schedule-preventive-maintenance
description: "Query Salesforce for instruments with preventive maintenance due within a specified number of days and create ServiceNow PM work orders for each. Use in weekly PM scheduling to ensure all instruments maintain service contract compliance."
inputParameters:
- name: due_within_days
in: body
type: integer
description: "Number of days ahead to look for PM due dates."
- name: opco
in: body
type: string
description: "Danaher operating company to schedule PM for (e.g., BECKMAN, LEICA, HACH)."
steps:
- name: get-pm-due-instruments
type: call
call: salesforce-pm.search-records
with:
query: "SELECT Id, Name, SerialNumber__c, PM_Due_Date__c, Account.Name FROM Asset WHERE PM_Due_Date__c <= NEXT_N_DAYS:{{due_within_days}} AND OpCo__c='{{opco}}' AND Status='Installed'"
- name: create-pm-work-orders
type: call
call: servicenow-pm.create-incident
with:
short_description: "Preventive Maintenance: {{get-pm-due-instruments.count}} {{opco}} instruments due in {{due_within_days}} days"
category: "Preventive Maintenance"
description: "OpCo: {{opco}}\nInstruments Due: {{get-pm-due-instruments.count}}\nInstrument List: {{get-pm-due-instruments.serial_numbers}}\nDue By: {{get-pm-due-instruments.earliest_due_date}}"
consumes:
- type: http
namespace: salesforce-pm
baseUri: "https://danaher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: assets
path: "/query"
inputParameters:
- name: query
in: query
operations:
- name: search-records
method: GET
- type: http
namespace: servicenow-pm
baseUri: "https://danaher.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 Beckman Coulter or Leica instrument reports a service fault via the connected device API, creates a ServiceNow field service ticket and notifies the field service engineer via Microsoft Teams.
naftiko: "0.5"
info:
label: "Laboratory Instrument Service Ticket Creation"
description: "When a Beckman Coulter or Leica instrument reports a service fault via the connected device API, creates a ServiceNow field service ticket and notifies the field service engineer via Microsoft Teams."
tags:
- field-service
- iot
- servicenow
- life-sciences
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: instrument-service
port: 8080
tools:
- name: create-instrument-service-ticket
description: "Given an instrument serial number, fault code, and customer site ID, create a ServiceNow field service order and notify the assigned field service engineer in Microsoft Teams. Use when laboratory instruments report automated fault alerts requiring on-site service."
inputParameters:
- name: instrument_serial_number
in: body
type: string
description: "Instrument serial number reporting the fault."
- name: fault_code
in: body
type: string
description: "Instrument fault code (manufacturer-specific error code)."
- name: customer_site_id
in: body
type: string
description: "Customer site/lab identifier where the instrument is installed."
- name: opco
in: body
type: string
description: "Danaher operating company (e.g., BECKMAN, LEICA, HACH)."
steps:
- name: create-field-service-order
type: call
call: servicenow-fso.create-incident
with:
short_description: "Instrument Fault: {{instrument_serial_number}} ({{fault_code}}) at site {{customer_site_id}}"
category: "Field Service"
urgency: "2"
description: "Serial: {{instrument_serial_number}}\nFault Code: {{fault_code}}\nSite: {{customer_site_id}}\nOpCo: {{opco}}"
- name: notify-field-engineer
type: call
call: msteams-fso.send-message
with:
channel_id: "field-service-dispatch"
message: "NEW INSTRUMENT FAULT: {{opco}} | Serial: {{instrument_serial_number}} | Code: {{fault_code}} | Site: {{customer_site_id}} | SNOW: {{create-field-service-order.number}}"
consumes:
- type: http
namespace: servicenow-fso
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-fso
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates microscopy image analysis by submitting images to Databricks ML pipeline, storing results, and notifying researchers.
naftiko: "0.5"
info:
label: "Leica Microscopy Image Analysis Orchestration"
description: "Orchestrates microscopy image analysis by submitting images to Databricks ML pipeline, storing results, and notifying researchers."
tags:
- rd
- ai
- databricks
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: image-analysis
port: 8080
tools:
- name: analyze-microscopy-images
description: "Given experiment ID and image path, run ML analysis, store results, and notify. Use for Leica microscopy workflows."
inputParameters:
- name: experiment_id
in: body
type: string
description: "Experiment ID."
- name: image_path
in: body
type: string
description: "S3 path to images."
steps:
- name: run-analysis
type: call
call: databricks.submit-job
with:
job_name: "microscopy_analysis"
params: "{{experiment_id}},{{image_path}}"
- name: store-results
type: call
call: snowflake.execute-query
with:
query_name: "store_analysis_results"
params: "{{experiment_id}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "leica-research"
text: "Microscopy analysis complete: {{experiment_id}}. Job: {{run-analysis.run_id}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://danaher.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Coordinates a Leica Microsystems software release by creating a GitHub release tag, triggering the Azure DevOps deployment pipeline, and notifying the product team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Leica Microscopy Software Release Deployment"
description: "Coordinates a Leica Microsystems software release by creating a GitHub release tag, triggering the Azure DevOps deployment pipeline, and notifying the product team in Microsoft Teams."
tags:
- devops
- release-management
- github
- microsoft-teams
- life-sciences
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: deploy-software-release
description: "Given a GitHub repository and release version, create a GitHub release, trigger the corresponding deployment pipeline, and notify the product management team in Microsoft Teams that the release has been deployed. Use for Leica Microsystems instrument software and firmware release management."
inputParameters:
- name: repo_owner
in: body
type: string
description: "GitHub organization owning the repository."
- name: repo_name
in: body
type: string
description: "GitHub repository name for the software being released."
- name: release_version
in: body
type: string
description: "Semantic version string for the release (e.g., 'v3.2.1')."
- name: release_notes
in: body
type: string
description: "Release notes summary for the new version."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID to notify of the release."
steps:
- name: create-github-release
type: call
call: github.create-release
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
tag_name: "{{release_version}}"
name: "Release {{release_version}}"
body: "{{release_notes}}"
- name: notify-product-team
type: call
call: msteams-release.send-message
with:
channel_id: "{{teams_channel_id}}"
message: "RELEASE DEPLOYED: {{repo_name}} {{release_version}} | GitHub: {{create-github-release.html_url}} | {{release_notes}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: releases
path: "/repos/{{owner}}/{{repo}}/releases"
inputParameters:
- name: owner
in: path
- name: repo
in: path
operations:
- name: create-release
method: POST
- type: http
namespace: msteams-release
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves employer brand metrics from LinkedIn for Danaher.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Metrics"
description: "Retrieves employer brand metrics from LinkedIn for Danaher."
tags:
- hr
- marketing
- linkedin
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: get-metrics
description: "Return follower count and engagement. Use for brand tracking."
inputParameters:
- name: time_period
in: body
type: string
description: "Period."
call: linkedin.get-organization-stats
with:
period: "{{time_period}}"
outputParameters:
- name: follower_count
type: integer
mapping: "$.data.followerCount"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: stats
path: "/organizationPageStatistics"
operations:
- name: get-organization-stats
method: GET
Retrieves manufacturing batch record from SAP across Danaher operating companies.
naftiko: "0.5"
info:
label: "Manufacturing Batch Record Status Check"
description: "Retrieves manufacturing batch record from SAP across Danaher operating companies."
tags:
- manufacturing
- quality
- sap
capability:
exposes:
- type: mcp
namespace: manufacturing-batch
port: 8080
tools:
- name: get-batch-status
description: "Given batch number, return status and yield. Use for batch visibility."
inputParameters:
- name: batch_number
in: body
type: string
description: "Batch number."
call: sap-erp.get-batch-record
with:
batch_id: "{{batch_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.BatchStatus"
- name: yield_percentage
type: number
mapping: "$.d.YieldPercent"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-records
path: "/A_BatchRecord('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-record
method: GET
Handles manufacturing line downtime across OpCos by creating incidents, alerting teams, and logging SAP downtime.
naftiko: "0.5"
info:
label: "Manufacturing Line Downtime Response"
description: "Handles manufacturing line downtime across OpCos by creating incidents, alerting teams, and logging SAP downtime."
tags:
- manufacturing
- it
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: mfg-downtime
port: 8080
tools:
- name: handle-downtime
description: "Given line ID and failure reason, create incident, notify, and log. Use for unplanned stoppages."
inputParameters:
- name: line_id
in: body
type: string
description: "Production line ID."
- name: failure_reason
in: body
type: string
description: "Failure description."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Line {{line_id}} down: {{failure_reason}}"
priority: "1"
- name: alert
type: call
call: msteams.send-message
with:
channel_id: "manufacturing-ops"
text: "ALERT: Line {{line_id}} down. {{failure_reason}}. Incident: {{create-incident.number}}"
- name: log
type: call
call: sap-erp.create-downtime-record
with:
work_center: "{{line_id}}"
reason: "{{failure_reason}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_DOWNTIME_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: downtime
path: "/A_DowntimeRecord"
operations:
- name: create-downtime-record
method: POST
Retrieves marketing campaign performance from Marketo for Danaher OpCos.
naftiko: "0.5"
info:
label: "Marketo Campaign Performance Lookup"
description: "Retrieves marketing campaign performance from Marketo for Danaher OpCos."
tags:
- marketing
- analytics
- marketo
capability:
exposes:
- type: mcp
namespace: campaign-analytics
port: 8080
tools:
- name: get-campaign-stats
description: "Given campaign ID, return send count and open rate. Use for campaign metrics."
inputParameters:
- name: campaign_id
in: body
type: string
description: "Marketo campaign ID."
call: marketo.get-campaign-stats
with:
id: "{{campaign_id}}"
outputParameters:
- name: sends
type: integer
mapping: "$.result.sends"
- name: open_rate
type: number
mapping: "$.result.openRate"
consumes:
- type: http
namespace: marketo
baseUri: "https://danaher.mktorest.com/rest"
authentication:
type: bearer
token: "$secrets.marketo_token"
resources:
- name: campaigns
path: "/v1/campaigns/{{id}}/stats.json"
inputParameters:
- name: id
in: path
operations:
- name: get-campaign-stats
method: GET
Retrieves Okta user profile and access status.
naftiko: "0.5"
info:
label: "Okta User Status Check"
description: "Retrieves Okta user profile and access status."
tags:
- security
- identity
- okta
capability:
exposes:
- type: mcp
namespace: identity-management
port: 8080
tools:
- name: get-user-status
description: "Given email, return Okta status and last login. Use for access verification."
inputParameters:
- name: email
in: body
type: string
description: "Email address."
call: okta.get-user
with:
login: "{{email}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: okta
baseUri: "https://danaher.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users/{{login}}"
inputParameters:
- name: login
in: path
operations:
- name: get-user
method: GET
Identifies cross-sell opportunities across Danaher operating companies by analyzing customer purchase patterns, creating opportunity records, and notifying sales teams.
naftiko: "0.5"
info:
label: "OpCo Cross-Sell Opportunity Orchestration"
description: "Identifies cross-sell opportunities across Danaher operating companies by analyzing customer purchase patterns, creating opportunity records, and notifying sales teams."
tags:
- commercial
- analytics
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cross-sell
port: 8080
tools:
- name: identify-cross-sell
description: "Given an account ID, analyze purchase patterns across OpCos, create opportunity, and notify. Use when commercial identifies cross-sell potential."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID."
steps:
- name: analyze-patterns
type: call
call: snowflake.execute-query
with:
query_name: "opco_cross_sell_analysis"
params: "{{account_id}}"
- name: create-opportunity
type: call
call: salesforce.create-opportunity
with:
account_id: "{{account_id}}"
name: "Cross-sell: {{analyze-patterns.recommended_opco}}"
amount: "{{analyze-patterns.estimated_value}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "cross-sell-ops"
text: "Cross-sell opportunity for account {{account_id}}: {{analyze-patterns.recommended_opco}} products. Est: ${{analyze-patterns.estimated_value}}. Opp: {{create-opportunity.id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Assesses product launch readiness across Danaher operating companies by checking regulatory, supply chain, and training.
naftiko: "0.5"
info:
label: "OpCo Product Launch Readiness Orchestration"
description: "Assesses product launch readiness across Danaher operating companies by checking regulatory, supply chain, and training."
tags:
- manufacturing
- regulatory
- sap
- workday
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: launch-readiness
port: 8080
tools:
- name: assess-readiness
description: "Given product code and OpCo, check regulatory, supply, training, and report. Use for launch assessment."
inputParameters:
- name: product_code
in: body
type: string
description: "Product code."
- name: opco
in: body
type: string
description: "Operating company."
steps:
- name: regulatory
type: call
call: veeva-vault.get-clearance-status
with:
product_code: "{{product_code}}"
- name: supply
type: call
call: sap-erp.get-material-availability
with:
material: "{{product_code}}"
- name: training
type: call
call: workday.get-training-status
with:
course: "launch-{{product_code}}"
- name: report
type: call
call: msteams.send-message
with:
channel_id: "{{opco}}-launches"
text: "Launch readiness {{product_code}} ({{opco}}): Regulatory: {{regulatory.status}}. Supply: {{supply.availability}}. Training: {{training.completion_rate}}%"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: clearance
path: "/objects/clearance__c"
operations:
- name: get-clearance-status
method: GET
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: availability
path: "/A_MaterialAvailability('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-material-availability
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: training
path: "/training/compliance"
operations:
- name: get-training-status
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Reconciles revenue across operating companies by pulling SAP data, comparing to Salesforce, and generating discrepancy reports.
naftiko: "0.5"
info:
label: "OpCo Revenue Reconciliation Orchestration"
description: "Reconciles revenue across operating companies by pulling SAP data, comparing to Salesforce, and generating discrepancy reports."
tags:
- finance
- erp
- sap
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: revenue-recon
port: 8080
tools:
- name: reconcile-revenue
description: "Given OpCo and period, pull SAP and CRM data, compare, and report. Use for revenue reconciliation."
inputParameters:
- name: opco_code
in: body
type: string
description: "OpCo code."
- name: fiscal_period
in: body
type: string
description: "Period."
steps:
- name: sap-revenue
type: call
call: sap-erp.get-revenue
with:
unit: "{{opco_code}}"
period: "{{fiscal_period}}"
- name: crm-revenue
type: call
call: salesforce.get-closed-won
with:
unit: "{{opco_code}}"
period: "{{fiscal_period}}"
- name: reconcile
type: call
call: snowflake.execute-query
with:
query_name: "revenue_reconciliation"
params: "{{opco_code}},{{fiscal_period}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/FI_REVENUE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: revenue
path: "/A_Revenue"
operations:
- name: get-revenue
method: GET
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/analytics/reports/closed_won"
operations:
- name: get-closed-won
method: GET
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Uses OpenAI to classify documents by type and operating company.
naftiko: "0.5"
info:
label: "OpenAI Document Classification"
description: "Uses OpenAI to classify documents by type and operating company."
tags:
- ai
- documentation
- openai
capability:
exposes:
- type: mcp
namespace: doc-classification
port: 8080
tools:
- name: classify-document
description: "Given document text, classify type and OpCo. Use for document routing."
inputParameters:
- name: document_text
in: body
type: string
description: "Document text."
call: openai.create-completion
with:
model: "gpt-4"
prompt: "Classify: {{document_text}}"
outputParameters:
- name: classification
type: string
mapping: "$.choices[0].message.content"
consumes:
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
Retrieves the current on-call engineer from PagerDuty.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer from PagerDuty."
tags:
- it
- observability
- pagerduty
capability:
exposes:
- type: mcp
namespace: on-call
port: 8080
tools:
- name: get-on-call
description: "Given schedule ID, return on-call engineer. Use to identify on-call staff."
inputParameters:
- name: schedule_id
in: body
type: string
description: "PagerDuty schedule ID."
call: pagerduty.get-on-call
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: engineer_name
type: string
mapping: "$.oncalls[0].user.name"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.pagerduty_token"
placement: header
resources:
- name: oncalls
path: "/oncalls?schedule_ids[]={{schedule_id}}"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-on-call
method: GET
Orchestrates product registration for Pall filtration products by assembling documents, creating submissions, and notifying regulatory.
naftiko: "0.5"
info:
label: "Pall Filtration Product Registration Orchestration"
description: "Orchestrates product registration for Pall filtration products by assembling documents, creating submissions, and notifying regulatory."
tags:
- regulatory
- quality
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-registration
port: 8080
tools:
- name: register-product
description: "Given product code and market, assemble docs, create submission, and notify. Use for Pall product registration."
inputParameters:
- name: product_code
in: body
type: string
description: "Product code."
- name: target_market
in: body
type: string
description: "Market code."
steps:
- name: gather-docs
type: call
call: veeva-vault.query-documents
with:
product_code: "{{product_code}}"
- name: create-submission
type: call
call: veeva-vault.create-submission
with:
product_code: "{{product_code}}"
market: "{{target_market}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Registration: Pall {{product_code}} for {{target_market}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "pall-regulatory"
text: "Registration submitted: {{product_code}} for {{target_market}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/query"
operations:
- name: query-documents
method: POST
- name: submissions
path: "/objects/submission__c"
operations:
- name: create-submission
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers a Power BI dataset refresh for the executive operating company performance dashboard and notifies the Danaher executive team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Power BI Executive OpCo Performance Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the executive operating company performance dashboard and notifies the Danaher executive team via Microsoft Teams."
tags:
- reporting
- data
- power-bi
- microsoft-teams
- finance
capability:
exposes:
- type: mcp
namespace: exec-reporting
port: 8080
tools:
- name: refresh-opco-performance-dashboard
description: "Trigger a Power BI dataset refresh for the Danaher OpCo performance dashboard and send a Microsoft Teams notification to the executive briefing channel. Use before monthly business reviews and board reporting cycles."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID for the OpCo performance dashboard."
- name: workspace_id
in: body
type: string
description: "Power BI workspace ID containing the dataset."
steps:
- name: trigger-dataset-refresh
type: call
call: powerbi.trigger-refresh
with:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-executives
type: call
call: msteams-exec.send-message
with:
channel_id: "executive-briefings"
message: "OpCo Performance Dashboard refresh triggered (dataset: {{dataset_id}}). Data will be available within 30 minutes for the business review."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams-exec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers Power BI financial dashboard refresh for cross-OpCo reporting.
naftiko: "0.5"
info:
label: "Power BI Financial Dashboard Refresh"
description: "Triggers Power BI financial dashboard refresh for cross-OpCo reporting."
tags:
- finance
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-dashboard
description: "Given dataset ID, trigger refresh. Use for financial metrics."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Dataset ID."
call: powerbi.trigger-refresh
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- 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: trigger-refresh
method: POST
Retrieves CAPA record status from the quality management system.
naftiko: "0.5"
info:
label: "Quality CAPA Status Lookup"
description: "Retrieves CAPA record status from the quality management system."
tags:
- quality
- compliance
- servicenow
capability:
exposes:
- type: mcp
namespace: quality-capa
port: 8080
tools:
- name: get-capa-status
description: "Given CAPA number, return phase and due date. Use for CAPA tracking."
inputParameters:
- name: capa_number
in: body
type: string
description: "CAPA number."
call: servicenow.get-capa
with:
number: "{{capa_number}}"
outputParameters:
- name: phase
type: string
mapping: "$.result.phase"
- name: due_date
type: string
mapping: "$.result.due_date"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: capa
path: "/table/u_capa?sysparm_query=number={{number}}"
inputParameters:
- name: number
in: query
operations:
- name: get-capa
method: GET
Investigates quality deviations across OpCo manufacturing by pulling batch data, creating tasks, and notifying.
naftiko: "0.5"
info:
label: "Quality Deviation Investigation Orchestration"
description: "Investigates quality deviations across OpCo manufacturing by pulling batch data, creating tasks, and notifying."
tags:
- quality
- manufacturing
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: deviation-investigation
port: 8080
tools:
- name: initiate-investigation
description: "Given deviation number, pull batch data, create task, and notify. Use for deviation escalation."
inputParameters:
- name: deviation_number
in: body
type: string
description: "Deviation number."
steps:
- name: get-deviation
type: call
call: servicenow.get-deviation
with:
number: "{{deviation_number}}"
- name: get-batch
type: call
call: sap-erp.get-batch-record
with:
batch_id: "{{get-deviation.batch_number}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Investigate: {{deviation_number}}"
category: "quality_investigation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "quality"
text: "Investigation: {{deviation_number}}. Batch: {{get-deviation.batch_number}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: deviations
path: "/table/u_deviation"
operations:
- name: get-deviation
method: GET
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_BatchRecord('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-record
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a quality non-conformance event is identified in the lab quality management system, creates a Corrective and Preventive Action (CAPA) record in ServiceNow and notifies the quality team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Quality Management CAPA Initiation"
description: "When a quality non-conformance event is identified in the lab quality management system, creates a Corrective and Preventive Action (CAPA) record in ServiceNow and notifies the quality team in Microsoft Teams."
tags:
- quality
- compliance
- servicenow
- life-sciences
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: quality-ops
port: 8080
tools:
- name: initiate-capa
description: "Given a non-conformance event description, severity, and product family, create a CAPA record in ServiceNow and notify the quality engineering team in Microsoft Teams. Use when product quality events, customer complaints, or audit findings require formal CAPA tracking."
inputParameters:
- name: event_description
in: body
type: string
description: "Description of the non-conformance or quality event requiring CAPA."
- name: severity
in: body
type: string
description: "Event severity: CRITICAL, MAJOR, or MINOR."
- name: product_family
in: body
type: string
description: "Affected product family (e.g., 'Flow Cytometry', 'Microscopy', 'Water Quality')."
- name: opco
in: body
type: string
description: "Danaher operating company where the event occurred."
steps:
- name: create-capa-record
type: call
call: servicenow-quality.create-incident
with:
short_description: "CAPA: {{severity}} non-conformance — {{product_family}} ({{opco}})"
category: "Quality Management"
urgency: "1"
description: "OpCo: {{opco}}\nProduct Family: {{product_family}}\nSeverity: {{severity}}\nEvent Description: {{event_description}}"
- name: notify-quality-team
type: call
call: msteams-quality.send-message
with:
channel_id: "quality-engineering"
message: "CAPA INITIATED: {{severity}} — {{product_family}} ({{opco}}) | SNOW: {{create-capa-record.number}} | {{event_description}}"
consumes:
- type: http
namespace: servicenow-quality
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-quality
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Assembles QBR data across Danaher operating companies from SAP, Salesforce, Workday, and Snowflake.
naftiko: "0.5"
info:
label: "Quarterly Business Review Data Orchestration"
description: "Assembles QBR data across Danaher operating companies from SAP, Salesforce, Workday, and Snowflake."
tags:
- finance
- sales
- hr
- sap
- salesforce
- workday
- snowflake
capability:
exposes:
- type: mcp
namespace: qbr-data
port: 8080
tools:
- name: assemble-qbr
description: "Given OpCo and quarter, pull data and generate report. Use for QBR prep."
inputParameters:
- name: opco_code
in: body
type: string
description: "Operating company code."
- name: quarter
in: body
type: string
description: "Fiscal quarter."
steps:
- name: financials
type: call
call: sap-erp.get-pl-summary
with:
unit: "{{opco_code}}"
quarter: "{{quarter}}"
- name: pipeline
type: call
call: salesforce.get-pipeline-summary
with:
unit: "{{opco_code}}"
- name: headcount
type: call
call: workday.get-headcount
with:
unit: "{{opco_code}}"
- name: report
type: call
call: snowflake.execute-query
with:
query_name: "opco_qbr"
params: "{{opco_code}},{{quarter}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/FI_PL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pl
path: "/A_PLSummary"
operations:
- name: get-pl-summary
method: GET
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: pipeline
path: "/analytics/reports/pipeline_summary"
operations:
- name: get-pipeline-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: "/headcount"
operations:
- name: get-headcount
method: GET
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Handles critical alerts from Radiometer blood gas analyzers by creating service tickets, dispatching engineers, and notifying hospital contacts.
naftiko: "0.5"
info:
label: "Radiometer Blood Gas Analyzer Alert Orchestration"
description: "Handles critical alerts from Radiometer blood gas analyzers by creating service tickets, dispatching engineers, and notifying hospital contacts."
tags:
- diagnostics
- service
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: analyzer-alerts
port: 8080
tools:
- name: handle-analyzer-alert
description: "Given instrument serial and alert code, create ticket, dispatch, and notify. Use for Radiometer critical alerts."
inputParameters:
- name: serial_number
in: body
type: string
description: "Instrument serial."
- name: alert_code
in: body
type: string
description: "Alert code."
steps:
- name: create-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Radiometer alert: {{serial_number}} - {{alert_code}}"
priority: "1"
- name: get-customer
type: call
call: salesforce.get-instrument-account
with:
serial: "{{serial_number}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "radiometer-service"
text: "ALERT: Radiometer {{serial_number}} code {{alert_code}}. Customer: {{get-customer.account_name}}. Ticket: {{create-ticket.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.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://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: instruments
path: "/sobjects/Asset"
operations:
- name: get-instrument-account
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Prepares for FDA/ISO audits across Danaher operating companies.
naftiko: "0.5"
info:
label: "Regulatory Audit Preparation Orchestration"
description: "Prepares for FDA/ISO audits across Danaher operating companies."
tags:
- regulatory
- quality
- compliance
- servicenow
- workday
- snowflake
capability:
exposes:
- type: mcp
namespace: audit-prep
port: 8080
tools:
- name: prepare-audit
description: "Given audit type and facility, gather CAPAs, deviations, training, and report. Use for audit prep."
inputParameters:
- name: audit_type
in: body
type: string
description: "Audit type."
- name: facility_code
in: body
type: string
description: "Facility."
steps:
- name: capas
type: call
call: servicenow.query-capas
with:
facility: "{{facility_code}}"
- name: deviations
type: call
call: servicenow.query-deviations
with:
facility: "{{facility_code}}"
- name: training
type: call
call: workday.get-training-status
with:
facility: "{{facility_code}}"
- name: report
type: call
call: snowflake.execute-query
with:
query_name: "audit_readiness"
params: "{{facility_code}},{{audit_type}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: capas
path: "/table/u_capa"
operations:
- name: query-capas
method: GET
- name: deviations
path: "/table/u_deviation"
operations:
- name: query-deviations
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: training
path: "/training/compliance"
operations:
- name: get-training-status
method: GET
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Assembles a regulatory submission document package by retrieving the latest approved product documentation from the Veeva Vault quality document management system and publishing it to the SharePoint regulatory affairs site.
naftiko: "0.5"
info:
label: "Regulatory Submission Document Package"
description: "Assembles a regulatory submission document package by retrieving the latest approved product documentation from the Veeva Vault quality document management system and publishing it to the SharePoint regulatory affairs site."
tags:
- regulatory
- compliance
- veeva
- sharepoint
- life-sciences
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: assemble-regulatory-submission-package
description: "Given a product ID and regulatory submission type, retrieve the latest approved documents for that product from Veeva Vault and publish a compiled document index to the SharePoint regulatory affairs portal. Use for FDA 510(k), CE mark, or IVD regulatory submissions preparation."
inputParameters:
- name: product_id
in: body
type: string
description: "Danaher product ID for the instrument or reagent requiring regulatory submission."
- name: submission_type
in: body
type: string
description: "Regulatory submission type (e.g., '510K', 'CE_MARK', 'IVD_DIRECTIVE')."
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID for the regulatory affairs document library."
steps:
- name: get-product-documents
type: call
call: veeva-vault.list-documents
with:
product_id: "{{product_id}}"
document_status: "Approved"
submission_type: "{{submission_type}}"
- name: create-submission-index
type: call
call: sharepoint.create-file
with:
site_id: "{{sharepoint_site_id}}"
file_name: "{{product_id}}_{{submission_type}}_document_index.txt"
content: "Product: {{product_id}}\nSubmission Type: {{submission_type}}\nDocuments: {{get-product-documents.count}}\nDocument List: {{get-product-documents.document_names}}\nPackage Date: {{get-product-documents.generated_at}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_session_id"
resources:
- name: documents
path: "/objects/documents"
inputParameters:
- name: product_id
in: query
- name: document_status
in: query
- name: submission_type
in: query
operations:
- name: list-documents
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-file
method: POST
Retrieves a Salesforce account for Danaher life sciences customers.
naftiko: "0.5"
info:
label: "Salesforce Account Lookup"
description: "Retrieves a Salesforce account for Danaher life sciences customers."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account
description: "Given account ID, return name and revenue. Use for account details."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID."
call: salesforce.get-account
with:
id: "{{account_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: annual_revenue
type: number
mapping: "$.AnnualRevenue"
consumes:
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-account
method: GET
When a Salesforce instrument or service contract opportunity is Closed Won, creates a SAP customer contract to trigger revenue recognition and schedule billing.
naftiko: "0.5"
info:
label: "Salesforce Closed Won to SAP Revenue Recognition"
description: "When a Salesforce instrument or service contract opportunity is Closed Won, creates a SAP customer contract to trigger revenue recognition and schedule billing."
tags:
- sales
- finance
- salesforce
- sap
- revenue-recognition
capability:
exposes:
- type: mcp
namespace: quote-to-cash
port: 8080
tools:
- name: create-sap-contract-from-opportunity
description: "Given a Salesforce Closed Won opportunity ID, retrieve the deal details and create a SAP customer contract for billing schedule and revenue recognition. Use in the quote-to-cash process for instrument sales, reagent contracts, and service agreements."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID for the Closed Won deal."
steps:
- name: get-opportunity
type: call
call: salesforce-opp.get-opportunity
with:
opportunity_id: "{{opportunity_id}}"
- name: create-sap-contract
type: call
call: sap-billing.create-contract
with:
customer_name: "{{get-opportunity.account_name}}"
contract_value: "{{get-opportunity.amount}}"
currency: "USD"
start_date: "{{get-opportunity.close_date}}"
product_category: "{{get-opportunity.product_family}}"
description: "SF Opportunity: {{opportunity_id}} — {{get-opportunity.name}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://danaher.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-billing
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/API_CUSTOMER_CONTRACT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: contracts
path: "/A_CustomerContract"
operations:
- name: create-contract
method: POST
When a new Salesforce opportunity is created for a life sciences instrument sale, enriches it with account research history and prior purchase data from the SAP customer master.
naftiko: "0.5"
info:
label: "Salesforce Life Sciences Opportunity Enrichment"
description: "When a new Salesforce opportunity is created for a life sciences instrument sale, enriches it with account research history and prior purchase data from the SAP customer master."
tags:
- sales
- crm
- salesforce
- sap
- life-sciences
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: enrich-instrument-opportunity
description: "Given a Salesforce opportunity ID for a new instrument sale, retrieve the account's SAP customer history including prior purchases, installed base count, and service contract status, then update the opportunity record with enrichment data. Use when creating new instrument or reagent opportunities."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
- name: sap_customer_id
in: body
type: string
description: "SAP customer ID linked to the Salesforce account."
steps:
- name: get-opportunity
type: call
call: salesforce.get-opportunity
with:
opportunity_id: "{{opportunity_id}}"
- name: get-customer-history
type: call
call: sap-customer.get-customer
with:
customer_id: "{{sap_customer_id}}"
- name: update-opportunity
type: call
call: salesforce-update.update-opportunity
with:
opportunity_id: "{{opportunity_id}}"
installed_base_count: "{{get-customer-history.installed_base}}"
service_contract_status: "{{get-customer-history.contract_status}}"
prior_purchases_total: "{{get-customer-history.lifetime_revenue}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://danaher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-customer
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_BusinessPartner('{{customer_id}}')"
inputParameters:
- name: customer_id
in: path
operations:
- name: get-customer
method: GET
- type: http
namespace: salesforce-update
baseUri: "https://danaher.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: update-opportunity
method: PATCH
After a Salesforce service case is closed for an instrument repair, triggers an NPS survey email to the customer contact and logs the survey dispatch in Snowflake.
naftiko: "0.5"
info:
label: "Salesforce NPS Survey Trigger for Service Interactions"
description: "After a Salesforce service case is closed for an instrument repair, triggers an NPS survey email to the customer contact and logs the survey dispatch in Snowflake."
tags:
- customer-experience
- salesforce
- snowflake
- nps
- field-service
capability:
exposes:
- type: mcp
namespace: cx-surveys
port: 8080
tools:
- name: send-post-service-nps-survey
description: "Given a closed Salesforce service case ID, retrieve the customer contact email, send an NPS survey email via Microsoft Graph, and log the dispatch in Snowflake for response tracking. Use 24 hours after a field service case is closed."
inputParameters:
- name: case_id
in: body
type: string
description: "Salesforce closed service case ID."
steps:
- name: get-case
type: call
call: salesforce-nps.get-case
with:
case_id: "{{case_id}}"
- name: send-nps-survey
type: call
call: msgraph-nps.send-email
with:
to: "{{get-case.contact_email}}"
subject: "How was your Danaher service experience?"
body: "Thank you for choosing Danaher. Please rate your recent service experience for case {{case_id}}. Your feedback helps us improve our field service quality."
- name: log-dispatch
type: call
call: snowflake-nps.run-query
with:
statement: "INSERT INTO cx.survey_dispatches (case_id, contact_email, opco, dispatched_at) VALUES ('{{case_id}}', '{{get-case.contact_email}}', '{{get-case.opco}}', CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: salesforce-nps
baseUri: "https://danaher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: msgraph-nps
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/service@danaher.com/sendMail"
operations:
- name: send-email
method: POST
- type: http
namespace: snowflake-nps
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
When a Salesforce service case for an instrument repair is escalated to on-site service, retrieves the case and installed base data, and creates a ServiceNow field service work order.
naftiko: "0.5"
info:
label: "Salesforce Service Case to Field Service Dispatch"
description: "When a Salesforce service case for an instrument repair is escalated to on-site service, retrieves the case and installed base data, and creates a ServiceNow field service work order."
tags:
- customer-service
- field-service
- salesforce
- servicenow
- life-sciences
capability:
exposes:
- type: mcp
namespace: service-dispatch
port: 8080
tools:
- name: dispatch-field-service
description: "Given a Salesforce escalated service case ID, retrieve case details and instrument installed base records, then create a ServiceNow field service work order and assign to the regional field engineer. Use when instrument repair cases require on-site service dispatch."
inputParameters:
- name: case_id
in: body
type: string
description: "Salesforce service case ID requiring field dispatch."
steps:
- name: get-case
type: call
call: salesforce-case.get-case
with:
case_id: "{{case_id}}"
- name: create-work-order
type: call
call: servicenow-wo.create-incident
with:
short_description: "Field Service Dispatch: {{get-case.subject}} — {{get-case.account_name}}"
category: "Field Service"
urgency: "2"
description: "Salesforce Case: {{case_id}}\nCustomer: {{get-case.account_name}}\nInstrument: {{get-case.instrument_serial}}\nIssue: {{get-case.description}}\nPriority: {{get-case.priority}}"
- name: notify-dispatch
type: call
call: msteams-dispatch.send-message
with:
channel_id: "field-service-dispatch"
message: "FIELD SERVICE DISPATCH: {{get-case.account_name}} | Instrument: {{get-case.instrument_serial}} | Issue: {{get-case.subject}} | SNOW WO: {{create-work-order.number}}"
consumes:
- type: http
namespace: salesforce-case
baseUri: "https://danaher.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: servicenow-wo
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-dispatch
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages contract renewals by checking expiring contracts, creating tasks, and notifying.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Renewal Orchestration"
description: "Manages contract renewals by checking expiring contracts, creating tasks, and notifying."
tags:
- procurement
- sap-ariba
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: process-renewal
description: "Given contract ID, check terms, create task, and notify. Use for renewals."
inputParameters:
- name: contract_id
in: body
type: string
description: "Contract ID."
steps:
- name: get-contract
type: call
call: ariba.get-contract
with:
id: "{{contract_id}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Renew: {{get-contract.title}}"
due_date: "{{get-contract.expiry_date}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "procurement"
text: "Contract {{contract_id}} expiring. Task: {{create-task.number}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates sourcing events in SAP Ariba for competitive bidding.
naftiko: "0.5"
info:
label: "SAP Ariba Sourcing Event Creation"
description: "Creates sourcing events in SAP Ariba for competitive bidding."
tags:
- procurement
- sap-ariba
capability:
exposes:
- type: mcp
namespace: strategic-sourcing
port: 8080
tools:
- name: create-event
description: "Given category and description, create sourcing event. Use for bidding."
inputParameters:
- name: category
in: body
type: string
description: "Category."
- name: description
in: body
type: string
description: "Description."
call: ariba.create-event
with:
category: "{{category}}"
description: "{{description}}"
outputParameters:
- name: event_id
type: string
mapping: "$.data.eventId"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/sourcing-projects/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
Retrieves a pending supplier invoice from SAP Ariba, validates the three-way match against the corresponding purchase order, and routes it through the appropriate approval chain.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Invoice Approval"
description: "Retrieves a pending supplier invoice from SAP Ariba, validates the three-way match against the corresponding purchase order, and routes it through the appropriate approval chain."
tags:
- finance
- procurement
- sap-ariba
- accounts-payable
capability:
exposes:
- type: mcp
namespace: ap-ops
port: 8080
tools:
- name: approve-supplier-invoice
description: "Given an SAP Ariba invoice ID, retrieve the invoice and matched PO details, perform three-way match validation, and submit for approval if the match is within tolerance. Use in the accounts payable automation pipeline for supplier invoice processing."
inputParameters:
- name: invoice_id
in: body
type: string
description: "SAP Ariba invoice ID."
- name: approver_email
in: body
type: string
description: "Email of the designated invoice approver."
steps:
- name: get-invoice
type: call
call: ariba.get-invoice
with:
invoice_id: "{{invoice_id}}"
- name: notify-approver
type: call
call: msteams-ap.send-message
with:
recipient_upn: "{{approver_email}}"
message: "Invoice Approval Required: {{invoice_id}} | Supplier: {{get-invoice.supplier_name}} | Amount: ${{get-invoice.amount}} | PO: {{get-invoice.po_number}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/invoice/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: msteams-ap
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 travel requests from SAP Concur.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Lookup"
description: "Retrieves travel requests from SAP Concur."
tags:
- finance
- travel
- sap-concur
capability:
exposes:
- type: mcp
namespace: travel
port: 8080
tools:
- name: get-travel-request
description: "Given request ID, return destination and status. Use for travel visibility."
inputParameters:
- name: request_id
in: body
type: string
description: "Request ID."
call: concur.get-request
with:
id: "{{request_id}}"
outputParameters:
- name: destination
type: string
mapping: "$.MainDestination"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: requests
path: "/travelrequest/requests/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-request
method: GET
Retrieves budget vs actual for an SAP cost center across OpCos.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Lookup"
description: "Retrieves budget vs actual for an SAP cost center across OpCos."
tags:
- finance
- erp
- sap
capability:
exposes:
- type: mcp
namespace: cost-center-budget
port: 8080
tools:
- name: get-budget
description: "Given cost center and period, return planned and actual. Use for budget data."
inputParameters:
- name: cost_center
in: body
type: string
description: "Cost center."
- name: fiscal_period
in: body
type: string
description: "Fiscal period."
call: sap-erp.get-budget
with:
cost_center: "{{cost_center}}"
period: "{{fiscal_period}}"
outputParameters:
- name: planned_budget
type: number
mapping: "$.d.PlannedAmount"
- name: actual_spend
type: number
mapping: "$.d.ActualAmount"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/FI_CO_BUDGET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budgets
path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',Period='{{period}}')"
inputParameters:
- name: cost_center
in: path
- name: period
in: path
operations:
- name: get-budget
method: GET
Posts a goods receipt in SAP for inbound deliveries across operating companies.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts a goods receipt in SAP for inbound deliveries across operating companies."
tags:
- supply-chain
- sap
capability:
exposes:
- type: mcp
namespace: goods-receipt
port: 8080
tools:
- name: post-goods-receipt
description: "Given delivery number, post goods receipt. Use for material receipt."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP delivery number."
call: sap-erp.post-gr
with:
delivery: "{{delivery_number}}"
outputParameters:
- name: material_document
type: string
mapping: "$.d.MaterialDocument"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_GR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: goods-receipts
path: "/A_GoodsReceipt"
operations:
- name: post-gr
method: POST
Queries SAP for current inventory levels across Danaher operating company plants.
naftiko: "0.5"
info:
label: "SAP Inventory Level Check"
description: "Queries SAP for current inventory levels across Danaher operating company plants."
tags:
- supply-chain
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: inventory-management
port: 8080
tools:
- name: get-inventory-level
description: "Given material and plant, return stock levels. Use for inventory visibility."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: plant_code
in: body
type: string
description: "SAP plant code."
call: sap-erp.get-material-stock
with:
material: "{{material_number}}"
plant: "{{plant_code}}"
outputParameters:
- name: unrestricted_stock
type: number
mapping: "$.d.UnrestrictedStock"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-stock
path: "/A_MaterialStock(Material='{{material}}',Plant='{{plant}}')"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-material-stock
method: GET
Creates a preventive maintenance order in SAP for lab instruments and manufacturing equipment.
naftiko: "0.5"
info:
label: "SAP Maintenance Order Creation"
description: "Creates a preventive maintenance order in SAP for lab instruments and manufacturing equipment."
tags:
- manufacturing
- maintenance
- sap
capability:
exposes:
- type: mcp
namespace: plant-maintenance
port: 8080
tools:
- name: create-pm-order
description: "Given equipment ID and type, create PM order. Use for equipment servicing."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment ID."
- name: maintenance_type
in: body
type: string
description: "Maintenance type."
call: sap-erp.create-pm-order
with:
equipment: "{{equipment_id}}"
order_type: "{{maintenance_type}}"
outputParameters:
- name: order_number
type: string
mapping: "$.d.MaintenanceOrder"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PM_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: orders
path: "/A_MaintenanceOrder"
operations:
- name: create-pm-order
method: POST
Retrieves material master data from SAP across operating companies.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP across operating companies."
tags:
- supply-chain
- erp
- sap
capability:
exposes:
- type: mcp
namespace: material-master
port: 8080
tools:
- name: get-material
description: "Given material number, return description and UoM. Use for material details."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
call: sap-erp.get-material
with:
material: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-material
method: GET
Runs end-of-period financial validation queries in Snowflake against SAP data extracts to identify unposted journals, open purchase orders, and accrual gaps before the monthly close deadline.
naftiko: "0.5"
info:
label: "SAP Period Close Financial Validation"
description: "Runs end-of-period financial validation queries in Snowflake against SAP data extracts to identify unposted journals, open purchase orders, and accrual gaps before the monthly close deadline."
tags:
- finance
- period-close
- sap
- snowflake
- reporting
capability:
exposes:
- type: mcp
namespace: period-close
port: 8080
tools:
- name: validate-period-close-readiness
description: "Query Snowflake for end-of-period financial validation issues — unposted journals, open POs past goods receipt date, and missing accruals — across all Danaher OpCos. Notify the finance team in Teams if blocking items are found. Use in the 3-day pre-close validation window."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "Fiscal period to validate for close (YYYY-MM format)."
- name: alert_channel_id
in: body
type: string
description: "Microsoft Teams channel ID to notify if blocking items are found."
steps:
- name: run-close-validation
type: call
call: snowflake-close.run-query
with:
statement: "SELECT opco_code, issue_type, COUNT(*) as item_count, SUM(amount) as total_value FROM finance.period_close_validation WHERE fiscal_period='{{fiscal_period}}' AND status='OPEN' GROUP BY 1,2 ORDER BY total_value DESC"
- name: notify-finance-team
type: call
call: msteams-close.send-message
with:
channel_id: "{{alert_channel_id}}"
message: "PERIOD CLOSE VALIDATION ({{fiscal_period}}): {{run-close-validation.row_count}} blocking issues found. Top issue: {{run-close-validation.opco_code}} — {{run-close-validation.issue_type}} (${{run-close-validation.total_value}})"
consumes:
- type: http
namespace: snowflake-close
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams-close
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves production order status from SAP for Danaher manufacturing facilities.
naftiko: "0.5"
info:
label: "SAP Production Order Status Lookup"
description: "Retrieves production order status from SAP for Danaher manufacturing facilities."
tags:
- manufacturing
- erp
- sap
capability:
exposes:
- type: mcp
namespace: production-orders
port: 8080
tools:
- name: get-production-order
description: "Given order number, return status and quantities. Use for production tracking."
inputParameters:
- name: order_number
in: body
type: string
description: "SAP production order."
call: sap-erp.get-prod-order
with:
order: "{{order_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OrderStatus"
- name: planned_quantity
type: number
mapping: "$.d.PlannedQuantity"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order}}')"
inputParameters:
- name: order
in: path
operations:
- name: get-prod-order
method: GET
Looks up a SAP S/4HANA purchase order by number across Danaher's enterprise SAP landscape, returning header status, vendor details, and open line item totals.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up a SAP S/4HANA purchase order by number across Danaher's enterprise SAP landscape, returning header status, vendor details, and open line item totals."
tags:
- finance
- procurement
- sap
- erp
- lookup
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total amount, currency, and open line item count from SAP S/4HANA. Use for procurement approvals, spend audits, and supplier payment inquiries."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number (e.g., '4500012345')."
call: sap.get-po
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor_name
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_amount
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://danaher-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
Retrieves quality inspection lot details from SAP.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP."
tags:
- quality
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: quality-inspection
port: 8080
tools:
- name: get-inspection-lot
description: "Given inspection lot, return status. Use for QC review."
inputParameters:
- name: inspection_lot
in: body
type: string
description: "Inspection lot number."
call: sap-erp.get-inspection
with:
lot: "{{inspection_lot}}"
outputParameters:
- name: status
type: string
mapping: "$.d.InspectionLotStatus"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: lots
path: "/A_InspectionLot('{{lot}}')"
inputParameters:
- name: lot
in: path
operations:
- name: get-inspection
method: GET
Validates new vendor master data submissions in SAP Ariba against Danaher's supplier onboarding policy requirements, creating a Jira task for the procurement team if mandatory fields are missing.
naftiko: "0.5"
info:
label: "SAP Vendor Master Data Validation"
description: "Validates new vendor master data submissions in SAP Ariba against Danaher's supplier onboarding policy requirements, creating a Jira task for the procurement team if mandatory fields are missing."
tags:
- procurement
- sap-ariba
- jira
- vendor-management
capability:
exposes:
- type: mcp
namespace: vendor-onboarding
port: 8080
tools:
- name: validate-vendor-master-data
description: "Given an SAP Ariba supplier ID for a new vendor, validate the supplier profile completeness against Danaher's mandatory data requirements and create a Jira task for the procurement team to resolve any gaps. Use during supplier onboarding and annual vendor data reviews."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP Ariba supplier ID for the new vendor."
steps:
- name: get-supplier-profile
type: call
call: ariba-vendor.get-supplier
with:
supplier_id: "{{supplier_id}}"
- name: create-review-task
type: call
call: jira-vendor.create-issue
with:
project_key: "PROC"
issuetype: "Task"
summary: "Vendor Master Data Review: {{get-supplier-profile.supplier_name}} ({{supplier_id}})"
description: "Supplier: {{get-supplier-profile.supplier_name}}\nAriba ID: {{supplier_id}}\nCountry: {{get-supplier-profile.country}}\nStatus: {{get-supplier-profile.registration_status}}\nMissing Fields: {{get-supplier-profile.missing_required_fields}}"
consumes:
- type: http
namespace: ariba-vendor
baseUri: "https://openapi.ariba.com/api/supplier-registration/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/{{supplier_id}}"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier
method: GET
- type: http
namespace: jira-vendor
baseUri: "https://danaher.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
Queries SAP for vendor payment status by invoice number.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Status Lookup"
description: "Queries SAP for vendor payment status by invoice number."
tags:
- finance
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: vendor-payments
port: 8080
tools:
- name: get-payment-status
description: "Given invoice number, return payment status. Use for AP verification."
inputParameters:
- name: invoice_number
in: body
type: string
description: "SAP invoice number."
call: sap-erp.get-invoice-payment
with:
invoice: "{{invoice_number}}"
outputParameters:
- name: payment_status
type: string
mapping: "$.d.PaymentStatus"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/FI_AP_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_Invoice('{{invoice}}')/payments"
inputParameters:
- name: invoice
in: path
operations:
- name: get-invoice-payment
method: GET
Creates security incident, isolates endpoint, and notifies SOC when a threat is confirmed.
naftiko: "0.5"
info:
label: "Security Incident Response Orchestration"
description: "Creates security incident, isolates endpoint, and notifies SOC when a threat is confirmed."
tags:
- security
- it
- crowdstrike
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-response
port: 8080
tools:
- name: respond-to-incident
description: "Given detection ID and hostname, create incident, isolate, and notify. Use when SOC confirms threats."
inputParameters:
- name: detection_id
in: body
type: string
description: "Detection ID."
- name: hostname
in: body
type: string
description: "Hostname."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Security: {{hostname}}"
category: "security"
priority: "1"
- name: isolate
type: call
call: crowdstrike.contain-host
with:
hostname: "{{hostname}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "security-ops"
text: "CRITICAL: {{create-incident.number}} - {{hostname}} isolated. Detection: {{detection_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.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: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: hosts
path: "/devices/entities/host-actions/v2"
operations:
- name: contain-host
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves ServiceNow incident status across Danaher shared services.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves ServiceNow incident status across Danaher shared services."
tags:
- it
- servicenow
capability:
exposes:
- type: mcp
namespace: it-incidents
port: 8080
tools:
- name: get-incident-status
description: "Given incident number, return state and priority. Use for IT ticket tracking."
inputParameters:
- name: incident_number
in: body
type: string
description: "Incident number."
call: servicenow.get-incident
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
consumes:
- type: http
namespace: servicenow
baseUri: "https://danaher.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
When a P1 IT incident is raised in ServiceNow affecting a Danaher OpCo, pages the on-call engineer via PagerDuty and creates a Microsoft Teams war room channel for incident response coordination.
naftiko: "0.5"
info:
label: "ServiceNow P1 Incident War Room Orchestration"
description: "When a P1 IT incident is raised in ServiceNow affecting a Danaher OpCo, pages the on-call engineer via PagerDuty and creates a Microsoft Teams war room channel for incident response coordination."
tags:
- itsm
- incident-response
- servicenow
- pagerduty
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: major-incident
port: 8080
tools:
- name: escalate-major-incident
description: "Given a ServiceNow P1 incident number, retrieve incident details, trigger a PagerDuty critical alert for the on-call engineer, and create a Microsoft Teams incident response channel. Use when major IT incidents affect production systems across any Danaher operating company."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number (e.g., 'INC0009876')."
steps:
- name: get-incident
type: call
call: servicenow-p1.get-incident
with:
incident_number: "{{incident_number}}"
- name: page-on-call
type: call
call: pagerduty.create-incident
with:
title: "P1 Incident: {{get-incident.short_description}}"
severity: "critical"
body: "SNOW: {{incident_number}} | OpCo: {{get-incident.business_unit}} | {{get-incident.short_description}}"
- name: create-war-room
type: call
call: msteams-war-room.create-channel
with:
display_name: "INC-{{incident_number}}-war-room"
description: "P1 War Room: {{incident_number}} — {{get-incident.short_description}}"
consumes:
- type: http
namespace: servicenow-p1
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: 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-room
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels"
inputParameters:
- name: team_id
in: path
operations:
- name: create-channel
method: POST
Searches Danaher SharePoint document libraries.
naftiko: "0.5"
info:
label: "SharePoint Document Search"
description: "Searches Danaher SharePoint document libraries."
tags:
- documentation
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-search
port: 8080
tools:
- name: search-docs
description: "Given query, return matching documents. Use for document search."
inputParameters:
- name: query
in: body
type: string
description: "Search keywords."
call: sharepoint.search
with:
querytext: "{{query}}"
outputParameters:
- name: result_count
type: integer
mapping: "$.PrimaryQueryResult.RelevantResults.TotalRows"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://danaher.sharepoint.com/_api"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: search
path: "/search/query?querytext='{{querytext}}'"
inputParameters:
- name: querytext
in: query
operations:
- name: search
method: GET
Runs automated data quality checks across Danaher's Snowflake data warehouse to validate completeness and consistency of sales and financial data ingested from each operating company's ERP.
naftiko: "0.5"
info:
label: "Snowflake Cross-OpCo Data Quality Validation"
description: "Runs automated data quality checks across Danaher's Snowflake data warehouse to validate completeness and consistency of sales and financial data ingested from each operating company's ERP."
tags:
- data
- quality
- snowflake
- reporting
- monitoring
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: validate-cross-opco-data-quality
description: "Execute Snowflake data quality checks for sales and financial data across all Danaher operating companies, checking for null rates, duplicate records, and out-of-range values. Alert the data engineering team in Teams if any OpCo fails validation. Use in nightly data quality monitoring."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "Fiscal period to validate data for (YYYY-MM format)."
- name: alert_channel_id
in: body
type: string
description: "Microsoft Teams channel ID to alert when validation failures are found."
steps:
- name: run-quality-checks
type: call
call: snowflake-dq.run-query
with:
statement: "SELECT opco_code, table_name, COUNT(*) as null_count, COUNT(*) - COUNT(revenue_amount) as missing_revenue FROM erp.revenue_transactions WHERE fiscal_period='{{fiscal_period}}' GROUP BY 1,2 HAVING null_count > 0 ORDER BY null_count DESC"
- name: alert-data-team
type: call
call: msteams-dq.send-message
with:
channel_id: "{{alert_channel_id}}"
message: "DATA QUALITY ALERT ({{fiscal_period}}): {{run-quality-checks.row_count}} OpCo data quality issues found. Top issue: {{run-quality-checks.opco_code}} — {{run-quality-checks.null_count}} nulls in {{run-quality-checks.table_name}}"
consumes:
- type: http
namespace: snowflake-dq
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams-dq
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers a Snowflake pipeline to compute cross-opco revenue analytics by product platform and geographic segment, then refreshes the executive Tableau dashboard.
naftiko: "0.5"
info:
label: "Snowflake Life Sciences Revenue Analytics Refresh"
description: "Triggers a Snowflake pipeline to compute cross-opco revenue analytics by product platform and geographic segment, then refreshes the executive Tableau dashboard."
tags:
- finance
- data
- snowflake
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: revenue-analytics
port: 8080
tools:
- name: refresh-revenue-analytics
description: "Execute Snowflake revenue aggregation across all Danaher operating companies by product platform and segment, then trigger a Tableau dashboard refresh for the executive revenue review. Use for monthly and quarterly business reviews."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "Fiscal period to compute revenue for (e.g., '2025-Q1' or '2025-03')."
- name: tableau_workbook_id
in: body
type: string
description: "Tableau workbook LUID to refresh."
steps:
- name: compute-revenue
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO analytics.revenue_summary SELECT fiscal_period, opco_code, product_platform, geography, SUM(net_revenue) as total_revenue, COUNT(DISTINCT customer_id) as customer_count FROM erp.revenue_transactions WHERE fiscal_period='{{fiscal_period}}' GROUP BY 1,2,3,4"
- name: refresh-tableau
type: call
call: tableau.refresh-workbook
with:
workbook_id: "{{tableau_workbook_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.danaher.com/api/2.8"
authentication:
type: apikey
key: "X-Tableau-Auth"
value: "$secrets.tableau_token"
placement: header
resources:
- name: workbook-refreshes
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: site_id
in: path
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
Generates supplier quality scorecards pulling data from SAP, ServiceNow, and Snowflake.
naftiko: "0.5"
info:
label: "Supplier Quality Scorecard Generation"
description: "Generates supplier quality scorecards pulling data from SAP, ServiceNow, and Snowflake."
tags:
- quality
- procurement
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: supplier-quality
port: 8080
tools:
- name: generate-scorecard
description: "Given supplier ID, gather quality data and calculate score. Use for supplier evaluation."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP vendor number."
steps:
- name: get-rejections
type: call
call: sap-erp.get-supplier-rejections
with:
vendor_id: "{{supplier_id}}"
- name: get-audits
type: call
call: servicenow.query-supplier-audits
with:
supplier_id: "{{supplier_id}}"
- name: calculate
type: call
call: snowflake.execute-query
with:
query_name: "supplier_scorecard"
params: "{{supplier_id}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: rejections
path: "/A_VendorRejection(Vendor='{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-supplier-rejections
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: audits
path: "/table/u_supplier_audit"
operations:
- name: query-supplier-audits
method: GET
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Responds to supply chain disruptions across Danaher operating companies.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Response Orchestration"
description: "Responds to supply chain disruptions across Danaher operating companies."
tags:
- supply-chain
- procurement
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-disruption
port: 8080
tools:
- name: respond-to-disruption
description: "Given supplier and disruption type, identify POs, create tasks, and notify. Use for disruptions."
inputParameters:
- name: supplier_id
in: body
type: string
description: "Vendor number."
- name: disruption_type
in: body
type: string
description: "Type."
steps:
- name: get-pos
type: call
call: sap-erp.query-open-pos
with:
vendor_id: "{{supplier_id}}"
- name: task
type: call
call: servicenow.create-task
with:
short_description: "Alt sourcing: {{disruption_type}} {{supplier_id}}"
priority: "1"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "supply-chain"
text: "DISRUPTION: {{supplier_id}}. POs: {{get-pos.count}}. Task: {{task.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-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: pos
path: "/A_PurchaseOrder"
operations:
- name: query-open-pos
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers Tableau dashboard refresh for operating company analytics.
naftiko: "0.5"
info:
label: "Tableau OpCo Dashboard Refresh"
description: "Triggers Tableau dashboard refresh for operating company analytics."
tags:
- analytics
- tableau
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: refresh-dashboard
description: "Given workbook, trigger refresh. Use for updated metrics."
inputParameters:
- name: workbook_name
in: body
type: string
description: "Workbook name."
call: tableau.trigger-refresh
with:
workbook: "{{workbook_name}}"
outputParameters:
- name: job_id
type: string
mapping: "$.job.id"
consumes:
- type: http
namespace: tableau
baseUri: "https://danaher.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook}}/refresh"
inputParameters:
- name: workbook
in: path
operations:
- name: trigger-refresh
method: POST
Provisions cloud environments for Danaher shared services using Terraform, monitoring, and CMDB.
naftiko: "0.5"
info:
label: "Terraform Environment Provisioning Orchestration"
description: "Provisions cloud environments for Danaher shared services using Terraform, monitoring, and CMDB."
tags:
- devops
- cloud
- terraform
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-provisioning
port: 8080
tools:
- name: provision-environment
description: "Given name and workspace, provision, monitor, register, and notify. Use for new environments."
inputParameters:
- name: environment_name
in: body
type: string
description: "Environment name."
- name: workspace_id
in: body
type: string
description: "Terraform workspace."
steps:
- name: terraform
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
- name: monitoring
type: call
call: datadog.create-monitor
with:
name: "{{environment_name}} health"
- name: cmdb
type: call
call: servicenow.create-ci
with:
name: "{{environment_name}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "devops"
text: "Env {{environment_name}} started. Run: {{terraform.run_id}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/workspaces/{{workspace_id}}/runs"
inputParameters:
- name: workspace_id
in: path
operations:
- name: create-run
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: monitors
path: "/monitor"
operations:
- name: create-monitor
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb
path: "/table/cmdb_ci"
operations:
- name: create-ci
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Synchronizes Veeva CRM field sales call activity reports to Salesforce, updating account engagement records and activity history for scientific sales representatives.
naftiko: "0.5"
info:
label: "Veeva CRM Call Report to Salesforce Sync"
description: "Synchronizes Veeva CRM field sales call activity reports to Salesforce, updating account engagement records and activity history for scientific sales representatives."
tags:
- sales
- crm
- veeva
- salesforce
- life-sciences
capability:
exposes:
- type: mcp
namespace: field-sales
port: 8080
tools:
- name: sync-veeva-call-to-salesforce
description: "Given a Veeva CRM call report ID from a completed field sales visit, retrieve the call details and create a corresponding Salesforce activity record on the account. Use to maintain a unified customer engagement history across Veeva and Salesforce for life sciences sales teams."
inputParameters:
- name: veeva_call_id
in: body
type: string
description: "Veeva CRM call report ID for the completed field visit."
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID for the customer visited."
steps:
- name: get-veeva-call
type: call
call: veeva.get-call-report
with:
call_id: "{{veeva_call_id}}"
- name: create-sf-activity
type: call
call: salesforce-activity.create-task
with:
account_id: "{{salesforce_account_id}}"
subject: "Field Visit: {{get-veeva-call.customer_name}} — {{get-veeva-call.call_date}}"
description: "Products Discussed: {{get-veeva-call.products_discussed}}\nKey Contacts: {{get-veeva-call.contacts_met}}\nNext Steps: {{get-veeva-call.next_steps}}\nVeeva Call ID: {{veeva_call_id}}"
activity_date: "{{get-veeva-call.call_date}}"
consumes:
- type: http
namespace: veeva
baseUri: "https://danaher.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_session_id"
resources:
- name: call-reports
path: "/objects/call2_vod__c/{{call_id}}"
inputParameters:
- name: call_id
in: path
operations:
- name: get-call-report
method: GET
- type: http
namespace: salesforce-activity
baseUri: "https://danaher.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
Retrieves regulatory documents from Veeva Vault for Danaher operating companies.
naftiko: "0.5"
info:
label: "Veeva Vault Document Retrieval"
description: "Retrieves regulatory documents from Veeva Vault for Danaher operating companies."
tags:
- regulatory
- quality
- veeva-vault
capability:
exposes:
- type: mcp
namespace: vault-documents
port: 8080
tools:
- name: get-document
description: "Given document number, return metadata and version. Use for document retrieval."
inputParameters:
- name: document_number
in: body
type: string
description: "Document number."
call: veeva-vault.get-document
with:
doc_number: "{{document_number}}"
outputParameters:
- name: title
type: string
mapping: "$.data.name__v"
- name: version
type: string
mapping: "$.data.major_version_number__v"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://danaher-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/objects/documents/{{doc_number}}"
inputParameters:
- name: doc_number
in: path
operations:
- name: get-document
method: GET
Assesses vendor risk by querying financials, compliance, and calculating score.
naftiko: "0.5"
info:
label: "Vendor Risk Assessment Orchestration"
description: "Assesses vendor risk by querying financials, compliance, and calculating score."
tags:
- procurement
- compliance
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: vendor-risk
port: 8080
tools:
- name: assess-risk
description: "Given vendor ID, collect data and score. Use for vendor evaluation."
inputParameters:
- name: vendor_id
in: body
type: string
description: "Vendor number."
steps:
- name: financials
type: call
call: sap-erp.get-vendor-master
with:
vendor_id: "{{vendor_id}}"
- name: compliance
type: call
call: servicenow.query-vendor-compliance
with:
vendor_id: "{{vendor_id}}"
- name: score
type: call
call: snowflake.execute-query
with:
query_name: "vendor_risk_score"
params: "{{vendor_id}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://danaher-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_Vendor('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor-master
method: GET
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: compliance
path: "/table/u_vendor_compliance"
operations:
- name: query-vendor-compliance
method: GET
- type: http
namespace: snowflake
baseUri: "https://danaher.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Initiates the annual performance review cycle in Workday for a Danaher operating company, sending Microsoft Teams reminder notifications to managers with direct reports pending review.
naftiko: "0.5"
info:
label: "Workday Annual Performance Review Launch"
description: "Initiates the annual performance review cycle in Workday for a Danaher operating company, sending Microsoft Teams reminder notifications to managers with direct reports pending review."
tags:
- hr
- performance-management
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: performance-review
port: 8080
tools:
- name: launch-annual-review-cycle
description: "Given a Workday review period ID and operating company, retrieve managers with pending annual reviews and send Microsoft Teams reminder messages with the submission deadline. Use at the start of the annual performance cycle across all Danaher OpCos."
inputParameters:
- name: review_period_id
in: body
type: string
description: "Workday performance review period ID."
- name: opco_code
in: body
type: string
description: "Danaher operating company code to launch the review for."
- name: submission_deadline
in: body
type: string
description: "Review submission deadline date in YYYY-MM-DD format."
steps:
- name: get-pending-reviews
type: call
call: workday-review.list-pending-reviews
with:
review_period_id: "{{review_period_id}}"
opco_code: "{{opco_code}}"
- name: notify-managers
type: call
call: msteams-review.send-message
with:
channel_id: "hr-{{opco_code}}-announcements"
message: "Annual Performance Reviews are open for {{opco_code}}. {{get-pending-reviews.count}} managers have pending reviews. Please complete in Workday by {{submission_deadline}}."
consumes:
- type: http
namespace: workday-review
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: performance-reviews
path: "/danaher/performanceReviews/{{review_period_id}}/pending"
inputParameters:
- name: review_period_id
in: path
- name: opco_code
in: query
operations:
- name: list-pending-reviews
method: GET
- type: http
namespace: msteams-review
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves employee benefits enrollment status from Workday.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Status"
description: "Retrieves employee benefits enrollment status from Workday."
tags:
- hr
- benefits
- workday
capability:
exposes:
- type: mcp
namespace: benefits
port: 8080
tools:
- name: get-benefits
description: "Given worker ID, return benefits elections. Use for benefits info."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
call: workday.get-benefits
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: medical_plan
type: string
mapping: "$.data.medical_plan"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: benefits
path: "/workers/{{worker_id}}/benefits"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-benefits
method: GET
Launches comp review by pulling performance, generating recommendations, and notifying managers across OpCos.
naftiko: "0.5"
info:
label: "Workday Compensation Review Orchestration"
description: "Launches comp review by pulling performance, generating recommendations, and notifying managers across OpCos."
tags:
- hr
- finance
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: comp-review
port: 8080
tools:
- name: launch-comp-review
description: "Given department and cycle, pull data, generate recs, and notify. Use for comp reviews."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
- name: cycle_name
in: body
type: string
description: "Cycle name."
steps:
- name: get-performance
type: call
call: workday.get-performance-ratings
with:
department: "{{department_code}}"
- name: generate-recs
type: call
call: workday.create-comp-recommendations
with:
department: "{{department_code}}"
cycle: "{{cycle_name}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Comp review: {{department_code}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-comp"
text: "Comp review '{{cycle_name}}' for {{department_code}}. 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: performance
path: "/performance/ratings"
operations:
- name: get-performance-ratings
method: GET
- name: compensation
path: "/compensation/recommendations"
operations:
- name: create-comp-recommendations
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves employee profile from Workday across Danaher operating companies.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves employee profile from Workday across Danaher operating companies."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-profile
port: 8080
tools:
- name: get-employee-profile
description: "Given worker ID, return name, department, title, and OpCo. Use for employee details."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.data.full_name"
- name: department
type: string
mapping: "$.data.department"
- name: opco
type: string
mapping: "$.data.company"
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: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
When an employee transfers between Danaher operating companies in Workday, updates Microsoft 365 group memberships, Salesforce profile, and creates a ServiceNow access review task.
naftiko: "0.5"
info:
label: "Workday Employee Role Change Access Update"
description: "When an employee transfers between Danaher operating companies in Workday, updates Microsoft 365 group memberships, Salesforce profile, and creates a ServiceNow access review task."
tags:
- hr
- identity
- workday
- salesforce
- servicenow
- access-management
capability:
exposes:
- type: mcp
namespace: opco-transfer
port: 8080
tools:
- name: process-opco-transfer
description: "Given a Workday worker ID and new operating company assignment, update Microsoft 365 group memberships to reflect the new OpCo, update the Salesforce user profile, and create a ServiceNow access review task for IT security validation. Use when employees transfer between Beckman Coulter, Leica, Pall, Cytiva, or other Danaher OpCos."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID of the employee being transferred."
- name: from_opco
in: body
type: string
description: "Source Danaher operating company code."
- name: to_opco
in: body
type: string
description: "Destination Danaher operating company code."
steps:
- name: get-worker
type: call
call: workday-transfer.get-worker
with:
worker_id: "{{worker_id}}"
- name: update-m365-groups
type: call
call: msgraph-transfer.update-user
with:
user_principal_name: "{{get-worker.work_email}}"
company_name: "{{to_opco}}"
department: "{{get-worker.department}}"
- name: create-access-review
type: call
call: servicenow-transfer.create-incident
with:
short_description: "Access Review: {{get-worker.full_name}} transfer from {{from_opco}} to {{to_opco}}"
category: "Access Management"
description: "Worker: {{worker_id}}\nEmployee: {{get-worker.full_name}}\nFrom OpCo: {{from_opco}}\nTo OpCo: {{to_opco}}\nEffective Date: {{get-worker.transfer_date}}"
consumes:
- type: http
namespace: workday-transfer
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/danaher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-transfer
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_principal_name}}"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: servicenow-transfer
baseUri: "https://danaher.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 new employee is created in Workday, provisions Microsoft 365 access, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the hiring manager across Danaher's operating companies.
naftiko: "0.5"
info:
label: "Workday New Hire Onboarding Orchestration"
description: "When a new employee is created in Workday, provisions Microsoft 365 access, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the hiring manager across Danaher's operating companies."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-employee-onboarding
description: "Given a Workday employee ID and operating company code, retrieve worker details, provision Microsoft 365 access, create a ServiceNow onboarding ticket, and notify the hiring manager in Teams. Use when new hires are finalized in Workday across any Danaher operating company."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID for the new hire."
- name: opco_code
in: body
type: string
description: "Danaher operating company code (e.g., 'BECKMAN', 'LEICA', 'PALL', 'CYTIVA')."
- name: start_date
in: body
type: string
description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
- name: provision-m365
type: call
call: msgraph.create-user
with:
user_principal_name: "{{get-worker.work_email}}"
display_name: "{{get-worker.full_name}}"
department: "{{get-worker.department}}"
- name: open-onboarding-ticket
type: call
call: servicenow.create-incident
with:
short_description: "New hire onboarding: {{get-worker.full_name}} ({{opco_code}})"
category: "HR"
description: "Worker: {{worker_id}}\nOpCo: {{opco_code}}\nStart: {{start_date}}\nDepartment: {{get-worker.department}}"
- name: notify-manager
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-worker.manager_email}}"
message: "Your new team member {{get-worker.full_name}} joins {{opco_code}} on {{start_date}}. Onboarding ticket: {{open-onboarding-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: "/danaher/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://danaher.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves open job requisitions across Danaher operating companies.
naftiko: "0.5"
info:
label: "Workday Open Requisition Report"
description: "Retrieves open job requisitions across Danaher operating companies."
tags:
- hr
- recruiting
- workday
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: get-open-reqs
description: "Given department, return open requisition count. Use for recruiting visibility."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
call: workday.get-requisitions
with:
department: "{{department_code}}"
outputParameters:
- name: open_count
type: integer
mapping: "$.data.total"
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: "/recruiting/requisitions"
operations:
- name: get-requisitions
method: GET
Retrieves current headcount and FTE distribution across Danaher's operating companies and geographies from Workday for executive workforce planning.
naftiko: "0.5"
info:
label: "Workday Payroll Headcount Snapshot"
description: "Retrieves current headcount and FTE distribution across Danaher's operating companies and geographies from Workday for executive workforce planning."
tags:
- hr
- finance
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: hr-finance
port: 8080
tools:
- name: get-headcount-by-opco
description: "Retrieve current headcount and FTE counts by operating company, department, and geography from Workday. Use for quarterly workforce planning, OpCo budget reviews, and executive reporting."
call: workday-hc.headcount-report
outputParameters:
- name: total_headcount
type: string
mapping: "$.report.totalHeadcount"
- name: opcos
type: array
mapping: "$.report.operatingCompanies"
items:
- name: opco_name
type: string
mapping: "$.name"
- name: headcount
type: number
mapping: "$.headcount"
- name: fte
type: number
mapping: "$.fte"
consumes:
- type: http
namespace: workday-hc
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount-report
path: "/danaher/reports/headcount"
operations:
- name: headcount-report
method: GET
Retrieves open requisitions and candidate pipeline metrics from Workday Recruiting for each operating company and publishes a weekly talent acquisition summary to the HR leadership SharePoint site.
naftiko: "0.5"
info:
label: "Workday Talent Acquisition Pipeline Report"
description: "Retrieves open requisitions and candidate pipeline metrics from Workday Recruiting for each operating company and publishes a weekly talent acquisition summary to the HR leadership SharePoint site."
tags:
- hr
- recruiting
- workday
- sharepoint
- reporting
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: publish-recruiting-pipeline-report
description: "Retrieve open job requisition counts, candidate pipeline stages, and time-to-fill metrics from Workday Recruiting for all Danaher operating companies, then publish a weekly summary to the HR SharePoint site. Use for weekly TA leadership reviews."
inputParameters:
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID for the HR leadership portal."
steps:
- name: get-recruiting-metrics
type: call
call: workday-ta.get-recruiting-summary
with:
report_type: "weekly_pipeline_summary"
- name: publish-to-sharepoint
type: call
call: sharepoint-ta.create-page
with:
site_id: "{{sharepoint_site_id}}"
title: "Weekly Talent Acquisition Pipeline Report"
content: "Open Requisitions: {{get-recruiting-metrics.open_reqs}}\nCandidates in Pipeline: {{get-recruiting-metrics.pipeline_count}}\nOffers Extended: {{get-recruiting-metrics.offers_extended}}\nAvg Time to Fill: {{get-recruiting-metrics.avg_time_to_fill_days}} days"
consumes:
- type: http
namespace: workday-ta
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: recruiting-reports
path: "/danaher/recruiting/reports/{{report_type}}"
inputParameters:
- name: report_type
in: path
operations:
- name: get-recruiting-summary
method: GET
- type: http
namespace: sharepoint-ta
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: site-pages
path: "/sites/{{site_id}}/pages"
inputParameters:
- name: site_id
in: path
operations:
- name: create-page
method: POST