Danaher Capabilities

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

Sort
Expand

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