Boston Scientific Capabilities

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

Sort
Expand

Monitors Azure Data Factory pipeline runs, retrieves execution status, and alerts the data engineering team via Microsoft Teams when failures occur.

naftiko: "0.5"
info:
  label: "Azure Data Factory ETL Pipeline Monitor"
  description: "Monitors Azure Data Factory pipeline runs, retrieves execution status, and alerts the data engineering team via Microsoft Teams when failures occur."
  tags:
    - engineering
    - etl
    - azure-data-factory
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: etl-monitoring
      port: 8080
      tools:
        - name: monitor-etl-pipeline
          description: "Monitor ADF pipeline runs and alert on failures."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "Azure Data Factory pipeline name."
            - name: factory_name
              in: body
              type: string
              description: "ADF factory name."
          steps:
            - name: get-pipeline-status
              type: call
              call: "adf.get-pipeline-runs"
              with:
                factory_name: "{{factory_name}}"
                pipeline_name: "{{pipeline_name}}"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data_engineering"
                text: "ETL Pipeline Alert: {{pipeline_name}} in {{factory_name}}. Status: {{get-pipeline-status.status}}. Duration: {{get-pipeline-status.duration_minutes}} min. Records: {{get-pipeline-status.rows_processed}}."
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/bsci-sub/resourceGroups/bsci-rg/providers/Microsoft.DataFactory/factories"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipeline-runs
          path: "/{{factory_name}}/pipelineruns?api-version=2018-06-01"
          inputParameters:
            - name: factory_name
              in: path
          operations:
            - name: get-pipeline-runs
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the latest Azure DevOps build for device firmware, retrieves test results, and posts a build quality summary to the software engineering team in Microsoft Teams for IEC 62304 traceability.

naftiko: "0.5"
info:
  label: "Azure DevOps Firmware Build and Test Report"
  description: "Checks the latest Azure DevOps build for device firmware, retrieves test results, and posts a build quality summary to the software engineering team in Microsoft Teams for IEC 62304 traceability."
  tags:
    - software
    - ci-cd
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: report-build-status
          description: "Get the latest build and test results for a firmware pipeline and notify the engineering team."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The build pipeline definition ID."
          steps:
            - name: get-latest-build
              type: call
              call: "azdo.get-build"
              with:
                project: "{{project}}"
                definition_id: "{{pipeline_id}}"
            - name: get-test-results
              type: call
              call: "azdo.get-test-runs"
              with:
                project: "{{project}}"
                build_id: "{{get-latest-build.value[0].id}}"
            - name: notify-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "firmware-engineering"
                text: "Build {{get-latest-build.value[0].buildNumber}}: {{get-latest-build.value[0].result}}. Tests passed: {{get-test-results.passedTests}}/{{get-test-results.totalTests}}. Finished: {{get-latest-build.value[0].finishTime}}."
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/bsci"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?definitions={{definition_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: definition_id
              in: query
          operations:
            - name: get-build
              method: GET
        - name: test-runs
          path: "/{{project}}/_apis/test/runs?buildUri={{build_id}}&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: query
          operations:
            - name: get-test-runs
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a work item from Azure DevOps by ID, returning title, state, assigned-to, and iteration path.

naftiko: "0.5"
info:
  label: "Azure DevOps Work Item Lookup"
  description: "Retrieves a work item from Azure DevOps by ID, returning title, state, assigned-to, and iteration path."
  tags:
    - engineering
    - project-management
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: work-item-tracking
      port: 8080
      tools:
        - name: get-work-item
          description: "Get an Azure DevOps work item by ID."
          inputParameters:
            - name: work_item_id
              in: body
              type: integer
              description: "The Azure DevOps work item ID."
          call: "azdevops.get-work-item"
          with:
            work_item_id: "{{work_item_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.fields.System.Title"
            - name: state
              type: string
              mapping: "$.fields.System.State"
            - name: assigned_to
              type: string
              mapping: "$.fields.System.AssignedTo.displayName"
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/bsci"
      authentication:
        type: basic
        username: "$secrets.azdevops_user"
        password: "$secrets.azdevops_pat"
      resources:
        - name: work-items
          path: "/_apis/wit/workitems/{{work_item_id}}?api-version=7.0"
          inputParameters:
            - name: work_item_id
              in: path
          operations:
            - name: get-work-item
              method: GET

Retrieves biocompatibility test results from the LIMS system, attaches them to the design history file in SharePoint, and notifies the regulatory team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Biocompatibility Test Result Pipeline"
  description: "Retrieves biocompatibility test results from the LIMS system, attaches them to the design history file in SharePoint, and notifies the regulatory team via Microsoft Teams."
  tags:
    - r-and-d
    - biocompatibility
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: biocompat-testing
      port: 8080
      tools:
        - name: process-biocompat-results
          description: "Retrieve biocompatibility results, attach to DHF, and notify regulatory team."
          inputParameters:
            - name: test_id
              in: body
              type: string
              description: "The LIMS test identifier."
            - name: device_code
              in: body
              type: string
              description: "The device product code."
          steps:
            - name: get-results
              type: call
              call: "lims.get-test-results"
              with:
                test_id: "{{test_id}}"
            - name: upload-to-dhf
              type: call
              call: "sharepoint.upload-document"
              with:
                site_id: "dhf_{{device_code}}"
                folder_path: "Biocompatibility"
                content: "{{get-results.report_pdf}}"
            - name: notify-regulatory
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory_affairs"
                text: "Biocompatibility results for {{device_code}} (Test: {{test_id}}) uploaded to DHF. Status: {{get-results.overall_status}}. Review: {{upload-to-dhf.webUrl}}"
  consumes:
    - type: http
      namespace: lims
      baseUri: "https://bsci-lims.corp.net/api/v2"
      authentication:
        type: bearer
        token: "$secrets.lims_token"
      resources:
        - name: tests
          path: "/tests/{{test_id}}/results"
          inputParameters:
            - name: test_id
              in: path
          operations:
            - name: get-test-results
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/bsci.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: upload-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a document from Box by file ID, returning file name, download URL, and modification date. Used for accessing quality system documents, SOPs, and regulatory filings.

naftiko: "0.5"
info:
  label: "Box Document Retrieval"
  description: "Retrieves a document from Box by file ID, returning file name, download URL, and modification date. Used for accessing quality system documents, SOPs, and regulatory filings."
  tags:
    - document-management
    - box
capability:
  exposes:
    - type: mcp
      namespace: document-mgmt
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a Box file by ID. Returns file name, download URL, size, and last modified date."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
          call: "box.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: download_url
              type: string
              mapping: "$.shared_link.download_url"
            - name: size
              type: number
              mapping: "$.size"
            - name: modified_at
              type: string
              mapping: "$.modified_at"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

At CAPA effectiveness review milestone, pulls the CAPA record from ServiceNow, gathers verification evidence from Box, checks for recurrence in Salesforce complaint data, and posts the review outcome to Confluence.

naftiko: "0.5"
info:
  label: "CAPA Effectiveness Review Pipeline"
  description: "At CAPA effectiveness review milestone, pulls the CAPA record from ServiceNow, gathers verification evidence from Box, checks for recurrence in Salesforce complaint data, and posts the review outcome to Confluence."
  tags:
    - quality
    - capa
    - effectiveness
    - servicenow
    - box
    - salesforce
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: capa-effectiveness
      port: 8080
      tools:
        - name: review-capa-effectiveness
          description: "Given a CAPA number, pull the record, gather evidence, check for recurrence, and document the review."
          inputParameters:
            - name: capa_number
              in: body
              type: string
              description: "The ServiceNow CAPA record number."
            - name: device_family
              in: body
              type: string
              description: "The device product family for recurrence check."
          steps:
            - name: get-capa
              type: call
              call: "servicenow.get-record"
              with:
                table: "x_bsci_capa"
                number: "{{capa_number}}"
            - name: get-evidence
              type: call
              call: "box.search-files"
              with:
                query: "CAPA_{{capa_number}}"
                ancestor_folder_id: "capa_evidence"
            - name: check-recurrence
              type: call
              call: "sfdc.query-complaints"
              with:
                query: "SELECT COUNT(Id) FROM Case WHERE Device_Family__c = '{{device_family}}' AND Defect_Code__c = '{{get-capa.defect_code}}' AND CreatedDate > {{get-capa.closure_date}}"
            - name: publish-review
              type: call
              call: "confluence.create-page"
              with:
                space_key: "QUALITY"
                title: "CAPA Effectiveness Review — {{capa_number}}"
                body: "CAPA: {{capa_number}}. Root cause: {{get-capa.root_cause}}. Evidence files: {{get-evidence.total_count}}. Post-closure recurrences: {{check-recurrence.totalSize}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
            - name: number
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: query
              in: query
            - name: ancestor_folder_id
              in: query
              parameterName: "ancestor_folder_ids"
          operations:
            - name: search-files
              method: GET
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-complaints
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Pulls catheter performance test data, compares against benchmarks in Databricks, and publishes results to Tableau.

naftiko: "0.5"
info:
  label: "Catheter Performance Benchmarking Pipeline"
  description: "Pulls catheter performance test data, compares against benchmarks in Databricks, and publishes results to Tableau."
  tags:
    - r-and-d
    - performance-testing
    - databricks
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: catheter-benchmarking
      port: 8080
      tools:
        - name: benchmark-catheter-performance
          description: "Pull test data, compare against benchmarks, and publish to Tableau."
          inputParameters:
            - name: catheter_model
              in: body
              type: string
              description: "Catheter model identifier."
            - name: test_batch_id
              in: body
              type: string
              description: "Test batch identifier."
          steps:
            - name: run-benchmark
              type: call
              call: "databricks.run-job"
              with:
                job_id: "catheter_benchmark"
                model: "{{catheter_model}}"
                batch: "{{test_batch_id}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "catheter_performance_{{catheter_model}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://bsci.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://bsci-tableau.corp.net/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Detects an environmental excursion from Datadog monitoring, quarantines affected lots in SAP, and escalates via ServiceNow.

naftiko: "0.5"
info:
  label: "Clean Room Environmental Excursion Handler"
  description: "Detects an environmental excursion from Datadog monitoring, quarantines affected lots in SAP, and escalates via ServiceNow."
  tags:
    - manufacturing
    - clean-room
    - datadog
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: environmental-excursion
      port: 8080
      tools:
        - name: handle-excursion
          description: "Detect environmental excursion, quarantine lots, and create escalation."
          inputParameters:
            - name: room_id
              in: body
              type: string
              description: "Clean room identifier."
            - name: parameter
              in: body
              type: string
              description: "Environmental parameter (e.g., particulate, humidity, temperature)."
          steps:
            - name: get-readings
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:cleanroom.{{parameter}}{room_id:{{room_id}}}"
                from: "now-2h"
                to: "now"
            - name: quarantine-lots
              type: call
              call: "sap.update-lot-status"
              with:
                room_id: "{{room_id}}"
                status: "QUARANTINE"
            - name: create-excursion-ticket
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_env_excursion"
                short_description: "Environmental excursion — Room {{room_id}} — {{parameter}}"
                description: "Parameter: {{parameter}}, Room: {{room_id}}. Reading: {{get-readings.avg_value}}. Lots quarantined."
                priority: "1"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_BATCH"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch"
          operations:
            - name: update-lot-status
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

When a clinical adverse event is reported in Salesforce, extracts event details, logs a safety report in ServiceNow, stores the narrative in Box, updates the Jira safety tracking board, and notifies pharmacovigilance via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Adverse Event Reporting Pipeline"
  description: "When a clinical adverse event is reported in Salesforce, extracts event details, logs a safety report in ServiceNow, stores the narrative in Box, updates the Jira safety tracking board, and notifies pharmacovigilance via Microsoft Teams."
  tags:
    - clinical
    - safety
    - adverse-event
    - salesforce
    - servicenow
    - box
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-safety
      port: 8080
      tools:
        - name: report-adverse-event
          description: "Given a Salesforce case ID for an adverse event, create safety records, archive narratives, track in Jira, and alert the safety team."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID for the adverse event report."
            - name: severity
              in: body
              type: string
              description: "Severity classification (serious, non-serious)."
            - name: device_lot
              in: body
              type: string
              description: "Device lot number involved in the event."
          steps:
            - name: get-event-case
              type: call
              call: "sfdc.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-safety-report
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_safety_report"
                short_description: "AE Report — {{severity}} — Lot {{device_lot}}"
                description: "{{get-event-case.description}}. Patient outcome: {{get-event-case.patient_outcome}}. Reporter: {{get-event-case.contact_name}}."
                priority: "1"
                assigned_group: "Pharmacovigilance"
            - name: archive-narrative
              type: call
              call: "box.upload-file"
              with:
                folder_id: "safety_narratives"
                file_name: "AE_{{create-safety-report.number}}_narrative.pdf"
            - name: create-tracking-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SAFETY"
                issue_type: "Adverse Event"
                summary: "AE {{create-safety-report.number}} — {{severity}} — Lot {{device_lot}}"
                description: "ServiceNow: {{create-safety-report.number}}. Salesforce: {{case_id}}."
            - name: notify-safety-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "pharmacovigilance"
                text: "URGENT: Adverse event {{create-safety-report.number}} ({{severity}}). Lot {{device_lot}}. Jira: {{create-tracking-issue.key}}. Narrative archived at {{archive-narrative.url}}."
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Exports clinical data from Databricks, archives it to Amazon S3, and logs the archive record in ServiceNow for regulatory compliance.

naftiko: "0.5"
info:
  label: "Clinical Data Export and Archive Pipeline"
  description: "Exports clinical data from Databricks, archives it to Amazon S3, and logs the archive record in ServiceNow for regulatory compliance."
  tags:
    - clinical
    - data-archival
    - databricks
    - amazon-s3
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: clinical-archive
      port: 8080
      tools:
        - name: export-and-archive-clinical-data
          description: "Export clinical data from Databricks, archive to S3, and log in ServiceNow."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical study identifier."
            - name: export_date
              in: body
              type: string
              description: "Export date in YYYY-MM-DD."
          steps:
            - name: export-data
              type: call
              call: "databricks.run-job"
              with:
                job_id: "clinical_data_export"
                study_id: "{{study_id}}"
                export_date: "{{export_date}}"
            - name: archive-to-s3
              type: call
              call: "s3.put-object"
              with:
                bucket: "bsci-clinical-archive"
                key: "{{study_id}}/{{export_date}}/clinical_export.parquet"
            - name: log-archive
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_data_archive"
                short_description: "Clinical data archive — {{study_id}} — {{export_date}}"
                description: "Study: {{study_id}}. Export date: {{export_date}}. S3 path: s3://bsci-clinical-archive/{{study_id}}/{{export_date}}/. Job: {{export-data.run_id}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://bsci.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://bsci-clinical-archive.s3.amazonaws.com"
      authentication:
        type: apiKey
        key: "$secrets.aws_access_key"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Extracts clinical trial data from Salesforce, transforms it via Azure Data Factory, loads into Azure Databricks for statistical analysis, and publishes results to a Confluence clinical study page.

naftiko: "0.5"
info:
  label: "Clinical Data Integration Pipeline"
  description: "Extracts clinical trial data from Salesforce, transforms it via Azure Data Factory, loads into Azure Databricks for statistical analysis, and publishes results to a Confluence clinical study page."
  tags:
    - clinical
    - data-integration
    - salesforce
    - azure-data-factory
    - azure-databricks
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: clinical-data
      port: 8080
      tools:
        - name: run-clinical-data-pipeline
          description: "Given a trial ID, trigger the ETL pipeline to extract, transform, analyze, and publish clinical data."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial protocol identifier."
            - name: data_cutoff_date
              in: body
              type: string
              description: "Data cutoff date in YYYY-MM-DD format."
          steps:
            - name: extract-trial-data
              type: call
              call: "sfdc.query-trial"
              with:
                query: "SELECT Id, Site__c, Subject_ID__c, Endpoint_Value__c FROM Clinical_Data__c WHERE Trial_ID__c = '{{trial_id}}' AND Data_Date__c <= {{data_cutoff_date}}"
            - name: trigger-adf-pipeline
              type: call
              call: "adf.trigger-pipeline"
              with:
                pipeline_name: "clinical_etl_{{trial_id}}"
                parameters:
                  cutoff_date: "{{data_cutoff_date}}"
            - name: publish-results
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CLINICAL"
                title: "Trial {{trial_id}} — Data Analysis — Cutoff {{data_cutoff_date}}"
                body: "Pipeline run: {{trigger-adf-pipeline.run_id}}. Records extracted: {{extract-trial-data.totalSize}}. Cutoff: {{data_cutoff_date}}."
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-trial
              method: GET
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/bsci-sub/resourceGroups/bsci-rg/providers/Microsoft.DataFactory/factories/bsci-adf"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipelines
          path: "/pipelines/{{pipeline_name}}/createRun?api-version=2018-06-01"
          inputParameters:
            - name: pipeline_name
              in: path
          operations:
            - name: trigger-pipeline
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Captures a clinical protocol deviation, creates a CAPA record in the quality system via ServiceNow, and notifies the principal investigator through Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Protocol Deviation Handler"
  description: "Captures a clinical protocol deviation, creates a CAPA record in the quality system via ServiceNow, and notifies the principal investigator through Microsoft Teams."
  tags:
    - clinical
    - protocol-deviation
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: protocol-deviation
      port: 8080
      tools:
        - name: handle-protocol-deviation
          description: "Record a protocol deviation, create CAPA, and notify the PI."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "Clinical trial identifier."
            - name: site_id
              in: body
              type: string
              description: "Clinical trial site ID."
            - name: deviation_description
              in: body
              type: string
              description: "Description of the deviation."
          steps:
            - name: create-capa
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_capa"
                short_description: "Protocol deviation — Trial {{trial_id}} Site {{site_id}}"
                description: "{{deviation_description}}"
                category: "clinical_deviation"
                priority: "2"
            - name: notify-pi
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical_trial_{{trial_id}}"
                text: "Protocol deviation reported at Site {{site_id}}. CAPA {{create-capa.number}} created. Description: {{deviation_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves clinical site visit data from Salesforce, calculates payment amounts, and initiates payment processing through SAP.

naftiko: "0.5"
info:
  label: "Clinical Site Payment Processing Workflow"
  description: "Retrieves clinical site visit data from Salesforce, calculates payment amounts, and initiates payment processing through SAP."
  tags:
    - clinical
    - site-payments
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: site-payment
      port: 8080
      tools:
        - name: process-site-payment
          description: "Retrieve visit data, calculate payment, and initiate SAP payment."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Clinical trial site ID."
            - name: trial_id
              in: body
              type: string
              description: "Clinical trial identifier."
            - name: payment_period
              in: body
              type: string
              description: "Payment period (e.g., 2026-Q1)."
          steps:
            - name: get-visit-data
              type: call
              call: "salesforce.query-visits"
              with:
                site_id: "{{site_id}}"
                trial_id: "{{trial_id}}"
                period: "{{payment_period}}"
            - name: create-payment
              type: call
              call: "sap.create-payment-request"
              with:
                vendor: "{{site_id}}"
                amount: "{{get-visit-data.total_amount}}"
                reference: "{{trial_id}}-{{payment_period}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical_finance"
                text: "Payment initiated for site {{site_id}}, trial {{trial_id}}: ${{get-visit-data.total_amount}} for {{get-visit-data.visit_count}} visits in {{payment_period}}. SAP ref: {{create-payment.document_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: visits
          path: "/query?q=SELECT+Id,Amount__c+FROM+Site_Visit__c+WHERE+Site__c='{{site_id}}'"
          inputParameters:
            - name: site_id
              in: query
          operations:
            - name: query-visits
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: create-payment-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Salesforce for clinical trial site enrollment data and publishes a real-time enrollment summary to a Power BI dataset for executive visibility.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Enrollment Dashboard"
  description: "Queries Salesforce for clinical trial site enrollment data and publishes a real-time enrollment summary to a Power BI dataset for executive visibility."
  tags:
    - clinical
    - enrollment
    - salesforce
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: clinical-enrollment
      port: 8080
      tools:
        - name: refresh-enrollment-dashboard
          description: "Given a clinical trial ID, pull site enrollment counts from Salesforce and push to Power BI dataset."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial protocol identifier."
          steps:
            - name: get-enrollment
              type: call
              call: "sfdc.query-enrollment"
              with:
                query: "SELECT Site_Name__c, Enrolled__c, Target__c FROM Trial_Site__c WHERE Trial_ID__c = '{{trial_id}}'"
            - name: push-to-powerbi
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "clinical_enrollment_ds"
                table_name: "SiteEnrollment"
                rows: "{{get-enrollment.records}}"
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-enrollment
              method: GET
    - 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}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

Extracts product complaint data from Salesforce Service Cloud, runs trending analysis in Databricks, and updates the quality dashboard in Power BI.

naftiko: "0.5"
info:
  label: "Complaint Trending Analysis Pipeline"
  description: "Extracts product complaint data from Salesforce Service Cloud, runs trending analysis in Databricks, and updates the quality dashboard in Power BI."
  tags:
    - quality
    - complaint-management
    - salesforce
    - databricks
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: complaint-trending
      port: 8080
      tools:
        - name: run-complaint-trending
          description: "Extract complaints, run trending analysis, and refresh the quality dashboard."
          inputParameters:
            - name: product_family
              in: body
              type: string
              description: "Product family identifier."
            - name: date_range
              in: body
              type: string
              description: "Date range for analysis (e.g., last-90-days)."
          steps:
            - name: extract-complaints
              type: call
              call: "salesforce.query-complaints"
              with:
                product_family: "{{product_family}}"
                date_range: "{{date_range}}"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "complaint_trending_{{product_family}}"
                parameters:
                  record_count: "{{extract-complaints.totalSize}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "quality_dashboards"
                dataset_id: "complaint_trending"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: complaints
          path: "/query?q=SELECT+Id,Product_Family__c+FROM+Case+WHERE+Product_Family__c='{{product_family}}'"
          inputParameters:
            - name: product_family
              in: query
          operations:
            - name: query-complaints
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://bsci.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Identifies training gaps from the LMS via Workday, creates remediation tasks in ServiceNow, and sends reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Compliance Training Gap Remediation Pipeline"
  description: "Identifies training gaps from the LMS via Workday, creates remediation tasks in ServiceNow, and sends reminders via Microsoft Teams."
  tags:
    - compliance
    - training
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training-remediation
      port: 8080
      tools:
        - name: remediate-training-gaps
          description: "Identify training gaps, create remediation tasks, and send reminders."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department code."
            - name: compliance_domain
              in: body
              type: string
              description: "Compliance domain (e.g., GMP, GDP, HIPAA)."
          steps:
            - name: get-training-gaps
              type: call
              call: "workday.get-training-status"
              with:
                department: "{{department}}"
                domain: "{{compliance_domain}}"
            - name: create-remediation
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_training_remediation"
                short_description: "Training gap — {{department}} — {{compliance_domain}}"
                description: "{{get-training-gaps.gap_count}} employees have overdue {{compliance_domain}} training in {{department}}."
            - name: send-reminders
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "dept_{{department}}"
                text: "Training reminder: {{get-training-gaps.gap_count}} overdue {{compliance_domain}} assignments. Remediation ticket: {{create-remediation.number}}. Please complete training by end of week."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://bsci.workday.com/api/learning/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learning_assignments?department={{department}}&status=overdue"
          inputParameters:
            - name: department
              in: query
          operations:
            - name: get-training-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches Boston Scientific's Confluence knowledge base for standard operating procedures by keyword or label. Returns page title, URL, and last modified date.

naftiko: "0.5"
info:
  label: "Confluence SOP Lookup"
  description: "Searches Boston Scientific's Confluence knowledge base for standard operating procedures by keyword or label. Returns page title, URL, and last modified date."
  tags:
    - quality
    - sop
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: search-sops
          description: "Search Confluence for SOPs matching a keyword or label. Returns matching page titles, URLs, and modification dates."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "Keyword or phrase to search for in SOP content."
          call: "confluence.search-content"
          with:
            cql: "label = 'sop' AND text ~ '{{search_term}}'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_count
              type: number
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET

Extracts quality data for contract manufacturers from SAP, pulls audit findings from Box, and creates a review summary in ServiceNow.

naftiko: "0.5"
info:
  label: "Contract Manufacturer Quality Review Pipeline"
  description: "Extracts quality data for contract manufacturers from SAP, pulls audit findings from Box, and creates a review summary in ServiceNow."
  tags:
    - quality
    - contract-manufacturing
    - sap
    - box
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cm-quality-review
      port: 8080
      tools:
        - name: review-cm-quality
          description: "Review contract manufacturer quality using SAP data and audit findings."
          inputParameters:
            - name: cm_vendor_number
              in: body
              type: string
              description: "Contract manufacturer SAP vendor number."
            - name: audit_folder_id
              in: body
              type: string
              description: "Box folder ID containing audit documents."
          steps:
            - name: get-quality-data
              type: call
              call: "sap.get-vendor-quality"
              with:
                vendor_number: "{{cm_vendor_number}}"
            - name: get-audit-docs
              type: call
              call: "box.get-folder-items"
              with:
                folder_id: "{{audit_folder_id}}"
            - name: create-review
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_cm_review"
                short_description: "CM Quality Review — {{cm_vendor_number}}"
                description: "Quality score: {{get-quality-data.score}}. Audit documents: {{get-audit-docs.total_count}} files."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_QUALITY_NOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality
          path: "/A_QualityNotification?$filter=Vendor eq '{{vendor_number}}'"
          inputParameters:
            - name: vendor_number
              in: query
          operations:
            - name: get-vendor-quality
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Receives a customer complaint from Salesforce, determines severity, creates a CAPA in ServiceNow, and notifies the quality engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Complaint to CAPA Pipeline"
  description: "Receives a customer complaint from Salesforce, determines severity, creates a CAPA in ServiceNow, and notifies the quality engineering team via Microsoft Teams."
  tags:
    - quality
    - customer-complaint
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: complaint-to-capa
      port: 8080
      tools:
        - name: process-complaint-to-capa
          description: "Convert a customer complaint into a CAPA record and notify quality engineering."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID."
            - name: severity
              in: body
              type: string
              description: "Complaint severity level (critical, major, minor)."
          steps:
            - name: get-complaint
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-capa
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_capa"
                short_description: "CAPA from complaint {{case_id}} — {{get-complaint.Subject}}"
                description: "Complaint: {{get-complaint.Description}}. Severity: {{severity}}."
                priority: "{{severity}}"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality_engineering"
                text: "New CAPA {{create-capa.number}} created from complaint {{case_id}}. Severity: {{severity}}. Subject: {{get-complaint.Subject}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for average API response latency over a specified time range for Boston Scientific integration endpoints.

naftiko: "0.5"
info:
  label: "Datadog API Latency Check"
  description: "Queries Datadog for average API response latency over a specified time range for Boston Scientific integration endpoints."
  tags:
    - engineering
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: api-monitoring
      port: 8080
      tools:
        - name: check-api-latency
          description: "Query Datadog for API latency metrics by service name."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The API service name in Datadog."
            - name: time_range
              in: body
              type: string
              description: "Time window (e.g., 1h, 24h)."
          call: "datadog.query-metrics"
          with:
            query: "avg:trace.http.request.duration{service:{{service_name}}}"
            from: "now-{{time_range}}"
            to: "now"
          outputParameters:
            - name: avg_latency_ms
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: max_latency_ms
              type: number
              mapping: "$.series[0].pointlist[-1][2]"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET

Queries Datadog for production line health metrics, checks for active alerts, and posts a line status summary to Microsoft Teams for the manufacturing operations team.

naftiko: "0.5"
info:
  label: "Datadog Manufacturing Line Monitoring"
  description: "Queries Datadog for production line health metrics, checks for active alerts, and posts a line status summary to Microsoft Teams for the manufacturing operations team."
  tags:
    - manufacturing
    - monitoring
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mfg-monitoring
      port: 8080
      tools:
        - name: get-line-health
          description: "Query Datadog for production line OEE and alerts, then post a status summary to the manufacturing Teams channel."
          inputParameters:
            - name: line_id
              in: body
              type: string
              description: "The production line identifier."
            - name: time_range
              in: body
              type: string
              description: "Time range for metrics (e.g., 1h, 24h, 7d)."
          steps:
            - name: get-oee-metrics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:manufacturing.oee{line:{{line_id}}}"
                from: "{{time_range}}"
            - name: get-active-alerts
              type: call
              call: "datadog.get-monitors"
              with:
                tags: "line:{{line_id}}"
                status: "Alert"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "manufacturing-ops"
                text: "Line {{line_id}} status: OEE {{get-oee-metrics.series[0].pointlist[-1][1]}}%. Active alerts: {{get-active-alerts.count}}. Time range: {{time_range}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        headerName: "DD-API-KEY"
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
            - name: from
              in: query
          operations:
            - name: query-metrics
              method: GET
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: tags
              in: query
              parameterName: "monitor_tags"
            - name: status
              in: query
          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects design control artifacts from Jira, verification test results from Confluence, and risk analysis documents from SharePoint to assemble a design history file summary and post it to a Box archive.

naftiko: "0.5"
info:
  label: "Design History File Assembly"
  description: "Collects design control artifacts from Jira, verification test results from Confluence, and risk analysis documents from SharePoint to assemble a design history file summary and post it to a Box archive."
  tags:
    - design-control
    - dhf
    - jira
    - confluence
    - sharepoint
    - box
capability:
  exposes:
    - type: mcp
      namespace: design-history
      port: 8080
      tools:
        - name: assemble-dhf
          description: "Given a device project key, collect design inputs from Jira, test reports from Confluence, risk documents from SharePoint, and archive to Box."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for the device development project."
            - name: device_name
              in: body
              type: string
              description: "Human-readable device name for labeling the archive."
          steps:
            - name: get-design-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND issuetype in ('Design Input', 'Design Output', 'Design Verification')"
            - name: get-test-reports
              type: call
              call: "confluence.search-content"
              with:
                cql: "space = '{{project_key}}' AND label = 'verification-report'"
            - name: get-risk-docs
              type: call
              call: "sharepoint.get-folder"
              with:
                site_id: "design_control"
                folder_path: "RiskAnalysis/{{project_key}}"
            - name: create-archive
              type: call
              call: "box.create-folder"
              with:
                parent_id: "dhf_archives"
                name: "DHF_{{project_key}}_{{device_name}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST

When a complaint is logged in Salesforce Service Cloud, creates a CAPA record in ServiceNow, uploads supporting documents to Box, and notifies quality engineering via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Device Complaint Intake Orchestrator"
  description: "When a complaint is logged in Salesforce Service Cloud, creates a CAPA record in ServiceNow, uploads supporting documents to Box, and notifies quality engineering via Microsoft Teams."
  tags:
    - quality
    - complaints
    - salesforce-service-cloud
    - servicenow
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-complaints
      port: 8080
      tools:
        - name: process-device-complaint
          description: "Given a Salesforce case ID and device serial number, create a CAPA investigation record, archive attachments, and alert the quality team."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID for the device complaint."
            - name: device_serial
              in: body
              type: string
              description: "The serial number of the implicated medical device."
            - name: complaint_category
              in: body
              type: string
              description: "Category of complaint (e.g., malfunction, labeling, injury)."
          steps:
            - name: get-case
              type: call
              call: "sfdc.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-capa
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_capa"
                short_description: "CAPA for device {{device_serial}} — {{complaint_category}}"
                description: "Complaint case {{case_id}}: {{get-case.subject}}. Reporter: {{get-case.contact_name}}. Device serial: {{device_serial}}."
                priority: "2"
                assigned_group: "Quality_Engineering"
            - name: archive-docs
              type: call
              call: "box.create-folder"
              with:
                parent_id: "quality_complaints"
                name: "CAPA_{{create-capa.number}}_{{device_serial}}"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-engineering"
                text: "New CAPA {{create-capa.number}} opened for device {{device_serial}} ({{complaint_category}}). Salesforce case: {{case_id}}. Documents: {{archive-docs.url}}"
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: capa-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the approved device label from SharePoint, creates translation tasks in Jira for each target language, and tracks progress in Confluence.

naftiko: "0.5"
info:
  label: "Device Labeling Translation Workflow"
  description: "Retrieves the approved device label from SharePoint, creates translation tasks in Jira for each target language, and tracks progress in Confluence."
  tags:
    - regulatory
    - labeling
    - sharepoint
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: labeling-translation
      port: 8080
      tools:
        - name: initiate-label-translation
          description: "Retrieve label, create translation tasks, and track in Confluence."
          inputParameters:
            - name: label_document_id
              in: body
              type: string
              description: "SharePoint document ID for the approved label."
            - name: target_languages
              in: body
              type: string
              description: "Comma-separated target language codes."
            - name: device_code
              in: body
              type: string
              description: "Device product code."
          steps:
            - name: get-label
              type: call
              call: "sharepoint.get-document"
              with:
                document_id: "{{label_document_id}}"
            - name: create-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "LBL"
                issuetype: "Task"
                summary: "Translate label — {{device_code}} — {{target_languages}}"
                description: "Label: {{get-label.name}}. Languages: {{target_languages}}."
            - name: create-tracker
              type: call
              call: "confluence.create-page"
              with:
                space: "LBL"
                title: "Translation Tracker — {{device_code}} — {{get-label.name}}"
                content: "Label: {{get-label.name}}. Languages: {{target_languages}}. Jira: {{create-tasks.key}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/bsci.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/drive/items/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.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: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Prepares an international device registration package by pulling product data from SAP, collecting technical documentation from SharePoint, creating a submission record in ServiceNow, and notifying regulatory affairs in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Device Registration Submission Workflow"
  description: "Prepares an international device registration package by pulling product data from SAP, collecting technical documentation from SharePoint, creating a submission record in ServiceNow, and notifying regulatory affairs in Microsoft Teams."
  tags:
    - regulatory
    - registration
    - international
    - sap
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: device-registration
      port: 8080
      tools:
        - name: prepare-registration-package
          description: "Given a material number and target country, assemble the registration package from SAP and SharePoint, create the submission record, and notify the team."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the device."
            - name: target_country
              in: body
              type: string
              description: "The ISO country code for the target market."
            - name: registration_type
              in: body
              type: string
              description: "Type of registration (initial, renewal, amendment)."
          steps:
            - name: get-product
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{material_number}}"
            - name: get-tech-docs
              type: call
              call: "sharepoint.get-folder"
              with:
                site_id: "regulatory_submissions"
                folder_path: "TechDocs/{{material_number}}/{{target_country}}"
            - name: create-submission
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_device_registration"
                short_description: "{{registration_type}} registration — {{get-product.description}} — {{target_country}}"
                description: "Material: {{material_number}}. Product: {{get-product.description}}. Country: {{target_country}}. Tech docs: {{get-tech-docs.item_count}} files."
                assigned_group: "International_Regulatory"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "international-regulatory"
                text: "Device registration {{create-submission.number}}: {{registration_type}} for {{get-product.description}} in {{target_country}}. {{get-tech-docs.item_count}} technical documents collected."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a firmware build in Azure DevOps, runs automated tests, and creates a release record in ServiceNow when tests pass.

naftiko: "0.5"
info:
  label: "Device Software Release Pipeline"
  description: "Triggers a firmware build in Azure DevOps, runs automated tests, and creates a release record in ServiceNow when tests pass."
  tags:
    - r-and-d
    - software-release
    - azure-devops
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: software-release
      port: 8080
      tools:
        - name: trigger-software-release
          description: "Build firmware, run tests, and create release record on success."
          inputParameters:
            - name: branch
              in: body
              type: string
              description: "Git branch for the release build."
            - name: version
              in: body
              type: string
              description: "Software version number."
          steps:
            - name: trigger-build
              type: call
              call: "azdevops.queue-build"
              with:
                definition_id: "firmware_build"
                source_branch: "{{branch}}"
            - name: create-release-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_sw_release"
                short_description: "Software release v{{version}}"
                description: "Branch: {{branch}}. Build: {{trigger-build.build_number}}. Status: {{trigger-build.status}}."
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/bsci"
      authentication:
        type: basic
        username: "$secrets.azdevops_user"
        password: "$secrets.azdevops_pat"
      resources:
        - name: builds
          path: "/_apis/build/builds?api-version=7.0"
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Searches Elasticsearch for device telemetry anomalies, pulls the device master record from SAP, and creates a ServiceNow investigation ticket when error patterns are detected.

naftiko: "0.5"
info:
  label: "Device Telemetry Anomaly Investigator"
  description: "Searches Elasticsearch for device telemetry anomalies, pulls the device master record from SAP, and creates a ServiceNow investigation ticket when error patterns are detected."
  tags:
    - r-and-d
    - telemetry
    - iot
    - elasticsearch
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: device-telemetry
      port: 8080
      tools:
        - name: investigate-telemetry-anomaly
          description: "Search device telemetry for error patterns, enrich with SAP device master data, and create an investigation ticket."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The device serial number."
            - name: time_range
              in: body
              type: string
              description: "Time range for the search (e.g., 24h, 7d, 30d)."
          steps:
            - name: search-telemetry
              type: call
              call: "es.search"
              with:
                index: "device-telemetry-*"
                serial_number: "{{serial_number}}"
                time_range: "{{time_range}}"
            - name: get-device-master
              type: call
              call: "sap.get-equipment-by-serial"
              with:
                serial_number: "{{serial_number}}"
            - name: create-investigation
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_telemetry_investigation"
                short_description: "Telemetry anomaly — {{get-device-master.description}} — SN {{serial_number}}"
                description: "{{search-telemetry.hits.total.value}} events in {{time_range}}. Device: {{get-device-master.description}} ({{get-device-master.material_number}})."
                assigned_group: "Connected_Devices"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://bsci-telemetry.es.eastus2.azure.elastic-cloud.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment?$filter=SerialNumber eq '{{serial_number}}'"
          inputParameters:
            - name: serial_number
              in: query
          operations:
            - name: get-equipment-by-serial
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves distributor order status from SAP, checks shipping details in Oracle EBS, and notifies the sales team via Salesforce Chatter.

naftiko: "0.5"
info:
  label: "Distributor Order Fulfillment Tracker"
  description: "Retrieves distributor order status from SAP, checks shipping details in Oracle EBS, and notifies the sales team via Salesforce Chatter."
  tags:
    - supply-chain
    - order-fulfillment
    - sap
    - oracle
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: order-fulfillment
      port: 8080
      tools:
        - name: track-distributor-order
          description: "Track distributor order across SAP and Oracle, notify sales team."
          inputParameters:
            - name: sales_order
              in: body
              type: string
              description: "SAP sales order number."
            - name: distributor_id
              in: body
              type: string
              description: "Distributor account ID."
          steps:
            - name: get-order-status
              type: call
              call: "sap.get-sales-order"
              with:
                sales_order: "{{sales_order}}"
            - name: get-shipping
              type: call
              call: "oracle.get-shipment"
              with:
                order_ref: "{{sales_order}}"
            - name: notify-sales
              type: call
              call: "salesforce.post-chatter"
              with:
                account_id: "{{distributor_id}}"
                text: "Order {{sales_order}} status: {{get-order-status.status}}. Shipment: {{get-shipping.tracking_number}}. ETA: {{get-shipping.estimated_delivery}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_SalesOrder('{{sales_order}}')"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: get-sales-order
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://bsci-ebs.oracle.com/webservices/rest/shipping"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: shipments
          path: "/shipments?order_ref={{order_ref}}"
          inputParameters:
            - name: order_ref
              in: query
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: chatter
          path: "/chatter/feeds/record/{{account_id}}/feed-elements"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: post-chatter
              method: POST

Retrieves the signing status of a DocuSign envelope used for supplier agreements, clinical site contracts, or quality agreements at Boston Scientific.

naftiko: "0.5"
info:
  label: "DocuSign Agreement Status"
  description: "Retrieves the signing status of a DocuSign envelope used for supplier agreements, clinical site contracts, or quality agreements at Boston Scientific."
  tags:
    - contracts
    - legal
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: contracts
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Look up a DocuSign envelope by ID. Returns signing status, recipients, and completion date."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "The DocuSign envelope identifier."
          call: "docusign.get-envelope"
          with:
            envelope_id: "{{envelope_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: sent_date
              type: string
              mapping: "$.sentDateTime"
            - name: completed_date
              type: string
              mapping: "$.completedDateTime"
            - name: recipients_pending
              type: number
              mapping: "$.recipientsPending"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/bsci-account"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET

Checks the signing status of a DocuSign envelope by envelope ID, returning status, sender, and recipient details.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Status Check"
  description: "Checks the signing status of a DocuSign envelope by envelope ID, returning status, sender, and recipient details."
  tags:
    - legal
    - e-signature
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: e-signature
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Get the status of a DocuSign envelope."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "The DocuSign envelope ID."
          call: "docusign.get-envelope"
          with:
            envelope_id: "{{envelope_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: sender
              type: string
              mapping: "$.sender.userName"
            - name: sent_date
              type: string
              mapping: "$.sentDateTime"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/bsci_account"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET

Retrieves the latest AutoCAD drawing version from SharePoint, cross-references the associated Jira design control ticket for approval status, and notifies the design engineer in Microsoft Teams if the drawing is pending review.

naftiko: "0.5"
info:
  label: "Drawing Version Audit and Notification"
  description: "Retrieves the latest AutoCAD drawing version from SharePoint, cross-references the associated Jira design control ticket for approval status, and notifies the design engineer in Microsoft Teams if the drawing is pending review."
  tags:
    - design-control
    - cad
    - autocad
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cad-management
      port: 8080
      tools:
        - name: audit-drawing-version
          description: "Check drawing version in SharePoint, verify design control approval in Jira, and notify the engineer if review is pending."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "The AutoCAD drawing number or file name."
            - name: project_key
              in: body
              type: string
              description: "The project key for the device development project."
          steps:
            - name: get-drawing
              type: call
              call: "sharepoint.get-file-versions"
              with:
                site_id: "design_control"
                file_path: "Drawings/{{project_key}}/{{drawing_number}}.dwg"
            - name: check-approval
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND issuetype = 'Drawing Approval' AND summary ~ '{{drawing_number}}' AND status != Approved"
            - name: notify-engineer
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "design-engineering"
                text: "Drawing {{drawing_number}} v{{get-drawing.value[0].id}} by {{get-drawing.value[0].lastModifiedBy.user.displayName}}. Pending approvals: {{check-approval.total}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: file-versions
          path: "/{{site_id}}/drive/root:/{{file_path}}:/versions"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file-versions
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for training documents, enrolls the user in Pluralsight learning paths, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for training documents, enrolls the user in Pluralsight learning paths, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - pluralsight
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID, start date, and department, orchestrate the full onboarding sequence."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Boston Scientific, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Training docs: {{provision-folder.url}}."
  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: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On employee termination in Workday, disables their Azure AD account and notifies IT security via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Termination Access Revocation Workflow"
  description: "On employee termination in Workday, disables their Azure AD account and notifies IT security via Microsoft Teams."
  tags:
    - human-resources
    - access-management
    - workday
    - azure-active-directory
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: access-revocation
      port: 8080
      tools:
        - name: revoke-terminated-employee-access
          description: "Disable accounts and revoke access upon employee termination."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: termination_date
              in: body
              type: string
              description: "Termination date in YYYY-MM-DD."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: disable-account
              type: call
              call: "azuread.disable-user"
              with:
                user_principal_name: "{{get-employee.email}}"
            - name: notify-security
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "it_security"
                text: "Access revoked for terminated employee: {{get-employee.full_name}} ({{employee_id}}). Azure AD disabled. Termination date: {{termination_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://bsci.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: employees
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: azuread
      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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates an engineering change order in SAP, links the design documents from SharePoint, and assigns review tasks in Jira.

naftiko: "0.5"
info:
  label: "Engineering Change Order Workflow"
  description: "Creates an engineering change order in SAP, links the design documents from SharePoint, and assigns review tasks in Jira."
  tags:
    - r-and-d
    - engineering-change
    - sap
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: eco-management
      port: 8080
      tools:
        - name: create-eco
          description: "Create an engineering change order with linked documents and review tasks."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: change_description
              in: body
              type: string
              description: "Description of the engineering change."
            - name: document_folder
              in: body
              type: string
              description: "SharePoint folder path for ECO documents."
          steps:
            - name: create-change-order
              type: call
              call: "sap.create-eco"
              with:
                material_number: "{{material_number}}"
                description: "{{change_description}}"
            - name: get-documents
              type: call
              call: "sharepoint.list-folder"
              with:
                folder_path: "{{document_folder}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project: "ECO"
                issuetype: "Task"
                summary: "Review ECO {{create-change-order.eco_number}} — {{material_number}}"
                description: "ECO: {{create-change-order.eco_number}}. Change: {{change_description}}. Documents: {{get-documents.folder_url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_ENGINEERING_CHANGE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: changes
          path: "/A_EngineeringChange"
          operations:
            - name: create-eco
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/bsci.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.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

When Datadog detects a cleanroom environmental excursion (temperature, humidity, particle count), creates a deviation record in ServiceNow, halts affected production orders in SAP, and alerts manufacturing and quality via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Environmental Monitoring Alert Pipeline"
  description: "When Datadog detects a cleanroom environmental excursion (temperature, humidity, particle count), creates a deviation record in ServiceNow, halts affected production orders in SAP, and alerts manufacturing and quality via Microsoft Teams."
  tags:
    - manufacturing
    - environmental
    - cleanroom
    - datadog
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: environmental-monitoring
      port: 8080
      tools:
        - name: handle-environmental-excursion
          description: "Given a cleanroom zone and excursion details, create a deviation, halt production, and notify stakeholders."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The cleanroom zone identifier."
            - name: parameter
              in: body
              type: string
              description: "The environmental parameter exceeded (temperature, humidity, particle_count)."
            - name: measured_value
              in: body
              type: string
              description: "The measured value that triggered the excursion."
            - name: limit_value
              in: body
              type: string
              description: "The specification limit that was exceeded."
          steps:
            - name: create-deviation
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_deviation"
                short_description: "Environmental excursion — Zone {{zone_id}} — {{parameter}}"
                description: "{{parameter}} excursion in zone {{zone_id}}. Measured: {{measured_value}}. Limit: {{limit_value}}."
                priority: "1"
                assigned_group: "Manufacturing_Quality"
            - name: get-active-orders
              type: call
              call: "sap.get-production-orders"
              with:
                plant: "{{zone_id}}"
                status: "REL"
            - name: notify-teams
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "manufacturing-alerts"
                text: "ALERT: Environmental excursion in zone {{zone_id}}. {{parameter}}: {{measured_value}} (limit: {{limit_value}}). Deviation: {{create-deviation.number}}. {{get-active-orders.count}} active production orders may be affected."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder?$filter=Plant eq '{{plant}}' and OrderStatus eq '{{status}}'"
          inputParameters:
            - name: plant
              in: query
            - name: status
              in: query
          operations:
            - name: get-production-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries ServiceNow for equipment calibration records nearing due date, retrieves the equipment master from SAP, creates calibration work orders, and notifies the maintenance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Equipment Calibration Due Orchestrator"
  description: "Queries ServiceNow for equipment calibration records nearing due date, retrieves the equipment master from SAP, creates calibration work orders, and notifies the maintenance team in Microsoft Teams."
  tags:
    - manufacturing
    - calibration
    - equipment
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: equipment-calibration
      port: 8080
      tools:
        - name: process-calibration-due
          description: "Given an equipment ID, check calibration status, pull equipment details from SAP, create a work order, and notify maintenance."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment number."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
          steps:
            - name: get-equipment
              type: call
              call: "sap.get-equipment"
              with:
                equipment_id: "{{equipment_id}}"
            - name: check-calibration
              type: call
              call: "servicenow.get-calibration"
              with:
                query: "equipment_id={{equipment_id}}^ORDERBYDESCdue_date"
            - name: create-work-order
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_calibration_wo"
                short_description: "Calibration due — {{get-equipment.description}} ({{equipment_id}})"
                description: "Equipment: {{get-equipment.description}}. Plant: {{plant_code}}. Last calibration: {{check-calibration.last_calibration_date}}. Due: {{check-calibration.due_date}}."
                assigned_group: "Calibration_Lab"
            - name: notify-maintenance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "calibration-lab-{{plant_code}}"
                text: "Calibration work order {{create-work-order.number}}: {{get-equipment.description}} ({{equipment_id}}) due {{check-calibration.due_date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-equipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: calibration
          path: "/table/x_bsci_calibration"
          inputParameters:
            - name: query
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-calibration
              method: GET
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected.

naftiko: "0.5"
info:
  label: "Expense Report Processing"
  description: "Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected."
  tags:
    - finance
    - expense
    - sap-concur
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: review-expense-report
          description: "Given a Concur expense report ID and employee ID, fetch the report, validate the cost center, and flag policy violations."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the expense submitter."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense policy review: {{get-expense-report.report_name}} — {{get-employee.full_name}}"
                description: "Report {{expense_report_id}} total: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Cost center: {{get-employee.cost_center}}."
                assigned_group: "Finance_Audit"
                category: "expense_review"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: 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: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Retrieves a 510(k) premarket notification record from the regulatory document store in SharePoint, validates completeness against a checklist in ServiceNow, and notifies the regulatory affairs team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "FDA 510(k) Submission Tracker"
  description: "Retrieves a 510(k) premarket notification record from the regulatory document store in SharePoint, validates completeness against a checklist in ServiceNow, and notifies the regulatory affairs team in Microsoft Teams."
  tags:
    - regulatory
    - fda
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submissions
      port: 8080
      tools:
        - name: track-510k-submission
          description: "Given a submission ID, pull the 510(k) dossier from SharePoint, check completeness in ServiceNow, and alert the regulatory team in Teams."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "The internal 510(k) submission tracking identifier."
            - name: product_code
              in: body
              type: string
              description: "The FDA product code for the medical device."
          steps:
            - name: get-dossier
              type: call
              call: "sharepoint.get-folder"
              with:
                site_id: "regulatory_submissions"
                folder_path: "510k/{{submission_id}}"
            - name: check-completeness
              type: call
              call: "servicenow.get-checklist"
              with:
                table: "x_bsci_reg_checklist"
                query: "submission_id={{submission_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory-affairs"
                text: "510(k) {{submission_id}} (product code {{product_code}}): {{check-completeness.completed_items}}/{{check-completeness.total_items}} checklist items complete. Dossier: {{get-dossier.url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: checklists
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
            - name: query
              in: query
          operations:
            - name: get-checklist
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks field inventory levels in SAP, compares against par levels, creates replenishment orders, and notifies field reps via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Field Inventory Replenishment Orchestrator"
  description: "Checks field inventory levels in SAP, compares against par levels, creates replenishment orders, and notifies field reps via Microsoft Teams."
  tags:
    - supply-chain
    - field-inventory
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-replenishment
      port: 8080
      tools:
        - name: replenish-field-inventory
          description: "Check field inventory, create replenishment orders, and notify reps."
          inputParameters:
            - name: rep_territory
              in: body
              type: string
              description: "Sales rep territory code."
            - name: product_family
              in: body
              type: string
              description: "Product family for replenishment check."
          steps:
            - name: check-inventory
              type: call
              call: "sap.get-consignment-stock"
              with:
                territory: "{{rep_territory}}"
                product_family: "{{product_family}}"
            - name: create-replenishment
              type: call
              call: "sap.create-transfer-order"
              with:
                source_plant: "DC01"
                destination: "{{rep_territory}}"
                materials: "{{check-inventory.below_par_items}}"
            - name: notify-rep
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "field_ops_{{rep_territory}}"
                text: "Replenishment order created for territory {{rep_territory}}: {{check-inventory.below_par_count}} items below par level. Transfer order: {{create-replenishment.transfer_order_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{territory}}'"
          inputParameters:
            - name: territory
              in: query
          operations:
            - name: get-consignment-stock
              method: GET
        - name: transfers
          path: "/A_WarehouseOrder"
          operations:
            - name: create-transfer-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a field safety corrective action (FSCA) is initiated, creates the FSCA record in ServiceNow, generates notification letters via Microsoft Word templates in SharePoint, distributes to affected hospitals via Salesforce, and alerts the field safety team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Field Safety Corrective Action Workflow"
  description: "When a field safety corrective action (FSCA) is initiated, creates the FSCA record in ServiceNow, generates notification letters via Microsoft Word templates in SharePoint, distributes to affected hospitals via Salesforce, and alerts the field safety team in Microsoft Teams."
  tags:
    - regulatory
    - field-safety
    - fsca
    - servicenow
    - sharepoint
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-safety
      port: 8080
      tools:
        - name: initiate-fsca
          description: "Given a device identifier and hazard description, create FSCA records, prepare notifications, distribute to affected accounts, and alert the team."
          inputParameters:
            - name: device_identifier
              in: body
              type: string
              description: "The UDI or catalog number of the affected device."
            - name: hazard_description
              in: body
              type: string
              description: "Description of the identified hazard."
            - name: affected_lot_range
              in: body
              type: string
              description: "Range of affected lot numbers."
            - name: corrective_action
              in: body
              type: string
              description: "Description of the corrective action to be taken."
          steps:
            - name: create-fsca-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_fsca"
                short_description: "FSCA — {{device_identifier}} — {{hazard_description}}"
                description: "Affected lots: {{affected_lot_range}}. Corrective action: {{corrective_action}}."
                priority: "1"
                assigned_group: "Field_Safety"
            - name: get-notification-template
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "regulatory_templates"
                file_path: "FSCA/notification_letter_template.docx"
            - name: get-affected-accounts
              type: call
              call: "sfdc.query-accounts"
              with:
                query: "SELECT Id, Name, Ship_To_Contact__c FROM Account WHERE Active_Device__c = '{{device_identifier}}'"
            - name: notify-field-safety
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "field-safety-urgent"
                text: "FSCA {{create-fsca-record.number}} initiated for {{device_identifier}}. Hazard: {{hazard_description}}. Lots: {{affected_lot_range}}. {{get-affected-accounts.totalSize}} accounts affected. Action: {{corrective_action}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-accounts
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Zendesk field service ticket, pulls the hospital account from Salesforce, and escalates to the regional service manager via Microsoft Teams when priority is urgent.

naftiko: "0.5"
info:
  label: "Field Service Escalation Workflow"
  description: "Retrieves a Zendesk field service ticket, pulls the hospital account from Salesforce, and escalates to the regional service manager via Microsoft Teams when priority is urgent."
  tags:
    - field-service
    - support
    - zendesk
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-service
      port: 8080
      tools:
        - name: escalate-service-ticket
          description: "Look up a Zendesk ticket, enrich with Salesforce account data, and escalate to the service manager in Teams."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
            - name: account_id
              in: body
              type: string
              description: "The Salesforce hospital account ID."
          steps:
            - name: get-ticket
              type: call
              call: "zendesk.get-ticket"
              with:
                ticket_id: "{{ticket_id}}"
            - name: get-account
              type: call
              call: "sfdc.get-account"
              with:
                account_id: "{{account_id}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "field-service-escalations"
                text: "Service escalation: Ticket #{{ticket_id}} ({{get-ticket.ticket.priority}}) — {{get-ticket.ticket.subject}}. Hospital: {{get-account.Name}}. Region: {{get-account.Region__c}}. Assigned: {{get-ticket.ticket.assignee.name}}."
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://bsci.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the latest GitHub Actions workflow run status for device firmware repositories, returning build result, duration, and commit SHA.

naftiko: "0.5"
info:
  label: "GitHub Actions Firmware Build Status"
  description: "Checks the latest GitHub Actions workflow run status for device firmware repositories, returning build result, duration, and commit SHA."
  tags:
    - software
    - ci-cd
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: firmware-ci
      port: 8080
      tools:
        - name: get-firmware-build
          description: "Check the latest GitHub Actions workflow run for a firmware repository."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name (org/repo format)."
            - name: workflow_id
              in: body
              type: string
              description: "The workflow file name or ID."
          call: "github.get-workflow-runs"
          with:
            repo: "{{repo}}"
            workflow_id: "{{workflow_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.workflow_runs[0].status"
            - name: conclusion
              type: string
              mapping: "$.workflow_runs[0].conclusion"
            - name: head_sha
              type: string
              mapping: "$.workflow_runs[0].head_sha"
            - name: run_url
              type: string
              mapping: "$.workflow_runs[0].html_url"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/runs?per_page=1"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: get-workflow-runs
              method: GET

Retrieves the status of a GitHub pull request by repository and PR number, returning title, state, and review status.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Status"
  description: "Retrieves the status of a GitHub pull request by repository and PR number, returning title, state, and review status."
  tags:
    - engineering
    - code-review
    - github
capability:
  exposes:
    - type: mcp
      namespace: code-review
      port: 8080
      tools:
        - name: get-pr-status
          description: "Get the status of a GitHub pull request."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number."
          call: "github.get-pull-request"
          with:
            repo: "{{repo}}"
            pr_number: "{{pr_number}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: state
              type: string
              mapping: "$.state"
            - name: mergeable
              type: boolean
              mapping: "$.mergeable"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET

Looks up a contact record in HubSpot by email address, returning name, company, lifecycle stage, and last activity date.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lookup"
  description: "Looks up a contact record in HubSpot by email address, returning name, company, lifecycle stage, and last activity date."
  tags:
    - marketing
    - crm
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: contact-management
      port: 8080
      tools:
        - name: get-contact
          description: "Look up a HubSpot contact by email address."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The contact email address."
          call: "hubspot.get-contact"
          with:
            email: "{{email}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.properties.firstname"
            - name: company
              type: string
              mapping: "$.properties.company"
            - name: lifecycle_stage
              type: string
              mapping: "$.properties.lifecyclestage"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{email}}?idProperty=email"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact
              method: GET

Traces an implant serial number through SAP manufacturing records, retrieves the associated UDI from the GUDID database, and logs the audit in ServiceNow.

naftiko: "0.5"
info:
  label: "Implant Serial Traceability Workflow"
  description: "Traces an implant serial number through SAP manufacturing records, retrieves the associated UDI from the GUDID database, and logs the audit in ServiceNow."
  tags:
    - manufacturing
    - traceability
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: implant-traceability
      port: 8080
      tools:
        - name: trace-implant-serial
          description: "Trace an implant serial number through manufacturing and UDI records."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The implant serial number."
          steps:
            - name: get-mfg-record
              type: call
              call: "sap.get-serial-record"
              with:
                serial_number: "{{serial_number}}"
            - name: get-udi
              type: call
              call: "gudid.lookup-device"
              with:
                di: "{{get-mfg-record.device_identifier}}"
            - name: log-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_audit_trail"
                short_description: "Traceability audit — SN {{serial_number}}"
                description: "Serial: {{serial_number}}, UDI: {{get-udi.udi}}, Lot: {{get-mfg-record.lot_number}}, Mfg Date: {{get-mfg-record.production_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_SERIAL_NUMBER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: serials
          path: "/A_SerialNumber('{{serial_number}}')"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-serial-record
              method: GET
    - type: http
      namespace: gudid
      baseUri: "https://accessgudid.nlm.nih.gov/api/v3"
      authentication:
        type: apiKey
        key: "$secrets.gudid_api_key"
      resources:
        - name: devices
          path: "/devices/lookup?di={{di}}"
          inputParameters:
            - name: di
              in: query
          operations:
            - name: lookup-device
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Validates reprocessing records for reusable instruments from SAP, checks sterilization logs, and updates the validation status in ServiceNow.

naftiko: "0.5"
info:
  label: "Instrument Reprocessing Validation Pipeline"
  description: "Validates reprocessing records for reusable instruments from SAP, checks sterilization logs, and updates the validation status in ServiceNow."
  tags:
    - quality
    - reprocessing
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: reprocessing-validation
      port: 8080
      tools:
        - name: validate-reprocessing
          description: "Validate instrument reprocessing records against sterilization logs."
          inputParameters:
            - name: instrument_id
              in: body
              type: string
              description: "Reusable instrument identifier."
            - name: reprocessing_date
              in: body
              type: string
              description: "Reprocessing date in YYYY-MM-DD."
          steps:
            - name: get-reprocessing-record
              type: call
              call: "sap.get-reprocessing"
              with:
                instrument_id: "{{instrument_id}}"
                date: "{{reprocessing_date}}"
            - name: update-validation
              type: call
              call: "servicenow.update-record"
              with:
                table: "x_bsci_reprocessing_validation"
                sys_id: "{{get-reprocessing-record.validation_id}}"
                status: "validated"
                notes: "Instrument {{instrument_id}} reprocessing on {{reprocessing_date}} validated. Cycle: {{get-reprocessing-record.cycle_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment?$filter=Equipment eq '{{instrument_id}}'"
          inputParameters:
            - name: instrument_id
              in: query
          operations:
            - name: get-reprocessing
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}/{{sys_id}}"
          inputParameters:
            - name: table
              in: path
            - name: sys_id
              in: path
          operations:
            - name: update-record
              method: PATCH

Provisions a new IT asset in ServiceNow CMDB, assigns it to a user in Workday, and creates an Azure AD account for device enrollment.

naftiko: "0.5"
info:
  label: "IT Asset Provisioning Orchestrator"
  description: "Provisions a new IT asset in ServiceNow CMDB, assigns it to a user in Workday, and creates an Azure AD account for device enrollment."
  tags:
    - it-operations
    - asset-management
    - servicenow
    - workday
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: asset-provisioning
      port: 8080
      tools:
        - name: provision-it-asset
          description: "Provision IT asset in ServiceNow, assign in Workday, and enroll in Azure AD."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID from Workday."
            - name: asset_type
              in: body
              type: string
              description: "Type of IT asset (laptop, monitor, phone)."
            - name: model
              in: body
              type: string
              description: "Asset model name."
          steps:
            - name: create-cmdb-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "cmdb_ci_computer"
                name: "{{asset_type}}-{{employee_id}}"
                model_id: "{{model}}"
                assigned_to: "{{employee_id}}"
            - name: get-employee
              type: call
              call: "workday.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: enroll-device
              type: call
              call: "azuread.register-device"
              with:
                display_name: "{{asset_type}}-{{get-employee.full_name}}"
                device_type: "{{asset_type}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://bsci.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: employees
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: devices
          path: "/devices"
          operations:
            - name: register-device
              method: POST

Queries Jira for the count of open bugs in a specified project, returning total count and severity breakdown.

naftiko: "0.5"
info:
  label: "Jira Bug Count by Project"
  description: "Queries Jira for the count of open bugs in a specified project, returning total count and severity breakdown."
  tags:
    - engineering
    - bug-tracking
    - jira
capability:
  exposes:
    - type: mcp
      namespace: bug-tracking
      port: 8080
      tools:
        - name: count-open-bugs
          description: "Count open bugs in a Jira project by project key."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key."
          call: "jira.search-issues"
          with:
            jql: "project = {{project_key}} AND issuetype = Bug AND status != Done"
          outputParameters:
            - name: total_bugs
              type: number
              mapping: "$.total"
            - name: issues
              type: array
              mapping: "$.issues"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET

Retrieves the current status of a Jira design control ticket used to track design inputs, outputs, and verification activities for a medical device project.

naftiko: "0.5"
info:
  label: "Jira Design Control Ticket Status"
  description: "Retrieves the current status of a Jira design control ticket used to track design inputs, outputs, and verification activities for a medical device project."
  tags:
    - design-control
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: design-control
      port: 8080
      tools:
        - name: get-design-control-ticket
          description: "Look up a Jira issue by key to get the design control phase, assignee, and status for a device development project."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., DC-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: design_phase
              type: string
              mapping: "$.fields.customfield_10100"
            - name: summary
              type: string
              mapping: "$.fields.summary"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

When a device labeling change is required, creates a change control in ServiceNow, retrieves current label artwork from Adobe Creative Cloud via Box, creates a Jira task for the labeling team, and notifies regulatory affairs in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Labeling Change Control Workflow"
  description: "When a device labeling change is required, creates a change control in ServiceNow, retrieves current label artwork from Adobe Creative Cloud via Box, creates a Jira task for the labeling team, and notifies regulatory affairs in Microsoft Teams."
  tags:
    - regulatory
    - labeling
    - change-control
    - servicenow
    - box
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: labeling
      port: 8080
      tools:
        - name: initiate-label-change
          description: "Given a device catalog number and change reason, create the change control, pull current artwork, assign to labeling, and notify regulatory."
          inputParameters:
            - name: catalog_number
              in: body
              type: string
              description: "The device catalog number."
            - name: change_reason
              in: body
              type: string
              description: "Reason for the labeling change."
            - name: regulatory_requirement
              in: body
              type: string
              description: "The regulatory requirement driving the change (e.g., EU MDR Article 18)."
          steps:
            - name: create-change-control
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_change_control"
                short_description: "Label change — {{catalog_number}} — {{change_reason}}"
                description: "Regulatory requirement: {{regulatory_requirement}}. Catalog: {{catalog_number}}."
                assigned_group: "Labeling_Services"
                category: "labeling"
            - name: get-current-artwork
              type: call
              call: "box.search-files"
              with:
                query: "{{catalog_number}} label artwork"
                ancestor_folder_id: "labeling_artwork"
            - name: create-labeling-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "LABEL"
                issue_type: "Label Change"
                summary: "Update label — {{catalog_number}} — {{change_reason}}"
                description: "Change control: {{create-change-control.number}}. Requirement: {{regulatory_requirement}}. Current artwork: {{get-current-artwork.entries[0].name}}."
            - name: notify-regulatory
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory-labeling"
                text: "Label change initiated: {{create-change-control.number}} for {{catalog_number}}. Reason: {{change_reason}}. Jira: {{create-labeling-task.key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: query
              in: query
            - name: ancestor_folder_id
              in: query
              parameterName: "ancestor_folder_ids"
          operations:
            - name: search-files
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compiles a quarterly management review package by pulling KPIs from Power BI, CAPA metrics from ServiceNow, complaint trends from Salesforce, and audit findings from Jira, then posts the summary to Confluence.

naftiko: "0.5"
info:
  label: "Management Review Data Package"
  description: "Compiles a quarterly management review package by pulling KPIs from Power BI, CAPA metrics from ServiceNow, complaint trends from Salesforce, and audit findings from Jira, then posts the summary to Confluence."
  tags:
    - quality
    - management-review
    - power-bi
    - servicenow
    - salesforce
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: management-review
      port: 8080
      tools:
        - name: compile-review-package
          description: "Given a reporting quarter, aggregate quality KPIs, CAPA metrics, complaint trends, and audit findings into a Confluence management review page."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "The reporting quarter (e.g., Q1-2026)."
            - name: year
              in: body
              type: string
              description: "The reporting year."
          steps:
            - name: get-kpis
              type: call
              call: "powerbi.get-dataset-refresh"
              with:
                dataset_id: "quality_kpi_ds"
            - name: get-capa-metrics
              type: call
              call: "servicenow.get-aggregate"
              with:
                table: "x_bsci_capa"
                query: "opened_at>=javascript:gs.quarterStart()^opened_at<=javascript:gs.quarterEnd()"
            - name: get-complaint-trends
              type: call
              call: "sfdc.query-complaints"
              with:
                query: "SELECT Complaint_Category__c, COUNT(Id) cnt FROM Case WHERE CreatedDate = THIS_QUARTER GROUP BY Complaint_Category__c"
            - name: get-audit-findings
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = AUDIT AND created >= startOfQuarter() AND created <= endOfQuarter()"
            - name: publish-review
              type: call
              call: "confluence.create-page"
              with:
                space_key: "QUALITY"
                title: "Management Review — {{quarter}} {{year}}"
                body: "Quality KPIs refreshed. CAPAs opened: {{get-capa-metrics.count}}. Complaint categories: {{get-complaint-trends.totalSize}}. Audit findings: {{get-audit-findings.total}}."
  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: get-dataset-refresh
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: aggregate
          path: "/stats/{{table}}"
          inputParameters:
            - name: table
              in: path
            - name: query
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-aggregate
              method: GET
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-complaints
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a production line nonconformance is detected, logs it in ServiceNow, links the affected lot in SAP, uploads inspection photos to Box, and alerts the plant quality manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Manufacturing Nonconformance Report"
  description: "When a production line nonconformance is detected, logs it in ServiceNow, links the affected lot in SAP, uploads inspection photos to Box, and alerts the plant quality manager via Microsoft Teams."
  tags:
    - manufacturing
    - quality
    - nonconformance
    - servicenow
    - sap
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-quality
      port: 8080
      tools:
        - name: log-nonconformance
          description: "Given lot number, defect type, and production line, create a nonconformance record, link in SAP, archive evidence, and notify the plant quality manager."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "The manufacturing lot or batch number."
            - name: defect_type
              in: body
              type: string
              description: "Classification of the nonconformance (e.g., dimensional, cosmetic, functional)."
            - name: production_line
              in: body
              type: string
              description: "The production line identifier where the defect was detected."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code."
          steps:
            - name: create-ncr
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_ncr"
                short_description: "NCR — Lot {{lot_number}} — {{defect_type}}"
                description: "Nonconformance on line {{production_line}} at plant {{plant_code}}. Lot: {{lot_number}}. Defect: {{defect_type}}."
                priority: "2"
                assigned_group: "Plant_Quality"
            - name: get-lot
              type: call
              call: "sap.get-batch"
              with:
                batch_number: "{{lot_number}}"
                plant: "{{plant_code}}"
            - name: archive-evidence
              type: call
              call: "box.create-folder"
              with:
                parent_id: "ncr_evidence"
                name: "NCR_{{create-ncr.number}}_{{lot_number}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "plant-quality-{{plant_code}}"
                text: "NCR {{create-ncr.number}} opened for lot {{lot_number}} ({{defect_type}}) on line {{production_line}}. Material: {{get-lot.material_description}}. Evidence folder: {{archive-evidence.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch(Batch='{{batch_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: batch_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Uploads MATLAB simulation results for device performance modeling to an Amazon S3 bucket and logs the simulation run metadata in ServiceNow for R&D traceability.

naftiko: "0.5"
info:
  label: "MATLAB Simulation Results Upload"
  description: "Uploads MATLAB simulation results for device performance modeling to an Amazon S3 bucket and logs the simulation run metadata in ServiceNow for R&D traceability."
  tags:
    - r-and-d
    - simulation
    - matlab
    - amazon-s3
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: rd-simulation
      port: 8080
      tools:
        - name: archive-simulation
          description: "Given a simulation run ID and results file path, upload to S3 and log in ServiceNow."
          inputParameters:
            - name: simulation_id
              in: body
              type: string
              description: "The MATLAB simulation run identifier."
            - name: results_key
              in: body
              type: string
              description: "The S3 object key for the results file."
            - name: model_name
              in: body
              type: string
              description: "Name of the simulation model."
          steps:
            - name: upload-results
              type: call
              call: "s3.put-object"
              with:
                bucket: "bsci-rd-simulations"
                key: "{{results_key}}"
            - name: log-metadata
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_simulation_log"
                short_description: "Simulation {{simulation_id}} — {{model_name}}"
                description: "Results archived at s3://bsci-rd-simulations/{{results_key}}. Model: {{model_name}}."
                assigned_group: "R_and_D_Engineering"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://bsci-rd-simulations.s3.amazonaws.com"
      authentication:
        type: awsSigV4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
        region: "us-east-1"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Classifies an adverse event from Salesforce, determines MDR reportability, creates an FDA MedWatch draft in ServiceNow, and alerts the regulatory team.

naftiko: "0.5"
info:
  label: "MDR Adverse Event Classification Pipeline"
  description: "Classifies an adverse event from Salesforce, determines MDR reportability, creates an FDA MedWatch draft in ServiceNow, and alerts the regulatory team."
  tags:
    - regulatory
    - adverse-event
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mdr-classification
      port: 8080
      tools:
        - name: classify-adverse-event
          description: "Classify adverse event, determine reportability, and create MedWatch draft."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce adverse event case ID."
            - name: event_type
              in: body
              type: string
              description: "Type of adverse event (death, serious-injury, malfunction)."
          steps:
            - name: get-event
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-medwatch-draft
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_medwatch"
                short_description: "MedWatch draft — {{case_id}} — {{event_type}}"
                description: "Event: {{get-event.Description}}. Type: {{event_type}}. Device: {{get-event.Device__c}}."
                priority: "1"
            - name: alert-regulatory
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory_mdr"
                text: "MDR Alert: {{event_type}} event reported. Case: {{case_id}}. MedWatch: {{create-medwatch-draft.number}}. Immediate review required."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a cybersecurity vulnerability scan via Azure DevOps, retrieves results, and creates a security finding in ServiceNow.

naftiko: "0.5"
info:
  label: "Medical Device Cybersecurity Scan Pipeline"
  description: "Triggers a cybersecurity vulnerability scan via Azure DevOps, retrieves results, and creates a security finding in ServiceNow."
  tags:
    - cybersecurity
    - vulnerability-scan
    - azure-devops
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: device-cybersecurity
      port: 8080
      tools:
        - name: run-cybersecurity-scan
          description: "Trigger vulnerability scan and create security findings from results."
          inputParameters:
            - name: device_software_id
              in: body
              type: string
              description: "Device software identifier."
            - name: scan_profile
              in: body
              type: string
              description: "Scan profile (full, quick, firmware)."
          steps:
            - name: trigger-scan
              type: call
              call: "azdevops.queue-build"
              with:
                definition_id: "cybersecurity_scan"
                software_id: "{{device_software_id}}"
                profile: "{{scan_profile}}"
            - name: create-findings
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_security_finding"
                short_description: "Cybersecurity scan — {{device_software_id}} — {{scan_profile}}"
                description: "Scan build: {{trigger-scan.build_number}}. Software: {{device_software_id}}. Profile: {{scan_profile}}."
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/bsci"
      authentication:
        type: basic
        username: "$secrets.azdevops_user"
        password: "$secrets.azdevops_pat"
      resources:
        - name: builds
          path: "/_apis/build/builds?api-version=7.0"
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves device registration status from Salesforce for international markets, creates follow-up tasks in Jira, and notifies the regulatory team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Medical Device Registration Status Pipeline"
  description: "Retrieves device registration status from Salesforce for international markets, creates follow-up tasks in Jira, and notifies the regulatory team via Microsoft Teams."
  tags:
    - regulatory
    - device-registration
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: device-registration-status
      port: 8080
      tools:
        - name: check-registration-status
          description: "Check international registration status and create follow-ups."
          inputParameters:
            - name: device_code
              in: body
              type: string
              description: "Device product code."
            - name: market
              in: body
              type: string
              description: "Target market (e.g., EU, Japan, China)."
          steps:
            - name: get-status
              type: call
              call: "salesforce.get-registration"
              with:
                device_code: "{{device_code}}"
                market: "{{market}}"
            - name: create-followup
              type: call
              call: "jira.create-issue"
              with:
                project: "REG"
                issuetype: "Task"
                summary: "Registration follow-up — {{device_code}} — {{market}}"
                description: "Current status: {{get-status.registration_status}}. Submitted: {{get-status.submission_date}}. Expected approval: {{get-status.expected_date}}."
            - name: notify-regulatory
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory_international"
                text: "Registration update: {{device_code}} in {{market}}. Status: {{get-status.registration_status}}. Follow-up: {{create-followup.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: registrations
          path: "/query?q=SELECT+Id,Status__c+FROM+Device_Registration__c+WHERE+Device_Code__c='{{device_code}}'+AND+Market__c='{{market}}'"
          inputParameters:
            - name: device_code
              in: query
            - name: market
              in: query
          operations:
            - name: get-registration
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates a phase gate review for new product introduction by collecting design review status from Jira, verification results from Confluence, risk file from SharePoint, and financial projections from Microsoft Excel in SharePoint, then schedules the gate review meeting in Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Product Introduction Gate Review"
  description: "Orchestrates a phase gate review for new product introduction by collecting design review status from Jira, verification results from Confluence, risk file from SharePoint, and financial projections from Microsoft Excel in SharePoint, then schedules the gate review meeting in Microsoft Teams."
  tags:
    - product-development
    - npi
    - gate-review
    - jira
    - confluence
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: npi-gate
      port: 8080
      tools:
        - name: prepare-gate-review
          description: "Given a project key and gate number, assemble all gate review artifacts and schedule the review meeting."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for the NPI program."
            - name: gate_number
              in: body
              type: string
              description: "The phase gate number (e.g., G2, G3, G4)."
            - name: review_date
              in: body
              type: string
              description: "Proposed review date in YYYY-MM-DD format."
          steps:
            - name: get-design-status
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND fixVersion = '{{gate_number}}' ORDER BY status"
            - name: get-verification-results
              type: call
              call: "confluence.search-content"
              with:
                cql: "space = '{{project_key}}' AND label = 'gate-{{gate_number}}-verification'"
            - name: get-risk-file
              type: call
              call: "sharepoint.get-folder"
              with:
                site_id: "npi_programs"
                folder_path: "{{project_key}}/Gate_{{gate_number}}/RiskFile"
            - name: schedule-review
              type: call
              call: "msteams.create-meeting"
              with:
                subject: "{{gate_number}} Gate Review — {{project_key}}"
                start_time: "{{review_date}}T14:00:00"
                end_time: "{{review_date}}T16:00:00"
                body: "Gate {{gate_number}} review for {{project_key}}. Design items: {{get-design-status.total}}. Verification reports: {{get-verification-results.totalSize}}. Risk files: {{get-risk-file.item_count}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-meeting
              method: POST

Retrieves recent deployment markers from New Relic for a given application, showing revision, deployer, and timestamp.

naftiko: "0.5"
info:
  label: "New Relic Deployment Marker Lookup"
  description: "Retrieves recent deployment markers from New Relic for a given application, showing revision, deployer, and timestamp."
  tags:
    - engineering
    - deployment
    - new-relic
capability:
  exposes:
    - type: mcp
      namespace: deployment-tracking
      port: 8080
      tools:
        - name: get-deployments
          description: "List recent deployment markers for an application in New Relic."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic.get-deployments"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: deployments
              type: array
              mapping: "$.deployments"
            - name: latest_revision
              type: string
              mapping: "$.deployments[0].revision"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: deployments
          path: "/applications/{{app_id}}/deployments.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-deployments
              method: GET

Queries Oracle E-Business Suite for on-hand inventory of a specific material at a given warehouse. Used by supply chain planners to verify component availability for device assembly.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Inventory Check"
  description: "Queries Oracle E-Business Suite for on-hand inventory of a specific material at a given warehouse. Used by supply chain planners to verify component availability for device assembly."
  tags:
    - inventory
    - supply-chain
    - oracle-e-business-suite
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: check-inventory
          description: "Look up on-hand inventory quantity for a material at a specific warehouse in Oracle EBS."
          inputParameters:
            - name: item_number
              in: body
              type: string
              description: "The Oracle item number for the material or component."
            - name: warehouse_code
              in: body
              type: string
              description: "The Oracle warehouse/organization code."
          call: "oracle-ebs.get-onhand"
          with:
            item_number: "{{item_number}}"
            organization_code: "{{warehouse_code}}"
          outputParameters:
            - name: quantity_on_hand
              type: number
              mapping: "$.OnhandQuantity"
            - name: uom
              type: string
              mapping: "$.PrimaryUOM"
            - name: subinventory
              type: string
              mapping: "$.Subinventory"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bsci-ebs.oraclecloud.com/webservices/rest/inventory/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: onhand
          path: "/onhand?ItemNumber={{item_number}}&OrganizationCode={{organization_code}}"
          inputParameters:
            - name: item_number
              in: query
            - name: organization_code
              in: query
          operations:
            - name: get-onhand
              method: GET

Queries Oracle E-Business Suite for lot genealogy data of a medical device component, returning parent and child lot relationships.

naftiko: "0.5"
info:
  label: "Oracle EBS Lot Genealogy Lookup"
  description: "Queries Oracle E-Business Suite for lot genealogy data of a medical device component, returning parent and child lot relationships."
  tags:
    - manufacturing
    - lot-tracking
    - oracle
    - oracle-e-business-suite
capability:
  exposes:
    - type: mcp
      namespace: lot-genealogy
      port: 8080
      tools:
        - name: get-lot-genealogy
          description: "Look up lot genealogy by lot number and item number in Oracle EBS."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "The manufacturing lot number."
            - name: item_number
              in: body
              type: string
              description: "The inventory item number."
          call: "oracle.get-lot-genealogy"
          with:
            lot_number: "{{lot_number}}"
            item_number: "{{item_number}}"
          outputParameters:
            - name: parent_lots
              type: array
              mapping: "$.ParentLots"
            - name: child_lots
              type: array
              mapping: "$.ChildLots"
            - name: creation_date
              type: string
              mapping: "$.CreationDate"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://bsci-ebs.oracle.com/webservices/rest/lot_genealogy"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: lots
          path: "/lots?lot_number={{lot_number}}&item_number={{item_number}}"
          inputParameters:
            - name: lot_number
              in: query
            - name: item_number
              in: query
          operations:
            - name: get-lot-genealogy
              method: GET

Pulls the latest packaging specification from Box, creates a review task in Jira, and notifies the packaging engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Packaging Specification Review Workflow"
  description: "Pulls the latest packaging specification from Box, creates a review task in Jira, and notifies the packaging engineering team via Microsoft Teams."
  tags:
    - manufacturing
    - packaging
    - box
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: packaging-review
      port: 8080
      tools:
        - name: initiate-packaging-review
          description: "Pull packaging spec from Box, create Jira review task, and notify team."
          inputParameters:
            - name: spec_file_id
              in: body
              type: string
              description: "Box file ID for the packaging specification."
            - name: device_code
              in: body
              type: string
              description: "The device product code."
          steps:
            - name: get-spec
              type: call
              call: "box.get-file-info"
              with:
                file_id: "{{spec_file_id}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project: "PKG"
                issuetype: "Task"
                summary: "Review packaging spec — {{get-spec.name}} — {{device_code}}"
                description: "Review the updated packaging specification: {{get-spec.shared_link.url}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "packaging_engineering"
                text: "New packaging spec review: {{get-spec.name}} for {{device_code}}. Jira: {{create-review-task.key}}. File: {{get-spec.shared_link.url}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file-info
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls product line data from SAP and generates a patent portfolio review summary in Confluence for legal team analysis.

naftiko: "0.5"
info:
  label: "Patent Portfolio Review Workflow"
  description: "Pulls product line data from SAP and generates a patent portfolio review summary in Confluence for legal team analysis."
  tags:
    - legal
    - intellectual-property
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: patent-review
      port: 8080
      tools:
        - name: review-patent-portfolio
          description: "Cross-reference patents with product lines and publish review summary."
          inputParameters:
            - name: product_line
              in: body
              type: string
              description: "Product line identifier."
            - name: review_year
              in: body
              type: string
              description: "Year for the review period."
          steps:
            - name: get-product-info
              type: call
              call: "sap.get-product-line"
              with:
                product_line: "{{product_line}}"
            - name: publish-review
              type: call
              call: "confluence.create-page"
              with:
                space: "IP"
                title: "Patent Review — {{product_line}} — {{review_year}}"
                content: "Product line: {{get-product-info.description}}. Products: {{get-product-info.product_count}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product?$filter=ProductLine eq '{{product_line}}'"
          inputParameters:
            - name: product_line
              in: query
          operations:
            - name: get-product-line
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Aggregates complaint data from Salesforce Service Cloud, field action records from ServiceNow, and trending analytics from Power BI to compile a periodic post-market surveillance report and archive it in SharePoint.

naftiko: "0.5"
info:
  label: "Post-Market Surveillance Report Generator"
  description: "Aggregates complaint data from Salesforce Service Cloud, field action records from ServiceNow, and trending analytics from Power BI to compile a periodic post-market surveillance report and archive it in SharePoint."
  tags:
    - regulatory
    - post-market
    - surveillance
    - salesforce-service-cloud
    - servicenow
    - power-bi
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: post-market
      port: 8080
      tools:
        - name: generate-pms-report
          description: "Given a device family and reporting period, aggregate complaints, field actions, and trending data to compile and archive a PMS report."
          inputParameters:
            - name: device_family
              in: body
              type: string
              description: "The medical device product family identifier."
            - name: period_start
              in: body
              type: string
              description: "Reporting period start date (YYYY-MM-DD)."
            - name: period_end
              in: body
              type: string
              description: "Reporting period end date (YYYY-MM-DD)."
          steps:
            - name: get-complaints
              type: call
              call: "sfdc.query-complaints"
              with:
                query: "SELECT Id, Subject, CreatedDate, Severity__c FROM Case WHERE Device_Family__c = '{{device_family}}' AND CreatedDate >= {{period_start}}T00:00:00Z AND CreatedDate <= {{period_end}}T23:59:59Z"
            - name: get-field-actions
              type: call
              call: "servicenow.get-field-actions"
              with:
                query: "device_family={{device_family}}^created_on>={{period_start}}^created_on<=={{period_end}}"
            - name: get-trend-data
              type: call
              call: "powerbi.export-report"
              with:
                report_id: "pms_trending_report"
                filter: "DeviceFamily eq '{{device_family}}'"
            - name: archive-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "regulatory_pms"
                file_path: "Reports/{{device_family}}/PMS_{{period_start}}_{{period_end}}.pdf"
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-complaints
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: field-actions
          path: "/table/x_bsci_field_action"
          inputParameters:
            - name: query
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-field-actions
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: reports
          path: "/reports/{{report_id}}/ExportTo"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: export-report
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Checks the last refresh status of a Power BI dataset, returning refresh type, start time, end time, and status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status of a Power BI dataset, returning refresh type, start time, end time, and status."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: powerbi-admin
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Get the last refresh status for a Power BI dataset."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.get-refresh-history"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_type
              type: string
              mapping: "$.value[0].refreshType"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Initiates a product recall by pulling affected serial numbers from SAP, generating a recall notice, and distributing it via Salesforce and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Recall Notification Workflow"
  description: "Initiates a product recall by pulling affected serial numbers from SAP, generating a recall notice, and distributing it via Salesforce and Microsoft Teams."
  tags:
    - quality
    - recall
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-recall
      port: 8080
      tools:
        - name: initiate-recall-notification
          description: "Pull affected serials, generate recall notice, and distribute notifications."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number of recalled product."
            - name: lot_numbers
              in: body
              type: string
              description: "Comma-separated list of affected lot numbers."
          steps:
            - name: get-affected-units
              type: call
              call: "sap.get-serials-by-lot"
              with:
                material_number: "{{material_number}}"
                lot_numbers: "{{lot_numbers}}"
            - name: create-recall-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Product Recall — {{material_number}}"
                description: "Affected lots: {{lot_numbers}}. Total units: {{get-affected-units.count}}."
                priority: "Critical"
                type: "Recall"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "product_recall_team"
                text: "RECALL INITIATED: Material {{material_number}}, Lots: {{lot_numbers}}. {{get-affected-units.count}} units affected. Case: {{create-recall-case.CaseNumber}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_SERIAL_NUMBER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: serials
          path: "/A_SerialNumber?$filter=Material eq '{{material_number}}'"
          inputParameters:
            - name: material_number
              in: query
          operations:
            - name: get-serials-by-lot
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors production yield metrics from SAP, compares against thresholds, and sends alerts to Microsoft Teams when yield drops below target.

naftiko: "0.5"
info:
  label: "Production Yield Alert Pipeline"
  description: "Monitors production yield metrics from SAP, compares against thresholds, and sends alerts to Microsoft Teams when yield drops below target."
  tags:
    - manufacturing
    - yield
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: yield-monitoring
      port: 8080
      tools:
        - name: check-production-yield
          description: "Monitor production yield from SAP and alert on threshold breaches."
          inputParameters:
            - name: work_center
              in: body
              type: string
              description: "SAP work center ID."
            - name: threshold_pct
              in: body
              type: number
              description: "Minimum acceptable yield percentage."
          steps:
            - name: get-yield-data
              type: call
              call: "sap.get-yield-metrics"
              with:
                work_center: "{{work_center}}"
            - name: send-alert
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "manufacturing_ops"
                text: "YIELD ALERT: Work center {{work_center}} yield is {{get-yield-data.current_yield}}% (threshold: {{threshold_pct}}%). Production order: {{get-yield-data.production_order}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_ProductionOrder?$filter=WorkCenter eq '{{work_center}}'"
          inputParameters:
            - name: work_center
              in: query
          operations:
            - name: get-yield-metrics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves quality event details from ServiceNow, pulls related manufacturing data from SAP, and creates an investigation report in Confluence.

naftiko: "0.5"
info:
  label: "Quality Event Root Cause Investigation"
  description: "Retrieves quality event details from ServiceNow, pulls related manufacturing data from SAP, and creates an investigation report in Confluence."
  tags:
    - quality
    - root-cause
    - servicenow
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: root-cause-investigation
      port: 8080
      tools:
        - name: investigate-quality-event
          description: "Investigate quality event root cause using ServiceNow and SAP data."
          inputParameters:
            - name: quality_event_id
              in: body
              type: string
              description: "ServiceNow quality event ID."
            - name: production_order
              in: body
              type: string
              description: "Related SAP production order number."
          steps:
            - name: get-event
              type: call
              call: "servicenow.get-record"
              with:
                table: "x_bsci_quality_event"
                sys_id: "{{quality_event_id}}"
            - name: get-production-data
              type: call
              call: "sap.get-production-order"
              with:
                order_number: "{{production_order}}"
            - name: create-investigation
              type: call
              call: "confluence.create-page"
              with:
                space: "QA"
                title: "Root Cause Investigation — {{get-event.number}}"
                content: "Event: {{get-event.short_description}}. Production order: {{production_order}}. Material: {{get-production-data.material_number}}. Yield: {{get-production-data.yield_pct}}%."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}/{{sys_id}}"
          inputParameters:
            - name: table
              in: path
            - name: sys_id
              in: path
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Downloads a raw material certificate from Box, validates against SAP material specs, and creates a quality record in ServiceNow.

naftiko: "0.5"
info:
  label: "Raw Material Certificate Validation Pipeline"
  description: "Downloads a raw material certificate from Box, validates against SAP material specs, and creates a quality record in ServiceNow."
  tags:
    - quality
    - incoming-inspection
    - box
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: material-cert-validation
      port: 8080
      tools:
        - name: validate-material-certificate
          description: "Download material cert, validate against SAP specs, and log quality record."
          inputParameters:
            - name: cert_file_id
              in: body
              type: string
              description: "Box file ID for the certificate."
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          steps:
            - name: get-cert
              type: call
              call: "box.get-file-info"
              with:
                file_id: "{{cert_file_id}}"
            - name: get-spec
              type: call
              call: "sap.get-material-spec"
              with:
                material_number: "{{material_number}}"
            - name: create-quality-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_incoming_inspection"
                short_description: "Material cert validation — {{material_number}}"
                description: "Certificate: {{get-cert.name}}, Material: {{material_number}}, Spec: {{get-spec.specification_name}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file-info
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')/to_Description"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-spec
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Executes a SQL query against Azure Databricks for R&D analytics, pushes results to a Power BI dataset for visualization, and notifies the R&D team in Microsoft Teams with a summary.

naftiko: "0.5"
info:
  label: "R&D Analytics Query and Visualization"
  description: "Executes a SQL query against Azure Databricks for R&D analytics, pushes results to a Power BI dataset for visualization, and notifies the R&D team in Microsoft Teams with a summary."
  tags:
    - r-and-d
    - analytics
    - azure-databricks
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rd-analytics
      port: 8080
      tools:
        - name: run-and-visualize-query
          description: "Execute a Databricks SQL query, push results to Power BI, and notify the team."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The SQL query to execute against the R&D lakehouse."
            - name: warehouse_id
              in: body
              type: string
              description: "The Databricks SQL warehouse ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to push results to."
          steps:
            - name: execute-query
              type: call
              call: "databricks.execute-query"
              with:
                warehouse_id: "{{warehouse_id}}"
                statement: "{{sql_query}}"
            - name: push-to-powerbi
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "{{dataset_id}}"
                table_name: "QueryResults"
                rows: "{{execute-query.result.data_array}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "rd-analytics"
                text: "R&D query complete: {{execute-query.result.data_array.length}} rows returned and pushed to Power BI dataset {{dataset_id}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://bsci-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-statements
          path: "/sql/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers an Alteryx Server workflow to prepare R&D experiment data, archives output to Amazon S3, and logs the job in ServiceNow for audit traceability.

naftiko: "0.5"
info:
  label: "R&D Data Preparation and Archive Pipeline"
  description: "Triggers an Alteryx Server workflow to prepare R&D experiment data, archives output to Amazon S3, and logs the job in ServiceNow for audit traceability."
  tags:
    - r-and-d
    - data-preparation
    - alteryx
    - amazon-s3
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: rd-data-prep
      port: 8080
      tools:
        - name: run-and-archive-workflow
          description: "Trigger an Alteryx workflow, archive results to S3, and log the run in ServiceNow."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Alteryx Server application/workflow ID."
            - name: experiment_id
              in: body
              type: string
              description: "The R&D experiment identifier for labeling."
          steps:
            - name: run-workflow
              type: call
              call: "alteryx.run-job"
              with:
                app_id: "{{app_id}}"
            - name: archive-output
              type: call
              call: "s3.put-object"
              with:
                bucket: "bsci-rd-data"
                key: "prepared/{{experiment_id}}/output_{{run-workflow.id}}.csv"
            - name: log-run
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_rd_data_prep"
                short_description: "Alteryx data prep — Experiment {{experiment_id}}"
                description: "Workflow {{app_id}}, Job {{run-workflow.id}}. Output archived: s3://bsci-rd-data/prepared/{{experiment_id}}/output_{{run-workflow.id}}.csv"
                assigned_group: "R_and_D_Data"
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://bsci-alteryx.corp.bsci.com/gallery/api/v1"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: jobs
          path: "/workflows/{{app_id}}/jobs"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://bsci-rd-data.s3.amazonaws.com"
      authentication:
        type: awsSigV4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
        region: "us-east-1"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

When a regulatory change notification arrives, searches Confluence for affected SOPs, queries Jira for open design control tickets, creates a ServiceNow change request, and notifies regulatory affairs and quality teams in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Change Impact Assessment"
  description: "When a regulatory change notification arrives, searches Confluence for affected SOPs, queries Jira for open design control tickets, creates a ServiceNow change request, and notifies regulatory affairs and quality teams in Microsoft Teams."
  tags:
    - regulatory
    - change-management
    - confluence
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-change
      port: 8080
      tools:
        - name: assess-regulatory-change
          description: "Given a regulation reference and description, find affected SOPs, related design tickets, open a change request, and notify stakeholders."
          inputParameters:
            - name: regulation_ref
              in: body
              type: string
              description: "The regulation or standard reference (e.g., ISO 13485:2016 clause 7.3)."
            - name: change_description
              in: body
              type: string
              description: "Summary of the regulatory change."
          steps:
            - name: find-affected-sops
              type: call
              call: "confluence.search-content"
              with:
                cql: "label = 'sop' AND text ~ '{{regulation_ref}}'"
            - name: find-design-tickets
              type: call
              call: "jira.search-issues"
              with:
                jql: "text ~ '{{regulation_ref}}' AND status != Closed"
            - name: create-change-request
              type: call
              call: "servicenow.create-record"
              with:
                table: "change_request"
                short_description: "Regulatory change impact: {{regulation_ref}}"
                description: "{{change_description}}. Affected SOPs: {{find-affected-sops.totalSize}} found. Open design tickets: {{find-design-tickets.total}}."
                assigned_group: "Regulatory_Affairs"
                category: "regulatory_change"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory-quality"
                text: "Regulatory change alert: {{regulation_ref}}. Change request {{create-change-request.number}} opened. {{find-affected-sops.totalSize}} SOPs and {{find-design-tickets.total}} design tickets potentially affected."
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Assembles regulatory submission documents from SharePoint, generates a table of contents, and uploads the package to the FDA ESG portal via Box.

naftiko: "0.5"
info:
  label: "Regulatory Submission Document Assembly"
  description: "Assembles regulatory submission documents from SharePoint, generates a table of contents, and uploads the package to the FDA ESG portal via Box."
  tags:
    - regulatory
    - submission
    - sharepoint
    - box
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submission
      port: 8080
      tools:
        - name: assemble-submission-package
          description: "Assemble regulatory documents from SharePoint and upload to FDA portal via Box."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "Regulatory submission identifier."
            - name: document_folder
              in: body
              type: string
              description: "SharePoint folder containing submission documents."
          steps:
            - name: list-documents
              type: call
              call: "sharepoint.list-folder"
              with:
                folder_path: "{{document_folder}}"
            - name: upload-package
              type: call
              call: "box.upload-file"
              with:
                folder_id: "fda_submissions"
                file_name: "Submission_{{submission_id}}.zip"
                content: "{{list-documents.package}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/bsci.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - 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

Pulls risk analysis documents from SharePoint, cross-references open risk mitigation Jira tickets, generates a risk summary, and posts the review status to Confluence for the design review board.

naftiko: "0.5"
info:
  label: "Risk Management File Review"
  description: "Pulls risk analysis documents from SharePoint, cross-references open risk mitigation Jira tickets, generates a risk summary, and posts the review status to Confluence for the design review board."
  tags:
    - risk-management
    - design-control
    - sharepoint
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: risk-management
      port: 8080
      tools:
        - name: review-risk-file
          description: "Given a device project key, pull risk documents from SharePoint, check mitigation status in Jira, and publish a summary to Confluence."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for the device program."
            - name: risk_file_path
              in: body
              type: string
              description: "SharePoint path to the risk management file."
          steps:
            - name: get-risk-docs
              type: call
              call: "sharepoint.get-folder"
              with:
                site_id: "design_control"
                folder_path: "{{risk_file_path}}"
            - name: get-open-mitigations
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = {{project_key}} AND issuetype = 'Risk Mitigation' AND status != Done"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{project_key}}"
                title: "Risk File Review — {{project_key}}"
                body: "Risk documents: {{get-risk-docs.item_count}} files. Open mitigations: {{get-open-mitigations.total}}. Last reviewed: today."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bsci.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Queries Salesforce for territory performance metrics, enriches with market data from Circana, and sends a weekly digest via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sales Territory Performance Digest"
  description: "Queries Salesforce for territory performance metrics, enriches with market data from Circana, and sends a weekly digest via Microsoft Teams."
  tags:
    - sales
    - territory-management
    - salesforce
    - circana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: territory-performance
      port: 8080
      tools:
        - name: generate-territory-digest
          description: "Generate territory performance digest from Salesforce and Circana data."
          inputParameters:
            - name: territory_id
              in: body
              type: string
              description: "Sales territory identifier."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., last-7-days)."
          steps:
            - name: get-sales-data
              type: call
              call: "salesforce.query-territory"
              with:
                territory_id: "{{territory_id}}"
                period: "{{period}}"
            - name: get-market-data
              type: call
              call: "circana.get-market-share"
              with:
                territory: "{{territory_id}}"
            - name: send-digest
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales_{{territory_id}}"
                text: "Territory {{territory_id}} digest: Revenue ${{get-sales-data.total_revenue}}, Pipeline ${{get-sales-data.pipeline_value}}, Market share: {{get-market-data.share_pct}}%."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Territory__c,SUM(Amount)+FROM+Opportunity+WHERE+Territory__c='{{territory_id}}'"
          inputParameters:
            - name: territory_id
              in: query
          operations:
            - name: query-territory
              method: GET
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v1"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: market-share
          path: "/market-share?territory={{territory}}"
          inputParameters:
            - name: territory
              in: query
          operations:
            - name: get-market-share
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a Salesforce case by case number and returns subject, status, priority, and assigned owner.

naftiko: "0.5"
info:
  label: "Salesforce Case Status Lookup"
  description: "Looks up a Salesforce case by case number and returns subject, status, priority, and assigned owner."
  tags:
    - customer-service
    - case-management
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: case-management
      port: 8080
      tools:
        - name: get-case
          description: "Look up a Salesforce case by case number."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The Salesforce case number."
          call: "salesforce.get-case"
          with:
            case_number: "{{case_number}}"
          outputParameters:
            - name: subject
              type: string
              mapping: "$.Subject"
            - name: status
              type: string
              mapping: "$.Status"
            - name: priority
              type: string
              mapping: "$.Priority"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bsci.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET

Retrieves a Salesforce opportunity by ID, enriches with account contract history, and posts a deal summary to the sales team in Microsoft Teams for hospital and IDN deal tracking.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Reporter"
  description: "Retrieves a Salesforce opportunity by ID, enriches with account contract history, and posts a deal summary to the sales team in Microsoft Teams for hospital and IDN deal tracking."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: report-opportunity
          description: "Look up a Salesforce opportunity, pull related account contracts, and post a summary to the sales channel."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: "sfdc.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: get-account-contracts
              type: call
              call: "sfdc.query-contracts"
              with:
                query: "SELECT Id, ContractNumber, Status, EndDate FROM Contract WHERE AccountId = '{{get-opportunity.AccountId}}' AND Status = 'Activated'"
            - name: notify-sales
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales-pipeline"
                text: "Opportunity {{get-opportunity.Name}}: Stage {{get-opportunity.StageName}}, Amount ${{get-opportunity.Amount}}, Close {{get-opportunity.CloseDate}}. Account: {{get-opportunity.Account.Name}}. Active contracts: {{get-account-contracts.totalSize}}."
  consumes:
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
        - name: soql
          path: "/query"
          inputParameters:
            - name: query
              in: query
              parameterName: "q"
          operations:
            - name: query-contracts
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP outbound delivery document for tracking medical device shipments to hospitals and distributors. Returns delivery status, ship-to party, and tracking number.

naftiko: "0.5"
info:
  label: "SAP Delivery Note Lookup"
  description: "Retrieves a SAP outbound delivery document for tracking medical device shipments to hospitals and distributors. Returns delivery status, ship-to party, and tracking number."
  tags:
    - logistics
    - shipping
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery
          description: "Look up a SAP outbound delivery by number. Returns delivery status, ship-to, and goods issue date."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: "sap.get-delivery"
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallDeliveryStatus"
            - name: ship_to
              type: string
              mapping: "$.d.ShipToParty"
            - name: goods_issue_date
              type: string
              mapping: "$.d.GoodsIssueDate"
            - name: tracking_number
              type: string
              mapping: "$.d.BillOfLading"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Retrieves material master data from SAP S/4HANA for a medical device component, returning material description, group, base unit, and gross weight.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA for a medical device component, returning material description, group, base unit, and gross weight."
  tags:
    - supply-chain
    - material
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: material-management
      port: 8080
      tools:
        - name: get-material
          description: "Look up a SAP material master record by material number. Returns description, material group, base UOM, and weight."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: gross_weight
              type: number
              mapping: "$.d.GrossWeight"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Retrieves a SAP S/4HANA production order status for a medical device manufacturing batch, returning order status, planned vs actual quantities, and scheduled completion date.

naftiko: "0.5"
info:
  label: "SAP Production Order Status"
  description: "Retrieves a SAP S/4HANA production order status for a medical device manufacturing batch, returning order status, planned vs actual quantities, and scheduled completion date."
  tags:
    - manufacturing
    - production
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: production
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order by number. Returns order status, material, planned quantity, actual quantity, and dates."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap.get-production-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: planned_qty
              type: number
              mapping: "$.d.PlannedTotalQuantity"
            - name: actual_qty
              type: number
              mapping: "$.d.ActualQuantity"
            - name: finish_date
              type: string
              mapping: "$.d.ScheduledFinishDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date. Used by supply chain teams to check PO status for medical device components.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date. Used by supply chain teams to check PO status for medical device components."
  tags:
    - supply-chain
    - procurement
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (10-digit)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves the status of a SAP quality inspection lot for incoming material or in-process inspection, returning inspection result, usage decision, and defect quantities.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Status"
  description: "Retrieves the status of a SAP quality inspection lot for incoming material or in-process inspection, returning inspection result, usage decision, and defect quantities."
  tags:
    - quality
    - inspection
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: quality-inspection
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Look up a SAP quality inspection lot by number. Returns result, usage decision, defect quantity, and inspector."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: "sap.get-inspection-lot"
          with:
            inspection_lot: "{{inspection_lot}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.d.InspectionResult"
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
            - name: defect_qty
              type: number
              mapping: "$.d.DefectQuantity"
            - name: lot_quantity
              type: number
              mapping: "$.d.InspectionLotQuantity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{inspection_lot}}')"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Retrieves vendor master data from SAP S/4HANA by vendor number, returning company name, payment terms, and currency.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number, returning company name, payment terms, and currency."
  tags:
    - supply-chain
    - vendor
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: vendor-management
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up a SAP vendor master record by vendor number."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: "sap.get-vendor"
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.CompanyName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: currency
              type: string
              mapping: "$.d.Currency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves a change request from ServiceNow by change number, returning description, state, risk level, and implementation plan.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Lookup"
  description: "Retrieves a change request from ServiceNow by change number, returning description, state, risk level, and implementation plan."
  tags:
    - it-operations
    - change-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: get-change-request
          description: "Look up a ServiceNow change request by number."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The change request number (e.g., CHG0012345)."
          call: "servicenow.get-change"
          with:
            change_number: "{{change_number}}"
          outputParameters:
            - name: short_description
              type: string
              mapping: "$.result.short_description"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: risk
              type: string
              mapping: "$.result.risk"
            - name: implementation_plan
              type: string
              mapping: "$.result.implementation_plan"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=number={{change_number}}"
          inputParameters:
            - name: change_number
              in: query
          operations:
            - name: get-change
              method: GET

Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description. Used for quick status checks on IT and quality issues.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description. Used for quick status checks on IT and quality issues."
  tags:
    - it-service
    - incident
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns state, priority, assigned group, and description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result[0].state"
            - name: priority
              type: string
              mapping: "$.result[0].priority"
            - name: assigned_group
              type: string
              mapping: "$.result[0].assignment_group.display_value"
            - name: short_description
              type: string
              mapping: "$.result[0].short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-incident
              method: GET

Retrieves document metadata from SharePoint including version, author, and modification date for a given document ID.

naftiko: "0.5"
info:
  label: "SharePoint Document Metadata Lookup"
  description: "Retrieves document metadata from SharePoint including version, author, and modification date for a given document ID."
  tags:
    - quality
    - document-control
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: document-metadata
      port: 8080
      tools:
        - name: get-document-metadata
          description: "Retrieve metadata for a SharePoint document by ID."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The SharePoint document ID."
          call: "sharepoint.get-document"
          with:
            document_id: "{{document_id}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: version
              type: string
              mapping: "$.version"
            - name: modified_by
              type: string
              mapping: "$.lastModifiedBy.user.displayName"
            - name: modified_date
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/bsci.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/drive/items/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET

Pulls shipping lane data from SAP, analyzes cost trends in Databricks, and generates a cost optimization report in Google Sheets.

naftiko: "0.5"
info:
  label: "Shipping Lane Cost Analysis Pipeline"
  description: "Pulls shipping lane data from SAP, analyzes cost trends in Databricks, and generates a cost optimization report in Google Sheets."
  tags:
    - supply-chain
    - logistics
    - sap
    - databricks
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: shipping-cost-analysis
      port: 8080
      tools:
        - name: analyze-shipping-costs
          description: "Analyze shipping lane costs across SAP and Databricks, generate report."
          inputParameters:
            - name: shipping_lane
              in: body
              type: string
              description: "Shipping lane identifier (origin-destination)."
            - name: period
              in: body
              type: string
              description: "Analysis period (e.g., last-12-months)."
          steps:
            - name: get-lane-data
              type: call
              call: "sap.get-shipping-costs"
              with:
                lane: "{{shipping_lane}}"
                period: "{{period}}"
            - name: run-analysis
              type: call
              call: "databricks.run-job"
              with:
                job_id: "shipping_cost_analysis"
                lane: "{{shipping_lane}}"
                total_cost: "{{get-lane-data.total_cost}}"
            - name: create-report
              type: call
              call: "gsheets.create-spreadsheet"
              with:
                title: "Shipping Cost Analysis — {{shipping_lane}} — {{period}}"
                data: "Lane: {{shipping_lane}}, Total cost: {{get-lane-data.total_cost}}, Shipments: {{get-lane-data.shipment_count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_INBOUND_DELIVERY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_InboundDelivery?$filter=ShippingLane eq '{{lane}}'"
          inputParameters:
            - name: lane
              in: query
          operations:
            - name: get-shipping-costs
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://bsci.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets"
          operations:
            - name: create-spreadsheet
              method: POST

Retrieves code quality metrics from SonarQube for medical device software projects, returning bugs, vulnerabilities, code smells, and coverage percentage for IEC 62304 compliance evidence.

naftiko: "0.5"
info:
  label: "SonarQube Code Quality Report"
  description: "Retrieves code quality metrics from SonarQube for medical device software projects, returning bugs, vulnerabilities, code smells, and coverage percentage for IEC 62304 compliance evidence."
  tags:
    - software
    - code-quality
    - sonarqube
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: get-code-quality
          description: "Retrieve SonarQube project quality metrics by project key."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
          call: "sonarqube.get-measures"
          with:
            component: "{{project_key}}"
            metric_keys: "bugs,vulnerabilities,code_smells,coverage,duplicated_lines_density"
          outputParameters:
            - name: measures
              type: array
              mapping: "$.component.measures"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.bsci.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: measures
          path: "/measures/component"
          inputParameters:
            - name: component
              in: query
            - name: metric_keys
              in: query
              parameterName: "metricKeys"
          operations:
            - name: get-measures
              method: GET

Collects sterilization cycle data from SAP, retrieves the validation protocol from SharePoint, logs results in ServiceNow, and notifies the sterilization engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sterilization Validation Record Pipeline"
  description: "Collects sterilization cycle data from SAP, retrieves the validation protocol from SharePoint, logs results in ServiceNow, and notifies the sterilization engineering team in Microsoft Teams."
  tags:
    - manufacturing
    - sterilization
    - validation
    - sap
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sterilization
      port: 8080
      tools:
        - name: record-sterilization-validation
          description: "Given a sterilization cycle ID and lot number, pull cycle data from SAP, retrieve the protocol from SharePoint, log in ServiceNow, and notify engineering."
          inputParameters:
            - name: cycle_id
              in: body
              type: string
              description: "The sterilization cycle identifier."
            - name: lot_number
              in: body
              type: string
              description: "The product lot number undergoing sterilization."
            - name: method
              in: body
              type: string
              description: "Sterilization method (EtO, gamma, e-beam)."
          steps:
            - name: get-cycle-data
              type: call
              call: "sap.get-sterilization-cycle"
              with:
                cycle_id: "{{cycle_id}}"
            - name: get-protocol
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "sterilization_validation"
                file_path: "Protocols/{{method}}/{{lot_number}}_protocol.pdf"
            - name: log-result
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_sterilization_log"
                short_description: "Sterilization validation — {{method}} — Lot {{lot_number}}"
                description: "Cycle {{cycle_id}}: Temperature {{get-cycle-data.temperature}}, Duration {{get-cycle-data.duration_min}} min, BI result: {{get-cycle-data.bi_result}}."
                assigned_group: "Sterilization_Engineering"
            - name: notify-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sterilization-engineering"
                text: "Sterilization validation logged: {{log-result.number}} for lot {{lot_number}} ({{method}}). BI result: {{get-cycle-data.bi_result}}. Protocol: {{get-protocol.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/Z_STERILIZATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cycles
          path: "/SterilizationCycle('{{cycle_id}}')"
          inputParameters:
            - name: cycle_id
              in: path
          operations:
            - name: get-sterilization-cycle
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a supplier quality issue is identified, creates a SCAR in ServiceNow, notifies the supplier contact via Microsoft Outlook, updates the supplier scorecard in Salesforce, and tracks resolution in Jira.

naftiko: "0.5"
info:
  label: "Supplier Corrective Action Pipeline"
  description: "When a supplier quality issue is identified, creates a SCAR in ServiceNow, notifies the supplier contact via Microsoft Outlook, updates the supplier scorecard in Salesforce, and tracks resolution in Jira."
  tags:
    - supplier-quality
    - scar
    - servicenow
    - microsoft-outlook
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: supplier-corrective
      port: 8080
      tools:
        - name: initiate-scar
          description: "Given supplier ID and issue details, create a SCAR, notify the supplier, update the scorecard, and create a tracking ticket."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP supplier number."
            - name: issue_description
              in: body
              type: string
              description: "Description of the quality issue."
            - name: affected_material
              in: body
              type: string
              description: "The material number affected by the issue."
            - name: supplier_contact_email
              in: body
              type: string
              description: "Email address of the supplier quality contact."
          steps:
            - name: create-scar
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_scar"
                short_description: "SCAR — Supplier {{supplier_id}} — Material {{affected_material}}"
                description: "{{issue_description}}"
                priority: "2"
                assigned_group: "Supplier_Quality"
            - name: notify-supplier
              type: call
              call: "outlook.send-email"
              with:
                to: "{{supplier_contact_email}}"
                subject: "Supplier Corrective Action Request — {{create-scar.number}}"
                body: "Boston Scientific has identified a quality issue with material {{affected_material}}. SCAR reference: {{create-scar.number}}. Please respond within 10 business days with root cause analysis and corrective action plan."
            - name: update-scorecard
              type: call
              call: "sfdc.update-record"
              with:
                object: "Supplier_Scorecard__c"
                external_id: "{{supplier_id}}"
                fields:
                  Open_SCARs__c: "increment"
                  Last_Quality_Issue__c: "{{issue_description}}"
            - name: create-tracking
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SQE"
                issue_type: "SCAR"
                summary: "SCAR {{create-scar.number}} — Supplier {{supplier_id}}"
                description: "Material: {{affected_material}}. Issue: {{issue_description}}. ServiceNow: {{create-scar.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: sfdc
      baseUri: "https://bsci.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sobjects
          path: "/sobjects/{{object}}/{{external_id}}"
          inputParameters:
            - name: object
              in: path
            - name: external_id
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://bsci.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

Creates an audit request in ServiceNow for a supplier, pulls the supplier master record from SAP, schedules the audit in Microsoft Planner, and notifies the audit team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Quality Audit Workflow"
  description: "Creates an audit request in ServiceNow for a supplier, pulls the supplier master record from SAP, schedules the audit in Microsoft Planner, and notifies the audit team in Microsoft Teams."
  tags:
    - supplier-quality
    - audit
    - servicenow
    - sap
    - microsoft-planner
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-quality
      port: 8080
      tools:
        - name: initiate-supplier-audit
          description: "Given a supplier ID and audit type, create the audit record, pull supplier details from SAP, schedule in Planner, and notify the audit team."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP vendor/supplier number."
            - name: audit_type
              in: body
              type: string
              description: "Type of audit (e.g., initial, surveillance, for-cause)."
            - name: target_date
              in: body
              type: string
              description: "Target audit date in YYYY-MM-DD format."
          steps:
            - name: get-supplier
              type: call
              call: "sap.get-supplier"
              with:
                supplier_id: "{{supplier_id}}"
            - name: create-audit-request
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_supplier_audit"
                short_description: "{{audit_type}} audit — {{get-supplier.name}}"
                description: "Supplier: {{get-supplier.name}} ({{supplier_id}}). Type: {{audit_type}}. Target date: {{target_date}}."
                assigned_group: "Supplier_Quality"
            - name: create-planner-task
              type: call
              call: "planner.create-task"
              with:
                plan_id: "supplier_audit_plan"
                title: "{{audit_type}} audit: {{get-supplier.name}} — {{target_date}}"
                due_date: "{{target_date}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supplier-quality"
                text: "Supplier audit initiated: {{create-audit-request.number}} for {{get-supplier.name}} ({{audit_type}}). Target: {{target_date}}. Planner task: {{create-planner-task.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{supplier_id}}')"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: planner
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls supplier quality metrics from SAP, combines with audit findings from ServiceNow, and publishes a scorecard to Tableau Server.

naftiko: "0.5"
info:
  label: "Supplier Scorecard Generation Pipeline"
  description: "Pulls supplier quality metrics from SAP, combines with audit findings from ServiceNow, and publishes a scorecard to Tableau Server."
  tags:
    - supply-chain
    - supplier-quality
    - sap
    - servicenow
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: supplier-scorecard
      port: 8080
      tools:
        - name: generate-supplier-scorecard
          description: "Generate a supplier quality scorecard from SAP and ServiceNow data."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor number."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-quality-metrics
              type: call
              call: "sap.get-vendor-quality"
              with:
                vendor_number: "{{vendor_number}}"
                period: "{{period}}"
            - name: get-audit-findings
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_bsci_supplier_audit"
                query: "vendor={{vendor_number}}^period={{period}}"
            - name: publish-scorecard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "supplier_scorecard_{{vendor_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_QUALITY_NOTIFICATION"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality
          path: "/A_QualityNotification?$filter=Vendor eq '{{vendor_number}}'"
          inputParameters:
            - name: vendor_number
              in: query
          operations:
            - name: get-vendor-quality
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: tableau
      baseUri: "https://bsci-tableau.corp.net/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Triggers a Tableau datasource extract refresh for quality metrics, ensuring the latest CAPA, NCR, and complaint data is available to quality leadership.

naftiko: "0.5"
info:
  label: "Tableau Quality Metrics Dashboard Refresh"
  description: "Triggers a Tableau datasource extract refresh for quality metrics, ensuring the latest CAPA, NCR, and complaint data is available to quality leadership."
  tags:
    - quality
    - analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: quality-analytics
      port: 8080
      tools:
        - name: refresh-quality-dashboard
          description: "Trigger a Tableau extract refresh for a quality metrics datasource by datasource ID."
          inputParameters:
            - name: datasource_id
              in: body
              type: string
              description: "The Tableau datasource LUID."
          call: "tableau.refresh-datasource"
          with:
            datasource_id: "{{datasource_id}}"
          outputParameters:
            - name: job_id
              type: string
              mapping: "$.job.id"
            - name: status
              type: string
              mapping: "$.job.status"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://bsci-tableau.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/bsci-site/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-datasource
              method: POST

Lists available Tableau Server workbooks in a given project, returning workbook name, owner, and last updated timestamp.

naftiko: "0.5"
info:
  label: "Tableau Server Workbook List"
  description: "Lists available Tableau Server workbooks in a given project, returning workbook name, owner, and last updated timestamp."
  tags:
    - analytics
    - reporting
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: tableau-admin
      port: 8080
      tools:
        - name: list-workbooks
          description: "List Tableau workbooks by project name."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The Tableau project name."
          call: "tableau.list-workbooks"
          with:
            project_name: "{{project_name}}"
          outputParameters:
            - name: workbooks
              type: array
              mapping: "$.workbooks.workbook"
            - name: count
              type: number
              mapping: "$.pagination.totalAvailable"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://bsci-tableau.corp.net/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          inputParameters:
            - name: project_name
              in: query
          operations:
            - name: list-workbooks
              method: GET

Queries Workday learning records for an employee, cross-references required training for their role from ServiceNow, identifies gaps, and alerts the employee and their manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Training Compliance Checker"
  description: "Queries Workday learning records for an employee, cross-references required training for their role from ServiceNow, identifies gaps, and alerts the employee and their manager via Microsoft Teams."
  tags:
    - compliance
    - training
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given an employee ID and role, verify training completeness against required curricula and notify on gaps."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: role_code
              in: body
              type: string
              description: "The role code for required training lookup."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: get-completed-training
              type: call
              call: "workday.get-learning"
              with:
                worker_id: "{{employee_id}}"
            - name: get-required-training
              type: call
              call: "servicenow.get-required-training"
              with:
                role_code: "{{role_code}}"
            - name: notify-gaps
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Training compliance check: {{get-completed-training.completed_count}} of {{get-required-training.total_required}} required courses completed for role {{role_code}}. Please review outstanding items."
  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
        - name: learning
          path: "/workers/{{worker_id}}/learningEnrollments"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-learning
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: training-requirements
          path: "/table/x_bsci_training_req"
          inputParameters:
            - name: role_code
              in: query
              parameterName: "sysparm_query"
          operations:
            - name: get-required-training
              method: GET
    - 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

Registers a Unique Device Identifier (UDI) by pulling product master data from SAP, packaging configuration from Oracle EBS, creating the GUDID submission record in ServiceNow, and notifying the UDI coordinator in Microsoft Teams.

naftiko: "0.5"
info:
  label: "UDI Database Registration"
  description: "Registers a Unique Device Identifier (UDI) by pulling product master data from SAP, packaging configuration from Oracle EBS, creating the GUDID submission record in ServiceNow, and notifying the UDI coordinator in Microsoft Teams."
  tags:
    - regulatory
    - udi
    - sap
    - oracle-e-business-suite
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: udi-registration
      port: 8080
      tools:
        - name: register-udi
          description: "Given a material number and packaging level, assemble UDI data from SAP and Oracle, create a submission record, and notify the coordinator."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the device."
            - name: packaging_level
              in: body
              type: string
              description: "The packaging level (unit, case, pallet)."
            - name: gtin
              in: body
              type: string
              description: "The Global Trade Item Number for the device."
          steps:
            - name: get-product
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{material_number}}"
            - name: get-packaging
              type: call
              call: "oracle-ebs.get-packaging"
              with:
                item_number: "{{material_number}}"
                packaging_level: "{{packaging_level}}"
            - name: create-submission
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_bsci_udi_submission"
                short_description: "UDI Registration — {{get-product.description}} — {{gtin}}"
                description: "GTIN: {{gtin}}. Material: {{material_number}}. Packaging: {{packaging_level}}. Quantity: {{get-packaging.quantity_per_package}}."
                assigned_group: "UDI_Coordination"
            - name: notify-coordinator
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "udi-coordination"
                text: "UDI submission {{create-submission.number}} created for {{get-product.description}} (GTIN: {{gtin}}). Packaging: {{packaging_level}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bsci-ebs.oraclecloud.com/webservices/rest/packaging/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: packaging
          path: "/configurations"
          inputParameters:
            - name: item_number
              in: query
            - name: packaging_level
              in: query
          operations:
            - name: get-packaging
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors inventory levels in Oracle E-Business Suite, triggers a replenishment purchase requisition in SAP when stock falls below reorder point, and notifies the supply chain planner in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Managed Inventory Replenishment"
  description: "Monitors inventory levels in Oracle E-Business Suite, triggers a replenishment purchase requisition in SAP when stock falls below reorder point, and notifies the supply chain planner in Microsoft Teams."
  tags:
    - supply-chain
    - vmi
    - oracle-e-business-suite
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vmi-replenishment
      port: 8080
      tools:
        - name: check-and-replenish
          description: "Given a material number and warehouse, check inventory level against reorder point and trigger replenishment if needed."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material/item number."
            - name: warehouse_code
              in: body
              type: string
              description: "The warehouse/organization code."
            - name: reorder_point
              in: body
              type: number
              description: "The minimum stock threshold for reorder."
          steps:
            - name: check-stock
              type: call
              call: "oracle-ebs.get-onhand"
              with:
                item_number: "{{material_number}}"
                organization_code: "{{warehouse_code}}"
            - name: create-requisition
              type: call
              call: "sap.create-purchase-req"
              with:
                material: "{{material_number}}"
                plant: "{{warehouse_code}}"
                quantity: "{{reorder_point}}"
                requisition_type: "VMI_AUTO"
            - name: notify-planner
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply-chain-planning"
                text: "VMI replenishment triggered: Material {{material_number}} at {{warehouse_code}}. On-hand: {{check-stock.quantity_on_hand}}. Reorder point: {{reorder_point}}. PR: {{create-requisition.pr_number}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bsci-ebs.oraclecloud.com/webservices/rest/inventory/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: onhand
          path: "/onhand"
          inputParameters:
            - name: item_number
              in: query
              parameterName: "ItemNumber"
            - name: organization_code
              in: query
              parameterName: "OrganizationCode"
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-purchase-req
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls vendor performance data from SAP, checks compliance status in ServiceNow, and generates an assessment report in Confluence.

naftiko: "0.5"
info:
  label: "Vendor Qualification Assessment Pipeline"
  description: "Pulls vendor performance data from SAP, checks compliance status in ServiceNow, and generates an assessment report in Confluence."
  tags:
    - supply-chain
    - vendor-qualification
    - sap
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: vendor-qualification
      port: 8080
      tools:
        - name: assess-vendor-qualification
          description: "Evaluate vendor qualification using SAP data, compliance checks, and generate report."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor number."
            - name: assessment_type
              in: body
              type: string
              description: "Type of assessment (initial, annual, for-cause)."
          steps:
            - name: get-vendor-data
              type: call
              call: "sap.get-vendor-performance"
              with:
                vendor_number: "{{vendor_number}}"
            - name: check-compliance
              type: call
              call: "servicenow.query-records"
              with:
                table: "x_bsci_vendor_compliance"
                query: "vendor={{vendor_number}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space: "VQA"
                title: "Vendor Assessment — {{vendor_number}} — {{assessment_type}}"
                content: "Performance score: {{get-vendor-data.score}}. Compliance status: {{check-compliance.status}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor-performance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bsci.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://bsci.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Compares physical inventory counts from Oracle EBS with SAP warehouse records and generates a discrepancy report in Google Sheets.

naftiko: "0.5"
info:
  label: "Warehouse Inventory Reconciliation Pipeline"
  description: "Compares physical inventory counts from Oracle EBS with SAP warehouse records and generates a discrepancy report in Google Sheets."
  tags:
    - supply-chain
    - inventory
    - oracle
    - sap
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: inventory-reconciliation
      port: 8080
      tools:
        - name: reconcile-inventory
          description: "Compare Oracle EBS and SAP inventory, then generate discrepancy report."
          inputParameters:
            - name: warehouse_code
              in: body
              type: string
              description: "Warehouse location code."
            - name: count_date
              in: body
              type: string
              description: "Physical count date in YYYY-MM-DD."
          steps:
            - name: get-oracle-counts
              type: call
              call: "oracle.get-physical-counts"
              with:
                warehouse_code: "{{warehouse_code}}"
                count_date: "{{count_date}}"
            - name: get-sap-inventory
              type: call
              call: "sap.get-warehouse-stock"
              with:
                warehouse_code: "{{warehouse_code}}"
            - name: create-report
              type: call
              call: "gsheets.create-spreadsheet"
              with:
                title: "Inventory Reconciliation — {{warehouse_code}} — {{count_date}}"
                data: "Oracle count: {{get-oracle-counts.total_items}}, SAP stock: {{get-sap-inventory.total_items}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://bsci-ebs.oracle.com/webservices/rest/inventory"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: counts
          path: "/physical_counts?warehouse={{warehouse_code}}&date={{count_date}}"
          inputParameters:
            - name: warehouse_code
              in: query
            - name: count_date
              in: query
          operations:
            - name: get-physical-counts
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bsci-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Plant eq '{{warehouse_code}}'"
          inputParameters:
            - name: warehouse_code
              in: query
          operations:
            - name: get-warehouse-stock
              method: GET
    - type: http
      namespace: gsheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: spreadsheets
          path: "/spreadsheets"
          operations:
            - name: create-spreadsheet
              method: POST

Retrieves employee profile data from Workday by worker ID, returning name, department, cost center, and manager. Used by HR and cross-functional teams at Boston Scientific.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile data from Workday by worker ID, returning name, department, cost center, and manager. Used by HR and cross-functional teams at Boston Scientific."
  tags:
    - hr
    - employee
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-employee
      port: 8080
      tools:
        - name: get-employee
          description: "Look up a Workday employee by worker ID. Returns full name, department, cost center, work email, and manager ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.descriptor"
            - name: department
              type: string
              mapping: "$.worker.primaryPosition.department"
            - name: cost_center
              type: string
              mapping: "$.worker.primaryPosition.costCenter"
            - name: work_email
              type: string
              mapping: "$.worker.emails[0].emailAddress"
  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

Retrieves open position details from Workday HCM by position ID, returning job title, department, and hiring manager.

naftiko: "0.5"
info:
  label: "Workday Position Details Lookup"
  description: "Retrieves open position details from Workday HCM by position ID, returning job title, department, and hiring manager."
  tags:
    - human-resources
    - recruitment
    - workday
capability:
  exposes:
    - type: mcp
      namespace: position-management
      port: 8080
      tools:
        - name: get-position
          description: "Look up a Workday position by position ID."
          inputParameters:
            - name: position_id
              in: body
              type: string
              description: "The Workday position ID."
          call: "workday.get-position"
          with:
            position_id: "{{position_id}}"
          outputParameters:
            - name: job_title
              type: string
              mapping: "$.Position.JobTitle"
            - name: department
              type: string
              mapping: "$.Position.Department"
            - name: hiring_manager
              type: string
              mapping: "$.Position.HiringManager"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://bsci.workday.com/api/staffing/v3"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: positions
          path: "/positions/{{position_id}}"
          inputParameters:
            - name: position_id
              in: path
          operations:
            - name: get-position
              method: GET