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