Roche Capabilities
Naftiko 0.5 capability definitions for Roche - 100 capabilities showing integration workflows and service orchestrations.
Handles Azure Data Factory pipeline failures by creating a ServiceNow incident and notifying the data engineering team for Roche.
naftiko: "0.5"
info:
label: "Azure Data Factory Pipeline Failure Handler"
description: "Handles Azure Data Factory pipeline failures by creating a ServiceNow incident and notifying the data engineering team for Roche."
tags:
- data-engineering
- azure-data-factory
- servicenow
- monitoring
capability:
exposes:
- type: mcp
namespace: data-engineering
port: 8080
tools:
- name: handle-adf-failure
description: "Given a pipeline run ID and failure details, create a ServiceNow incident and notify the team."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "The ADF pipeline name."
- name: run_id
in: body
type: string
description: "The pipeline run ID."
- name: error_message
in: body
type: string
description: "The error message from the failed run."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "ADF Pipeline Failure: {{pipeline_name}}"
description: "Pipeline: {{pipeline_name}} | Run: {{run_id}} | Error: {{error_message}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.data_eng_channel"
text: "ADF Pipeline FAILURE: {{pipeline_name}} (Run: {{run_id}}). Error: {{error_message}}. SNOW: {{create-incident.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the latest build status from Azure DevOps for a given pipeline in Roche CI/CD operations.
naftiko: "0.5"
info:
label: "Azure DevOps Build Status Lookup"
description: "Retrieves the latest build status from Azure DevOps for a given pipeline in Roche CI/CD operations."
tags:
- devops
- azure-devops
- ci-cd
- lookup
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: get-build-status
description: "Given a pipeline ID, return the latest build result, status, and build number."
inputParameters:
- name: pipeline_id
in: body
type: string
description: "The Azure DevOps pipeline definition ID."
call: azdo.get-latest-build
with:
pipeline_id: "{{pipeline_id}}"
outputParameters:
- name: build_number
type: string
mapping: "$.value[0].buildNumber"
- name: result
type: string
mapping: "$.value[0].result"
- name: status
type: string
mapping: "$.value[0].status"
consumes:
- type: http
namespace: azdo
baseUri: "https://dev.azure.com/roche"
authentication:
type: bearer
token: "$secrets.azuredevops_token"
resources:
- name: builds
path: "/_apis/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
inputParameters:
- name: pipeline_id
in: query
operations:
- name: get-latest-build
method: GET
Orchestrates the clinical database lock process by verifying data completeness in Snowflake, updating status in Veeva Vault, and notifying stakeholders for Roche.
naftiko: "0.5"
info:
label: "Clinical Data Lock Orchestrator"
description: "Orchestrates the clinical database lock process by verifying data completeness in Snowflake, updating status in Veeva Vault, and notifying stakeholders for Roche."
tags:
- clinical-trials
- data-management
- snowflake
- veeva-vault
capability:
exposes:
- type: mcp
namespace: clinical-data-mgmt
port: 8080
tools:
- name: execute-data-lock
description: "Given a study ID and database identifier, verify completeness, update lock status, and notify the team."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: database_id
in: body
type: string
description: "The clinical database identifier."
- name: lock_type
in: body
type: string
description: "Lock type (soft-lock, hard-lock)."
steps:
- name: verify-completeness
type: call
call: snowflake.execute-query
with:
statement: "SELECT COUNT(*) as open_queries FROM data_queries WHERE study_id = '{{study_id}}' AND status = 'Open'"
warehouse: "CLINICAL_WH"
- name: update-vault-status
type: call
call: veeva.update-object-record
with:
object_type: "study_database__c"
id: "{{database_id}}"
lock_status__c: "{{lock_type}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cdm_channel"
text: "Database Lock: Study {{study_id}} — {{lock_type}} initiated. Open queries: {{verify-completeness.data}}. Vault updated."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Reconciles clinical data between Veeva Vault and Snowflake, logs discrepancies in Jira, and alerts the data management team for Roche.
naftiko: "0.5"
info:
label: "Clinical Data Reconciliation Checker"
description: "Reconciles clinical data between Veeva Vault and Snowflake, logs discrepancies in Jira, and alerts the data management team for Roche."
tags:
- clinical-trials
- data-management
- veeva-vault
- snowflake
capability:
exposes:
- type: mcp
namespace: clinical-data-quality
port: 8080
tools:
- name: reconcile-clinical-data
description: "Given a study ID, compare record counts between Veeva Vault and Snowflake and report discrepancies."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: data_domain
in: body
type: string
description: "Data domain to reconcile (demographics, adverse-events, labs)."
steps:
- name: query-vault
type: call
call: veeva.query-submissions
with:
query: "SELECT COUNT(*) FROM {{data_domain}}__c WHERE study_id__c = '{{study_id}}'"
- name: query-snowflake
type: call
call: snowflake.execute-query
with:
statement: "SELECT COUNT(*) as cnt FROM {{data_domain}} WHERE study_id = '{{study_id}}'"
warehouse: "CLINICAL_WH"
- name: log-discrepancy
type: call
call: jira.create-issue
with:
project: "CDM"
summary: "Data Reconciliation: {{study_id}} — {{data_domain}}"
issuetype: "Bug"
- name: alert-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cdm_channel"
text: "Data Reconciliation for Study {{study_id}} ({{data_domain}}): Vault={{query-vault.totalCount}}, Snowflake={{query-snowflake.data}}. Jira: {{log-discrepancy.key}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks IRB approval status for clinical sites by querying Veeva Vault, updating Jira, and notifying the regulatory team for Roche.
naftiko: "0.5"
info:
label: "Clinical IRB Approval Tracking Orchestrator"
description: "Tracks IRB approval status for clinical sites by querying Veeva Vault, updating Jira, and notifying the regulatory team for Roche."
tags:
- clinical-trials
- regulatory
- veeva-vault
- jira
capability:
exposes:
- type: mcp
namespace: clinical-regulatory
port: 8080
tools:
- name: track-irb-approvals
description: "Given a study ID, check IRB approval status across sites, update tracking, and notify the team."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: region
in: body
type: string
description: "The geographic region to check."
steps:
- name: query-irb-status
type: call
call: veeva.query-submissions
with:
query: "SELECT site_id__c, irb_status__c FROM irb_submission__c WHERE study_id__c = '{{study_id}}' AND region__c = '{{region}}'"
- name: update-tracker
type: call
call: jira.create-issue
with:
project: "REG"
summary: "IRB Status Update: Study {{study_id}} — {{region}}"
issuetype: "Task"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.regulatory_channel"
text: "IRB Approval Status for Study {{study_id}} ({{region}}): {{query-irb-status.totalCount}} sites tracked. Jira: {{update-tracker.key}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: query
path: "/query"
operations:
- name: query-submissions
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes clinical protocol amendments by updating Veeva Vault, creating Jira tracking tasks, and notifying the clinical team for Roche.
naftiko: "0.5"
info:
label: "Clinical Protocol Amendment Processor"
description: "Processes clinical protocol amendments by updating Veeva Vault, creating Jira tracking tasks, and notifying the clinical team for Roche."
tags:
- clinical-trials
- veeva-vault
- jira
- regulatory
capability:
exposes:
- type: mcp
namespace: clinical-regulatory
port: 8080
tools:
- name: process-protocol-amendment
description: "Given protocol amendment details, update the document in Veeva Vault, create a Jira task, and notify affected teams."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: amendment_number
in: body
type: string
description: "The amendment version number."
- name: amendment_summary
in: body
type: string
description: "Summary of protocol changes."
- name: impacted_sites
in: body
type: string
description: "Comma-separated list of impacted site IDs."
steps:
- name: update-vault
type: call
call: veeva.create-object-record
with:
object_type: "protocol_amendment__c"
study_id__c: "{{study_id}}"
amendment_number__c: "{{amendment_number}}"
- name: create-jira-task
type: call
call: jira.create-issue
with:
project: "CLIN"
summary: "Protocol Amendment {{amendment_number}} for Study {{study_id}}"
issuetype: "Task"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.clinical_ops_channel"
text: "Protocol Amendment {{amendment_number}} for Study {{study_id}} processed. Impacted sites: {{impacted_sites}}. Jira: {{create-jira-task.key}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes Suspected Unexpected Serious Adverse Reactions by logging in Veeva Vault, creating urgent ServiceNow cases, and alerting the DSMB for Roche.
naftiko: "0.5"
info:
label: "Clinical Safety Reporting SUSAR Handler"
description: "Processes Suspected Unexpected Serious Adverse Reactions by logging in Veeva Vault, creating urgent ServiceNow cases, and alerting the DSMB for Roche."
tags:
- drug-safety
- clinical-trials
- veeva-vault
- regulatory
capability:
exposes:
- type: mcp
namespace: clinical-safety
port: 8080
tools:
- name: process-susar
description: "Given SUSAR details, log in Veeva Vault, create an urgent ServiceNow case, and alert the DSMB."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: patient_id
in: body
type: string
description: "Anonymized patient identifier."
- name: event_term
in: body
type: string
description: "The adverse event MedDRA preferred term."
- name: seriousness_criteria
in: body
type: string
description: "Seriousness criteria met."
steps:
- name: log-in-vault
type: call
call: veeva.create-object-record
with:
object_type: "safety_case__c"
study_id__c: "{{study_id}}"
patient_id__c: "{{patient_id}}"
event_term__c: "{{event_term}}"
- name: create-urgent-case
type: call
call: servicenow.create-incident
with:
short_description: "SUSAR: {{event_term}} — Study {{study_id}}"
priority: "1"
- name: alert-dsmb
type: call
call: msteams.send-message
with:
channel_id: "$secrets.dsmb_channel"
text: "URGENT SUSAR: {{event_term}} in Study {{study_id}} (Patient {{patient_id}}). Seriousness: {{seriousness_criteria}}. Vault: {{log-in-vault.id}}. SNOW: {{create-urgent-case.number}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates monitoring visit schedules in Veeva Vault, assigns tasks in Jira, and notifies the CRA team for Roche.
naftiko: "0.5"
info:
label: "Clinical Site Monitoring Visit Scheduler"
description: "Creates monitoring visit schedules in Veeva Vault, assigns tasks in Jira, and notifies the CRA team for Roche."
tags:
- clinical-trials
- veeva-vault
- jira
- scheduling
capability:
exposes:
- type: mcp
namespace: clinical-monitoring
port: 8080
tools:
- name: schedule-monitoring-visit
description: "Given site and visit details, create a Veeva Vault record, a Jira task, and a Teams notification."
inputParameters:
- name: site_id
in: body
type: string
description: "The clinical site identifier."
- name: visit_type
in: body
type: string
description: "Type of monitoring visit (routine, for-cause, closeout)."
- name: visit_date
in: body
type: string
description: "Scheduled date for the visit."
- name: cra_name
in: body
type: string
description: "Name of the assigned CRA."
steps:
- name: create-vault-record
type: call
call: veeva.create-object-record
with:
object_type: "monitoring_visit__c"
site_id__c: "{{site_id}}"
visit_type__c: "{{visit_type}}"
visit_date__c: "{{visit_date}}"
- name: create-jira-task
type: call
call: jira.create-issue
with:
project: "CLIN"
summary: "Monitoring Visit: {{visit_type}} at Site {{site_id}} on {{visit_date}}"
issuetype: "Task"
- name: notify-cra-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cra_channel"
text: "New {{visit_type}} monitoring visit at Site {{site_id}} on {{visit_date}}. CRA: {{cra_name}}. Jira: {{create-jira-task.key}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks clinical study budgets by pulling actuals from SAP, comparing to plan in Snowflake, and notifying finance for Roche.
naftiko: "0.5"
info:
label: "Clinical Study Budget Tracker"
description: "Tracks clinical study budgets by pulling actuals from SAP, comparing to plan in Snowflake, and notifying finance for Roche."
tags:
- clinical-trials
- finance
- sap
- snowflake
capability:
exposes:
- type: mcp
namespace: clinical-finance
port: 8080
tools:
- name: track-study-budget
description: "Given a study ID and fiscal period, pull actuals from SAP, compare to budget, and alert on variances."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: fiscal_period
in: body
type: string
description: "The fiscal period to analyze."
steps:
- name: get-actuals
type: call
call: sap.get-cost-report
with:
study_id: "{{study_id}}"
period: "{{fiscal_period}}"
- name: get-budget
type: call
call: snowflake.execute-query
with:
statement: "SELECT budget_amount, study_id FROM clinical_budgets WHERE study_id = '{{study_id}}' AND period = '{{fiscal_period}}'"
warehouse: "FINANCE_WH"
- name: notify-finance
type: call
call: msteams.send-message
with:
channel_id: "$secrets.clinical_finance_channel"
text: "Study Budget Alert: {{study_id}} for {{fiscal_period}}. Actuals: {{get-actuals.total}}. Budget: {{get-budget.data}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: get-record
method: GET
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Snowflake for current enrollment figures by study, generates a summary, and posts to the clinical operations Teams channel for Roche.
naftiko: "0.5"
info:
label: "Clinical Trial Enrollment Status Reporter"
description: "Queries Snowflake for current enrollment figures by study, generates a summary, and posts to the clinical operations Teams channel for Roche."
tags:
- clinical-trials
- snowflake
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: report-enrollment-status
description: "Given a study ID, query enrollment data, format a summary, and post to the designated Teams channel."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study protocol number."
- name: teams_channel_id
in: body
type: string
description: "Teams channel ID for clinical operations."
steps:
- name: query-enrollment
type: call
call: snowflake.execute-query
with:
statement: "SELECT site_id, enrolled_count, target FROM enrollment_tracker WHERE study_id = '{{study_id}}'"
warehouse: "CLINICAL_WH"
- name: post-summary
type: call
call: msteams.send-message
with:
channel_id: "{{teams_channel_id}}"
text: "Enrollment Status for Study {{study_id}}: {{query-enrollment.data}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Handles cold chain temperature excursions by logging in SAP, creating a quality incident, and alerting logistics and quality teams for Roche.
naftiko: "0.5"
info:
label: "Cold Chain Temperature Excursion Handler"
description: "Handles cold chain temperature excursions by logging in SAP, creating a quality incident, and alerting logistics and quality teams for Roche."
tags:
- supply-chain
- cold-chain
- quality
- sap
capability:
exposes:
- type: mcp
namespace: cold-chain-ops
port: 8080
tools:
- name: handle-temp-excursion
description: "Given temperature excursion details, log in SAP, create a ServiceNow quality incident, and alert teams."
inputParameters:
- name: shipment_id
in: body
type: string
description: "The shipment identifier."
- name: product_name
in: body
type: string
description: "The product being shipped."
- name: temperature_reading
in: body
type: string
description: "The temperature reading."
- name: acceptable_range
in: body
type: string
description: "The acceptable temperature range."
- name: duration_minutes
in: body
type: integer
description: "Duration of excursion in minutes."
steps:
- name: log-sap-excursion
type: call
call: sap.create-quality-notification
with:
notification_type: "Q2"
description: "Cold Chain Excursion: Shipment {{shipment_id}}, Product {{product_name}}, Temp {{temperature_reading}}"
- name: create-quality-incident
type: call
call: servicenow.create-incident
with:
short_description: "Cold Chain Excursion: {{product_name}} — Shipment {{shipment_id}}"
priority: "2"
- name: alert-teams
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cold_chain_channel"
text: "COLD CHAIN ALERT: Temp excursion for {{product_name}} (Shipment {{shipment_id}}). Reading: {{temperature_reading}} (range: {{acceptable_range}}). SAP: {{log-sap-excursion.notification_number}}. SNOW: {{create-quality-incident.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Searches Roche Confluence knowledge base for regulatory guidance documents by keyword.
naftiko: "0.5"
info:
label: "Confluence Regulatory Knowledge Search"
description: "Searches Roche Confluence knowledge base for regulatory guidance documents by keyword."
tags:
- regulatory
- confluence
- knowledge-management
- search
capability:
exposes:
- type: mcp
namespace: regulatory-kb
port: 8080
tools:
- name: search-regulatory-docs
description: "Given a search query, return matching Confluence pages with titles, space keys, and URLs."
inputParameters:
- name: search_query
in: body
type: string
description: "The search query for regulatory guidance documents."
call: confluence.search-content
with:
search_query: "{{search_query}}"
outputParameters:
- name: results
type: array
mapping: "$.results"
- name: total_size
type: integer
mapping: "$.totalSize"
consumes:
- type: http
namespace: confluence
baseUri: "https://roche.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: search
path: "/content/search?cql=text~'{{search_query}}'"
inputParameters:
- name: search_query
in: query
operations:
- name: search-content
method: GET
Orchestrates ML model deployment by promoting a model in Databricks, updating the model registry, and notifying the data science team for Roche.
naftiko: "0.5"
info:
label: "Databricks ML Model Deployment Pipeline"
description: "Orchestrates ML model deployment by promoting a model in Databricks, updating the model registry, and notifying the data science team for Roche."
tags:
- r-and-d
- databricks
- machine-learning
- deployment
capability:
exposes:
- type: mcp
namespace: rd-ml-ops
port: 8080
tools:
- name: deploy-ml-model
description: "Given a model name and version, promote in Databricks MLflow, register in the model registry, and notify the team."
inputParameters:
- name: model_name
in: body
type: string
description: "The MLflow model name."
- name: model_version
in: body
type: string
description: "The model version to promote."
- name: target_stage
in: body
type: string
description: "Target stage (Staging, Production)."
steps:
- name: promote-model
type: call
call: databricks.transition-model-stage
with:
name: "{{model_name}}"
version: "{{model_version}}"
stage: "{{target_stage}}"
- name: log-deployment
type: call
call: servicenow.create-incident
with:
short_description: "ML Model Deployment: {{model_name}} v{{model_version}} to {{target_stage}}"
category: "ml_ops"
- name: notify-ds-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.data_science_channel"
text: "ML Model Deployed: {{model_name}} v{{model_version}} promoted to {{target_stage}}. SNOW: {{log-deployment.number}}."
consumes:
- type: http
namespace: databricks
baseUri: "https://roche.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: model-versions
path: "/mlflow/model-versions/transition-stage"
operations:
- name: transition-model-stage
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a Datadog monitor fires for a critical Roche production or laboratory information system, automatically creates a ServiceNow incident with full alert metadata.
naftiko: "0.5"
info:
label: "Datadog Alert to ServiceNow Incident Bridge"
description: "When a Datadog monitor fires for a critical Roche production or laboratory information system, automatically creates a ServiceNow incident with full alert metadata."
tags:
- observability
- monitoring
- datadog
- servicenow
- incident-response
capability:
exposes:
- type: mcp
namespace: alert-incident-bridge
port: 8080
tools:
- name: bridge-alert-to-incident
description: "Given a Datadog monitor ID and severity, create a ServiceNow incident pre-populated with monitor name, query, and alert severity for Roche production systems."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID that triggered the alert."
- name: alert_severity
in: body
type: string
description: "Severity of the alert: critical, warning, or no_data."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-incident
type: call
call: "servicenow.create-from-alert"
with:
short_description: "Datadog alert: {{get-monitor.name}}"
description: "Monitor: {{get-monitor.name}}\nSeverity: {{alert_severity}}\nQuery: {{get-monitor.query}}"
urgency: "2"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.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-from-alert
method: POST
Monitors Datadog SLOs for Roche's diagnostics instrument platform APIs and opens a ServiceNow incident when service health thresholds are breached.
naftiko: "0.5"
info:
label: "Datadog Diagnostics Platform Service Health Monitor"
description: "Monitors Datadog SLOs for Roche's diagnostics instrument platform APIs and opens a ServiceNow incident when service health thresholds are breached."
tags:
- observability
- monitoring
- datadog
- servicenow
- incident-response
- diagnostics
capability:
exposes:
- type: mcp
namespace: diagnostics-monitoring
port: 8080
tools:
- name: check-diagnostics-platform-health
description: "Given a Datadog service name and SLO ID for a diagnostics platform service, check SLO compliance and create a ServiceNow P1 incident if the error budget is exhausted."
inputParameters:
- name: service_name
in: body
type: string
description: "The Datadog service name for the diagnostics platform."
- name: slo_id
in: body
type: string
description: "The Datadog SLO ID to evaluate."
steps:
- name: get-slo
type: call
call: "datadog.get-slo"
with:
slo_id: "{{slo_id}}"
- name: create-incident
type: call
call: "servicenow.create-p1-incident"
with:
short_description: "SLO breach: {{service_name}}"
description: "SLO {{slo_id}} compliance: {{get-slo.compliance}}. Error budget: {{get-slo.error_budget_remaining}}."
urgency: "1"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo/{{slo_id}}"
inputParameters:
- name: slo_id
in: path
operations:
- name: get-slo
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.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-p1-incident
method: POST
Detects cloud infrastructure cost anomalies in Datadog and opens a ServiceNow investigation while alerting the global FinOps team in Teams.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Cost Anomaly Responder"
description: "Detects cloud infrastructure cost anomalies in Datadog and opens a ServiceNow investigation while alerting the global FinOps team in Teams."
tags:
- cloud
- finops
- datadog
- servicenow
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: global-finops
port: 8080
tools:
- name: respond-to-cost-anomaly
description: "Given a Datadog cost metric query and spend threshold, detect anomalous cloud infrastructure spending and create a ServiceNow investigation ticket with spend details."
inputParameters:
- name: metric_query
in: body
type: string
description: "Datadog metric query string for cloud infrastructure cost."
- name: threshold_usd
in: body
type: number
description: "Spend threshold in USD above which an anomaly is flagged."
steps:
- name: query-spend
type: call
call: "datadog.query-metrics"
with:
query: "{{metric_query}}"
- name: create-investigation
type: call
call: "servicenow.create-cost-ticket"
with:
short_description: "Cloud cost anomaly: spend exceeds ${{threshold_usd}}"
description: "Current spend: {{query-spend.value}}. Threshold: {{threshold_usd}}."
- name: alert-finops
type: call
call: "msteams.post-finops-alert"
with:
channel_id: "global-finops"
message: "Cost anomaly: {{query-spend.value}} exceeds ${{threshold_usd}}. ServiceNow: {{create-investigation.number}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: metrics-query
path: "/query"
operations:
- name: query-metrics
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.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-cost-ticket
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-finops-alert
method: POST
Retrieves the current health status of a monitored service from Datadog for Roche SRE operations.
naftiko: "0.5"
info:
label: "Datadog Service Health Check"
description: "Retrieves the current health status of a monitored service from Datadog for Roche SRE operations."
tags:
- monitoring
- datadog
- sre
- health-check
capability:
exposes:
- type: mcp
namespace: sre-ops
port: 8080
tools:
- name: get-service-health
description: "Given a service name, return the overall status, number of active monitors, and last check time."
inputParameters:
- name: service_name
in: body
type: string
description: "The Datadog service name."
call: datadog.get-service-status
with:
service_name: "{{service_name}}"
outputParameters:
- name: overall_status
type: string
mapping: "$.overall_status"
- name: active_monitors
type: integer
mapping: "$.counts.total"
- name: last_triggered
type: string
mapping: "$.last_triggered_ts"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/search?query=service:{{service_name}}"
inputParameters:
- name: service_name
in: query
operations:
- name: get-service-status
method: GET
Initiates periodic SOP review cycles by identifying documents due for review in Veeva Vault, creating Jira tasks, and notifying owners for Roche.
naftiko: "0.5"
info:
label: "Document Control SOP Review Cycle Initiator"
description: "Initiates periodic SOP review cycles by identifying documents due for review in Veeva Vault, creating Jira tasks, and notifying owners for Roche."
tags:
- quality
- document-control
- veeva-vault
- jira
capability:
exposes:
- type: mcp
namespace: doc-control
port: 8080
tools:
- name: initiate-sop-review-cycle
description: "Given a document category and review period, find SOPs due for review, create tracking tasks, and notify owners."
inputParameters:
- name: document_category
in: body
type: string
description: "The SOP document category (manufacturing, QC, clinical)."
- name: review_due_days
in: body
type: integer
description: "Days until review due date to include."
steps:
- name: find-docs-due
type: call
call: veeva.query-submissions
with:
query: "SELECT id, name__v FROM documents WHERE category__c = '{{document_category}}'"
- name: create-jira-tasks
type: call
call: jira.create-issue
with:
project: "QMS"
summary: "SOP Review Cycle: {{document_category}} — {{find-docs-due.totalCount}} documents"
issuetype: "Task"
- name: notify-owners
type: call
call: msteams.send-message
with:
channel_id: "$secrets.doc_control_channel"
text: "SOP Review Cycle: {{find-docs-due.totalCount}} {{document_category}} documents due within {{review_due_days}} days. Jira: {{create-jira-tasks.key}}."
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Receives an adverse event report, creates a pharmacovigilance case in ServiceNow, and notifies the drug safety team via Teams for Roche.
naftiko: "0.5"
info:
label: "Drug Safety Adverse Event Report Processor"
description: "Receives an adverse event report, creates a pharmacovigilance case in ServiceNow, and notifies the drug safety team via Teams for Roche."
tags:
- drug-safety
- pharmacovigilance
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: drug-safety
port: 8080
tools:
- name: process-adverse-event
description: "Given adverse event details, create a PV case in ServiceNow and send an urgent notification to the drug safety officer."
inputParameters:
- name: patient_id
in: body
type: string
description: "Anonymized patient identifier."
- name: product_name
in: body
type: string
description: "The drug product name."
- name: event_description
in: body
type: string
description: "Description of the adverse event."
- name: severity
in: body
type: string
description: "Severity classification (mild, moderate, severe, life-threatening)."
steps:
- name: create-pv-case
type: call
call: servicenow.create-incident
with:
short_description: "AE Report: {{product_name}} — {{severity}}"
category: "pharmacovigilance"
description: "Patient: {{patient_id}} | Product: {{product_name}} | Event: {{event_description}} | Severity: {{severity}}"
- name: notify-safety-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.drug_safety_channel"
text: "URGENT: New {{severity}} AE for {{product_name}}. Case: {{create-pv-case.number}}. Patient: {{patient_id}}. Review required within 24 hours."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When an employee departure is confirmed in Workday, revokes Microsoft 365 access, suspends Okta account, closes open ServiceNow tickets, and reassigns Salesforce records.
naftiko: "0.5"
info:
label: "Employee Offboarding and Access Revocation"
description: "When an employee departure is confirmed in Workday, revokes Microsoft 365 access, suspends Okta account, closes open ServiceNow tickets, and reassigns Salesforce records."
tags:
- hr
- offboarding
- workday
- okta
- microsoft-graph
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, revoke Microsoft 365 access, suspend Okta account, create a ServiceNow offboarding record, and reassign Salesforce account ownership."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "Employee termination date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: disable-m365
type: call
call: "msgraph.disable-user"
with:
user_id: "{{get-employee.azure_object_id}}"
- name: suspend-okta
type: call
call: "okta.suspend-user"
with:
user_id: "{{get-employee.okta_user_id}}"
- name: create-offboarding-record
type: call
call: "servicenow.create-offboarding"
with:
short_description: "Employee offboarding: {{get-employee.full_name}}"
description: "Termination date: {{termination_date}}. All access revoked."
category: "hr_offboarding"
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: "/roche/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: okta
baseUri: "https://roche.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: user-lifecycle
path: "/users/{{user_id}}/lifecycle/suspend"
inputParameters:
- name: user_id
in: path
operations:
- name: suspend-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.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-offboarding
method: POST
When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph, and sends a Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account via Graph, and sends a Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
- microsoft-graph
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence across ServiceNow, Microsoft Graph, and Microsoft Teams."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: "hr_onboarding"
assigned_to: "IT_Onboarding"
- name: provision-account
type: call
call: "msgraph.create-user"
with:
displayName: "{{get-employee.full_name}}"
mail: "{{get-employee.work_email}}"
department: "{{get-employee.department}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient: "{{get-employee.work_email}}"
message: "Welcome to Roche, {{get-employee.first_name}}! Your IT ticket is {{create-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/roche/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-message
method: POST
Processes environmental monitoring excursions in manufacturing by logging in SAP QM, creating a ServiceNow incident, and alerting quality for Roche.
naftiko: "0.5"
info:
label: "Environmental Monitoring Alert Handler"
description: "Processes environmental monitoring excursions in manufacturing by logging in SAP QM, creating a ServiceNow incident, and alerting quality for Roche."
tags:
- manufacturing
- quality
- sap
- environmental-monitoring
capability:
exposes:
- type: mcp
namespace: manufacturing-em
port: 8080
tools:
- name: handle-em-excursion
description: "Given environmental excursion details, log a quality notification in SAP, create a ServiceNow incident, and alert quality."
inputParameters:
- name: area_name
in: body
type: string
description: "The monitored area name."
- name: parameter
in: body
type: string
description: "The environmental parameter."
- name: reading
in: body
type: string
description: "The actual reading value."
- name: limit
in: body
type: string
description: "The acceptable limit value."
- name: plant
in: body
type: string
description: "The plant code."
steps:
- name: log-sap-qn
type: call
call: sap.create-quality-notification
with:
notification_type: "Q2"
description: "EM Excursion: {{area_name}} — {{parameter}} reading {{reading}} exceeds limit {{limit}}"
plant: "{{plant}}"
- name: create-snow-incident
type: call
call: servicenow.create-incident
with:
short_description: "EM Excursion: {{area_name}} — {{parameter}}"
category: "environmental_monitoring"
- name: alert-quality
type: call
call: msteams.send-message
with:
channel_id: "$secrets.em_quality_channel"
text: "EM ALERT: {{parameter}} excursion in {{area_name}} at Plant {{plant}}. Reading: {{reading}} (limit: {{limit}}). SAP QN: {{log-sap-qn.notification_number}}. SNOW: {{create-snow-incident.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates FDA inspection readiness checklists by pulling SOPs from SharePoint, checking training compliance in Workday, and creating Jira tracking for Roche.
naftiko: "0.5"
info:
label: "FDA Inspection Readiness Checklist Generator"
description: "Generates FDA inspection readiness checklists by pulling SOPs from SharePoint, checking training compliance in Workday, and creating Jira tracking for Roche."
tags:
- regulatory
- compliance
- sharepoint
- workday
capability:
exposes:
- type: mcp
namespace: regulatory-compliance
port: 8080
tools:
- name: generate-inspection-checklist
description: "Given a facility and inspection type, compile SOP readiness, training status, and create tracking tasks."
inputParameters:
- name: facility_name
in: body
type: string
description: "The facility being inspected."
- name: inspection_type
in: body
type: string
description: "Type of FDA inspection (pre-approval, routine, for-cause)."
steps:
- name: check-sops
type: call
call: sharepoint.get-document-list
with:
library: "SOPs"
filter: "facility eq '{{facility_name}}'"
- name: check-training
type: call
call: workday.get-training-compliance
with:
facility: "{{facility_name}}"
program: "GMP_Training"
- name: create-epic
type: call
call: jira.create-issue
with:
project: "REG"
summary: "FDA Inspection Readiness: {{facility_name}} — {{inspection_type}}"
issuetype: "Epic"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.quality_compliance_channel"
text: "FDA Inspection Readiness for {{facility_name}} ({{inspection_type}}): {{check-sops.count}} SOPs, {{check-training.compliance_rate}}% training compliant. Jira: {{create-epic.key}}."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://roche.sharepoint.com/_api/web"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: lists
path: "/lists"
operations:
- name: get-document-list
method: GET
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Learning/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/learningAssignments"
operations:
- name: get-training-compliance
method: GET
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers GxP validation pipelines in GitHub Actions, logs validation events in ServiceNow, and notifies the QA team for Roche.
naftiko: "0.5"
info:
label: "GitHub Actions GxP Validation Pipeline Trigger"
description: "Triggers GxP validation pipelines in GitHub Actions, logs validation events in ServiceNow, and notifies the QA team for Roche."
tags:
- devops
- github-actions
- gxp
- validation
capability:
exposes:
- type: mcp
namespace: gxp-devops
port: 8080
tools:
- name: trigger-gxp-validation
description: "Given a system name and validation type, trigger the pipeline, log in ServiceNow, and notify QA."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name."
- name: validation_type
in: body
type: string
description: "Type of validation (IQ, OQ, PQ)."
- name: system_name
in: body
type: string
description: "The GxP system being validated."
steps:
- name: trigger-pipeline
type: call
call: github.trigger-workflow
with:
repo: "{{repo_name}}"
workflow: "gxp-validation.yml"
- name: log-validation
type: call
call: servicenow.create-incident
with:
short_description: "GxP Validation: {{validation_type}} — {{system_name}}"
category: "gxp_validation"
- name: notify-qa
type: call
call: msteams.send-message
with:
channel_id: "$secrets.gxp_qa_channel"
text: "GxP Validation triggered: {{validation_type}} for {{system_name}}. Repo: {{repo_name}}. SNOW: {{log-validation.number}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflows
path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, records a Datadog deployment event, and alerts the global engineering team in Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Handler"
description: "When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, records a Datadog deployment event, and alerts the global engineering team in Teams."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions pipeline failure, create a Jira bug, record a Datadog deployment failure event, and alert the engineering Teams channel with full context."
inputParameters:
- name: repository
in: body
type: string
description: "The GitHub repository in owner/repo format."
- name: branch
in: body
type: string
description: "The branch name where the pipeline failed."
- name: run_id
in: body
type: string
description: "The GitHub Actions run ID for the failed pipeline."
- name: commit_sha
in: body
type: string
description: "The commit SHA that triggered the pipeline."
steps:
- name: get-run
type: call
call: "github.get-workflow-run"
with:
repository: "{{repository}}"
run_id: "{{run_id}}"
- name: create-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repository}} / {{branch}}"
description: "Run: {{run_id}}\nCommit: {{commit_sha}}\nURL: {{get-run.html_url}}"
- name: record-event
type: call
call: "datadog.create-event"
with:
title: "CI failure: {{repository}} {{branch}}"
text: "Commit {{commit_sha}} pipeline failure. Jira: {{create-bug.key}}"
alert_type: "error"
- name: alert-team
type: call
call: "msteams.post-alert"
with:
channel_id: "engineering-alerts"
message: "CI Failure in {{repository}} on {{branch}}. Jira: {{create-bug.key}}. Run: {{get-run.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/{{repository}}/actions/runs/{{run_id}}"
inputParameters:
- name: repository
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: jira
baseUri: "https://roche.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: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-alert
method: POST
When a new GitHub release is tagged in a digital health or diagnostics repository, fetches release details and posts an announcement to the product engineering Teams channel.
naftiko: "0.5"
info:
label: "GitHub Release Notes Publisher"
description: "When a new GitHub release is tagged in a digital health or diagnostics repository, fetches release details and posts an announcement to the product engineering Teams channel."
tags:
- devops
- engineering
- github
- microsoft-teams
- release-management
capability:
exposes:
- type: mcp
namespace: release-management
port: 8080
tools:
- name: publish-release-notes
description: "Given a GitHub repository and release tag, fetch the release details and post a formatted release announcement to the product engineering Teams channel."
inputParameters:
- name: repository
in: body
type: string
description: "The GitHub repository in owner/repo format."
- name: release_tag
in: body
type: string
description: "The release tag name (e.g., v5.1.0)."
steps:
- name: get-release
type: call
call: "github.get-release-by-tag"
with:
repository: "{{repository}}"
tag: "{{release_tag}}"
- name: post-announcement
type: call
call: "msteams.post-release-announcement"
with:
channel_id: "product-engineering"
message: "Release {{release_tag}} published for {{repository}}: {{get-release.name}}. {{get-release.body}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: releases
path: "/repos/{{repository}}/releases/tags/{{tag}}"
inputParameters:
- name: repository
in: path
- name: tag
in: path
operations:
- name: get-release-by-tag
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-release-announcement
method: POST
Checks a GitHub repository for branch protection rules and required status checks for Roche DevSecOps compliance.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks a GitHub repository for branch protection rules and required status checks for Roche DevSecOps compliance."
tags:
- devops
- github
- compliance
- security
capability:
exposes:
- type: mcp
namespace: devsecops
port: 8080
tools:
- name: check-repo-compliance
description: "Given a repository name, return branch protection status, required reviews count, and CODEOWNERS presence."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name (org/repo format)."
call: github.get-branch-protection
with:
repo_name: "{{repo_name}}"
outputParameters:
- name: protection_enabled
type: boolean
mapping: "$.enabled"
- name: required_reviews
type: integer
mapping: "$.required_pull_request_reviews.required_approving_review_count"
- name: enforce_admins
type: boolean
mapping: "$.enforce_admins.enabled"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/{{repo_name}}/branches/main/protection"
inputParameters:
- name: repo_name
in: path
operations:
- name: get-branch-protection
method: GET
When a GitHub Dependabot alert is raised in a Roche repository, creates a Jira security ticket and notifies the global information security team in Teams.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Triage"
description: "When a GitHub Dependabot alert is raised in a Roche repository, creates a Jira security ticket and notifies the global information security team in Teams."
tags:
- security
- devops
- github
- jira
- microsoft-teams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-vuln-triage
port: 8080
tools:
- name: triage-dependabot-alert
description: "Given a GitHub Dependabot alert and repository, create a Jira security ticket with CVE and severity details, and notify the global information security team in Teams."
inputParameters:
- name: repository
in: body
type: string
description: "The GitHub repository in owner/repo format."
- name: alert_number
in: body
type: integer
description: "The Dependabot alert number."
steps:
- name: get-alert
type: call
call: "github.get-dependabot-alert"
with:
repository: "{{repository}}"
alert_number: "{{alert_number}}"
- name: create-sec-ticket
type: call
call: "jira.create-security-issue"
with:
project_key: "GISO"
issuetype: "Security"
summary: "[Vuln] {{get-alert.dependency_name}} in {{repository}}"
description: "CVE: {{get-alert.cve_id}}\nSeverity: {{get-alert.severity}}\nPackage: {{get-alert.dependency_name}}"
- name: notify-giso
type: call
call: "msteams.post-security-notice"
with:
channel_id: "global-information-security"
message: "Vulnerability {{get-alert.cve_id}} ({{get-alert.severity}}) in {{repository}}. Jira: {{create-sec-ticket.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repository}}/dependabot/alerts/{{alert_number}}"
inputParameters:
- name: repository
in: path
- name: alert_number
in: path
operations:
- name: get-dependabot-alert
method: GET
- type: http
namespace: jira
baseUri: "https://roche.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-security-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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-security-notice
method: POST
Manages GxP-validated system change requests by creating a ServiceNow change, logging in Veeva Vault audit trail, and notifying approvers for Roche.
naftiko: "0.5"
info:
label: "GxP System Change Approval Workflow"
description: "Manages GxP-validated system change requests by creating a ServiceNow change, logging in Veeva Vault audit trail, and notifying approvers for Roche."
tags:
- compliance
- gxp
- servicenow
- veeva-vault
capability:
exposes:
- type: mcp
namespace: gxp-compliance
port: 8080
tools:
- name: initiate-gxp-change
description: "Given change request details, create a ServiceNow change request, log in Veeva Vault, and notify the CAB."
inputParameters:
- name: system_name
in: body
type: string
description: "Name of the GxP-validated system."
- name: change_description
in: body
type: string
description: "Description of the proposed change."
- name: risk_level
in: body
type: string
description: "Risk classification (low, medium, high, critical)."
steps:
- name: create-change-request
type: call
call: servicenow.create-change
with:
short_description: "GxP Change: {{system_name}} — {{risk_level}} risk"
category: "gxp_change_control"
description: "System: {{system_name}} | Change: {{change_description}} | Risk: {{risk_level}}"
- name: log-vault-audit
type: call
call: veeva.create-object-record
with:
object_type: "change_control__c"
system_name__c: "{{system_name}}"
description__c: "{{change_description}}"
- name: notify-cab
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cab_channel"
text: "GxP Change Request: {{system_name}} ({{risk_level}} risk). SNOW: {{create-change-request.number}}. Vault: {{log-vault-audit.id}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.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: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Coordinates HCP speaker program events by creating events in Salesforce, logging compliance checks, and notifying medical affairs for Roche.
naftiko: "0.5"
info:
label: "HCP Speaker Program Event Coordinator"
description: "Coordinates HCP speaker program events by creating events in Salesforce, logging compliance checks, and notifying medical affairs for Roche."
tags:
- medical-affairs
- salesforce
- compliance
- events
capability:
exposes:
- type: mcp
namespace: medical-affairs-events
port: 8080
tools:
- name: coordinate-speaker-event
description: "Given speaker event details, create the event in Salesforce, verify FMV compliance, and notify the team."
inputParameters:
- name: speaker_name
in: body
type: string
description: "Name of the HCP speaker."
- name: event_title
in: body
type: string
description: "Title of the speaker program event."
- name: event_date
in: body
type: string
description: "Date of the event."
- name: honorarium_amount
in: body
type: string
description: "Speaker honorarium amount."
steps:
- name: create-event
type: call
call: salesforce.create-record
with:
object_type: "Speaker_Event__c"
Speaker_Name__c: "{{speaker_name}}"
Event_Title__c: "{{event_title}}"
- name: check-fmv
type: call
call: servicenow.create-incident
with:
short_description: "FMV Compliance Check: {{speaker_name}} — {{honorarium_amount}}"
category: "compliance"
- name: notify-med-affairs
type: call
call: msteams.send-message
with:
channel_id: "$secrets.med_affairs_events_channel"
text: "Speaker Event: {{event_title}} on {{event_date}}. Speaker: {{speaker_name}}. Honorarium: {{honorarium_amount}}. SFDC: {{create-event.id}}. FMV: {{check-fmv.number}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: records
path: "/sobjects/Speaker_Event__c"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Tracks vulnerability remediation by pulling scan results, creating ServiceNow tickets, and reporting to the CISO dashboard for Roche.
naftiko: "0.5"
info:
label: "IT Security Vulnerability Remediation Tracker"
description: "Tracks vulnerability remediation by pulling scan results, creating ServiceNow tickets, and reporting to the CISO dashboard for Roche."
tags:
- security
- servicenow
- compliance
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: track-vulnerability-remediation
description: "Given a scan ID and severity threshold, pull results, create remediation tickets, and update the dashboard."
inputParameters:
- name: scan_id
in: body
type: string
description: "The vulnerability scan identifier."
- name: severity_threshold
in: body
type: string
description: "Minimum severity to track (critical, high, medium)."
steps:
- name: get-findings
type: call
call: servicenow.get-vulnerabilities
with:
scan_id: "{{scan_id}}"
severity: "{{severity_threshold}}"
- name: create-tickets
type: call
call: servicenow.create-incident
with:
short_description: "Vulnerability Remediation: Scan {{scan_id}}"
category: "security"
- name: notify-security
type: call
call: msteams.send-message
with:
channel_id: "$secrets.security_ops_channel"
text: "Vulnerability Scan {{scan_id}}: {{get-findings.count}} findings at {{severity_threshold}}+ severity. Ticket: {{create-tickets.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the status and details of a Jira issue by key for Roche clinical operations project tracking.
naftiko: "0.5"
info:
label: "Jira Clinical Issue Status Lookup"
description: "Retrieves the status and details of a Jira issue by key for Roche clinical operations project tracking."
tags:
- clinical-trials
- jira
- project-management
- lookup
capability:
exposes:
- type: mcp
namespace: clinical-pm
port: 8080
tools:
- name: get-issue-status
description: "Given a Jira issue key, return the issue summary, status, assignee, and priority."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g., CLIN-1234)."
call: jira.get-issue
with:
issue_key: "{{issue_key}}"
outputParameters:
- name: summary
type: string
mapping: "$.fields.summary"
- name: status
type: string
mapping: "$.fields.status.name"
- name: assignee
type: string
mapping: "$.fields.assignee.displayName"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
At sprint completion, fetches completed Jira issues for the digital health engineering team, calculates velocity, and posts a summary to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "At sprint completion, fetches completed Jira issues for the digital health engineering team, calculates velocity, and posts a summary to the engineering Teams channel."
tags:
- devops
- engineering
- jira
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: engineering-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Given a Jira project key and sprint ID, retrieve completed issues, compute story point velocity, and post a sprint report to the digital health engineering Teams channel."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key (e.g., DIAG, PHARMA, DH)."
- name: sprint_id
in: body
type: integer
description: "The Jira sprint ID to report on."
steps:
- name: get-sprint-issues
type: call
call: "jira.get-sprint-issues"
with:
sprint_id: "{{sprint_id}}"
project_key: "{{project_key}}"
- name: post-velocity-report
type: call
call: "msteams.post-sprint-report"
with:
channel_id: "engineering-team"
message: "Sprint {{sprint_id}} complete for {{project_key}}. Velocity: {{get-sprint-issues.story_points}} pts across {{get-sprint-issues.issue_count}} issues."
consumes:
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprint-issues
path: "/search"
operations:
- name: get-sprint-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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-sprint-report
method: POST
Tracks laboratory instrument calibration schedules by querying SAP PM, creating ServiceNow work orders, and notifying lab managers for Roche.
naftiko: "0.5"
info:
label: "Laboratory Instrument Calibration Tracker"
description: "Tracks laboratory instrument calibration schedules by querying SAP PM, creating ServiceNow work orders, and notifying lab managers for Roche."
tags:
- r-and-d
- quality
- sap
- laboratory
capability:
exposes:
- type: mcp
namespace: lab-ops
port: 8080
tools:
- name: track-calibration
description: "Given a lab identifier, find instruments due for calibration, create work orders, and notify lab management."
inputParameters:
- name: lab_id
in: body
type: string
description: "The laboratory identifier."
- name: days_ahead
in: body
type: integer
description: "Days ahead to check for calibration due dates."
steps:
- name: query-instruments
type: call
call: sap.get-equipment-list
with:
lab_id: "{{lab_id}}"
next_calibration_within: "{{days_ahead}}"
- name: create-work-orders
type: call
call: servicenow.create-incident
with:
short_description: "Lab Calibration Due: {{query-instruments.count}} instruments in Lab {{lab_id}}"
category: "lab_operations"
- name: notify-lab-manager
type: call
call: msteams.send-message
with:
channel_id: "$secrets.lab_ops_channel"
text: "Calibration Alert: {{query-instruments.count}} instruments in Lab {{lab_id}} due within {{days_ahead}} days. SNOW: {{create-work-orders.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Searches LinkedIn for candidates matching global scientific and digital health R&D requisitions, and notifies Roche scientific recruiters in Teams.
naftiko: "0.5"
info:
label: "LinkedIn Global Scientific Talent Sourcing"
description: "Searches LinkedIn for candidates matching global scientific and digital health R&D requisitions, and notifies Roche scientific recruiters in Teams."
tags:
- hr
- recruiting
- linkedin
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: global-talent-acquisition
port: 8080
tools:
- name: source-global-scientific-talent
description: "Given a Workday job requisition ID for a scientific or digital health R&D role, search LinkedIn and notify the scientific recruiter in Teams with the candidate match count."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Workday job requisition ID."
- name: recruiter_email
in: body
type: string
description: "Email of the scientific recruiter to notify."
steps:
- name: get-requisition
type: call
call: "workday.get-job-requisition"
with:
requisition_id: "{{requisition_id}}"
- name: search-candidates
type: call
call: "linkedin.search-people"
with:
keywords: "{{get-requisition.title}}"
location: "{{get-requisition.location}}"
- name: notify-recruiter
type: call
call: "msteams.send-recruiter-notice"
with:
recipient: "{{recruiter_email}}"
message: "Found {{search-candidates.count}} LinkedIn candidates for {{get-requisition.title}} (req {{requisition_id}})."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/roche/jobRequisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-job-requisition
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: people-search
path: "/people"
operations:
- name: search-people
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}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-recruiter-notice
method: POST
Sources MSL candidates from LinkedIn, creates profiles in Workday recruiting, and notifies the talent acquisition team for Roche.
naftiko: "0.5"
info:
label: "LinkedIn Talent Pipeline for Medical Science Liaisons"
description: "Sources MSL candidates from LinkedIn, creates profiles in Workday recruiting, and notifies the talent acquisition team for Roche."
tags:
- hr
- linkedin
- workday
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: hr-talent-sourcing
port: 8080
tools:
- name: source-msl-candidates
description: "Given search criteria for MSL roles, source candidates from LinkedIn, create prospects in Workday, and notify TA."
inputParameters:
- name: therapeutic_area
in: body
type: string
description: "The target therapeutic area."
- name: location
in: body
type: string
description: "The target geographic location."
- name: experience_years
in: body
type: integer
description: "Minimum years of experience."
steps:
- name: search-linkedin
type: call
call: linkedin.search-candidates
with:
keywords: "Medical Science Liaison {{therapeutic_area}}"
location: "{{location}}"
- name: create-prospects
type: call
call: workday.create-prospect
with:
source: "LinkedIn"
requisition_area: "{{therapeutic_area}}"
- name: notify-ta
type: call
call: msteams.send-message
with:
channel_id: "$secrets.talent_channel"
text: "MSL Talent Pipeline: {{search-linkedin.count}} candidates found for {{therapeutic_area}} in {{location}}."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: people-search
path: "/people?keywords={{keywords}}"
inputParameters:
- name: keywords
in: query
operations:
- name: search-candidates
method: GET
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Recruiting/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: prospects
path: "/prospects"
operations:
- name: create-prospect
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes manufacturing deviations by creating a ServiceNow incident, logging in SAP QM, and notifying quality assurance for Roche.
naftiko: "0.5"
info:
label: "Manufacturing Deviation Handler"
description: "Processes manufacturing deviations by creating a ServiceNow incident, logging in SAP QM, and notifying quality assurance for Roche."
tags:
- manufacturing
- quality
- servicenow
- sap
capability:
exposes:
- type: mcp
namespace: manufacturing-qa
port: 8080
tools:
- name: handle-deviation
description: "Given deviation details, create a ServiceNow incident, log in SAP quality management, and notify the QA team."
inputParameters:
- name: batch_number
in: body
type: string
description: "The manufacturing batch number."
- name: deviation_type
in: body
type: string
description: "Type of deviation (process, equipment, material)."
- name: description
in: body
type: string
description: "Detailed description of the deviation."
- name: plant
in: body
type: string
description: "The manufacturing plant code."
steps:
- name: create-snow-incident
type: call
call: servicenow.create-incident
with:
short_description: "MFG Deviation: {{deviation_type}} — Batch {{batch_number}}"
category: "manufacturing_quality"
description: "Plant: {{plant}} | Batch: {{batch_number}} | Type: {{deviation_type}} | Details: {{description}}"
- name: log-sap-notification
type: call
call: sap.create-quality-notification
with:
notification_type: "Q2"
material: "{{batch_number}}"
plant: "{{plant}}"
description: "{{deviation_type}}: {{description}}"
- name: notify-qa
type: call
call: msteams.send-message
with:
channel_id: "$secrets.qa_channel"
text: "MFG Deviation Alert: {{deviation_type}} at Plant {{plant}}, Batch {{batch_number}}. SNOW: {{create-snow-incident.number}}. SAP QN: {{log-sap-notification.notification_number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.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: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes medical information requests by logging in Salesforce, searching the knowledge base, and notifying the medical affairs team for Roche.
naftiko: "0.5"
info:
label: "Medical Information Request Handler"
description: "Processes medical information requests by logging in Salesforce, searching the knowledge base, and notifying the medical affairs team for Roche."
tags:
- medical-affairs
- salesforce
- knowledge-management
- compliance
capability:
exposes:
- type: mcp
namespace: medical-affairs
port: 8080
tools:
- name: handle-med-info-request
description: "Given a medical information request, log in Salesforce, search the knowledge base, and notify medical affairs."
inputParameters:
- name: requestor_name
in: body
type: string
description: "Name of the healthcare professional."
- name: product_name
in: body
type: string
description: "The product being inquired about."
- name: question
in: body
type: string
description: "The medical information question."
- name: channel
in: body
type: string
description: "Request channel (phone, email, web)."
steps:
- name: log-in-salesforce
type: call
call: salesforce.create-case
with:
subject: "MedInfo Request: {{product_name}}"
description: "Requestor: {{requestor_name}} | Product: {{product_name}} | Question: {{question}}"
type: "Medical_Information"
- name: search-knowledge
type: call
call: confluence.search-content
with:
search_query: "{{product_name}} {{question}}"
- name: notify-med-affairs
type: call
call: msteams.send-message
with:
channel_id: "$secrets.med_affairs_channel"
text: "New MedInfo Request from {{requestor_name}} about {{product_name}}. Case: {{log-in-salesforce.id}}. KB matches: {{search-knowledge.totalSize}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: confluence
baseUri: "https://roche.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: search
path: "/content/search"
operations:
- name: search-content
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Launches periodic access certification campaigns by pulling user data from Okta, creating review tasks, and notifying managers for Roche.
naftiko: "0.5"
info:
label: "Okta Access Certification Campaign Launcher"
description: "Launches periodic access certification campaigns by pulling user data from Okta, creating review tasks, and notifying managers for Roche."
tags:
- security
- okta
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: identity-governance
port: 8080
tools:
- name: launch-access-certification
description: "Given a certification scope, pull active users from Okta, create review tasks, and notify owners."
inputParameters:
- name: application_name
in: body
type: string
description: "The Okta application name to certify."
- name: campaign_name
in: body
type: string
description: "The certification campaign name."
steps:
- name: get-users
type: call
call: okta.get-app-users
with:
application_name: "{{application_name}}"
- name: create-campaign
type: call
call: servicenow.create-incident
with:
short_description: "Access Certification: {{campaign_name}} — {{application_name}}"
category: "identity_governance"
- name: notify-owners
type: call
call: msteams.send-message
with:
channel_id: "$secrets.iam_channel"
text: "Access Certification: {{campaign_name}} for {{application_name}}. {{get-users.count}} users to review. SNOW: {{create-campaign.number}}."
consumes:
- type: http
namespace: okta
baseUri: "https://roche.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: app-users
path: "/apps/{{application_name}}/users"
inputParameters:
- name: application_name
in: path
operations:
- name: get-app-users
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Scans Okta for active Roche employees without MFA enrolled and sends a compliance warning to the global security compliance Teams channel.
naftiko: "0.5"
info:
label: "Okta MFA Compliance Enforcement"
description: "Scans Okta for active Roche employees without MFA enrolled and sends a compliance warning to the global security compliance Teams channel."
tags:
- security
- identity
- okta
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: mfa-compliance
port: 8080
tools:
- name: enforce-mfa-compliance
description: "Query Okta for active Roche employees without MFA enrolled, post a warning to the global security compliance Teams channel, and return the non-compliant user list."
inputParameters:
- name: grace_days
in: body
type: integer
description: "Number of days before automatic account suspension for non-compliant users."
steps:
- name: get-non-mfa-users
type: call
call: "okta.list-users-without-mfa"
with:
status: "ACTIVE"
- name: post-warning
type: call
call: "msteams.post-compliance-warning"
with:
channel_id: "global-security-compliance"
message: "{{get-non-mfa-users.count}} Roche employees have not enrolled in MFA. Grace period: {{grace_days}} days before suspension."
consumes:
- type: http
namespace: okta
baseUri: "https://roche.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: list-users-without-mfa
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-compliance-warning
method: POST
When a researcher joins a Workday research group, provisions the corresponding application access in Okta and logs the action in ServiceNow.
naftiko: "0.5"
info:
label: "Okta User Access Provisioning for Research Systems"
description: "When a researcher joins a Workday research group, provisions the corresponding application access in Okta and logs the action in ServiceNow."
tags:
- identity
- security
- okta
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: research-access-provisioning
port: 8080
tools:
- name: provision-researcher-access
description: "Given a Workday employee ID and target Okta group for a research system, assign the group membership and log the provisioning event in ServiceNow."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID of the researcher."
- name: okta_group_id
in: body
type: string
description: "The Okta group ID for the research system to provision."
steps:
- name: get-researcher
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: assign-group
type: call
call: "okta.add-user-to-group"
with:
user_id: "{{get-researcher.okta_user_id}}"
group_id: "{{okta_group_id}}"
- name: log-access
type: call
call: "servicenow.create-access-record"
with:
short_description: "Research access: {{get-researcher.full_name}} to {{okta_group_id}}"
category: "access_management"
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: "/roche/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://roche.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{group_id}}/users/{{user_id}}"
inputParameters:
- name: group_id
in: path
- name: user_id
in: path
operations:
- name: add-user-to-group
method: PUT
- type: http
namespace: servicenow
baseUri: "https://roche.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-access-record
method: POST
Retrieves the current status and profile of an Okta user by login email for Roche identity management.
naftiko: "0.5"
info:
label: "Okta User Status Lookup"
description: "Retrieves the current status and profile of an Okta user by login email for Roche identity management."
tags:
- security
- okta
- identity
- lookup
capability:
exposes:
- type: mcp
namespace: identity-ops
port: 8080
tools:
- name: get-user-status
description: "Given a user email, return the Okta user status, last login, and MFA enrollment status."
inputParameters:
- name: user_email
in: body
type: string
description: "The user login email address."
call: okta.get-user
with:
user_email: "{{user_email}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: last_login
type: string
mapping: "$.lastLogin"
- name: mfa_enrolled
type: boolean
mapping: "$.credentials.provider.type"
consumes:
- type: http
namespace: okta
baseUri: "https://roche.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: users
path: "/users/{{user_email}}"
inputParameters:
- name: user_email
in: path
operations:
- name: get-user
method: GET
Audits Palo Alto Networks security policy rules for overly permissive configurations and opens a Jira remediation ticket for each violation found.
naftiko: "0.5"
info:
label: "Palo Alto Networks Firewall Rule Audit"
description: "Audits Palo Alto Networks security policy rules for overly permissive configurations and opens a Jira remediation ticket for each violation found."
tags:
- security
- network
- palo-alto-networks
- jira
- audit
capability:
exposes:
- type: mcp
namespace: network-security
port: 8080
tools:
- name: audit-firewall-rules
description: "Query Palo Alto Networks for all security policy rules in a device group, detect overly broad rules, and create a Jira remediation ticket for each violation."
inputParameters:
- name: device_group
in: body
type: string
description: "The Palo Alto Networks device group to audit."
steps:
- name: get-security-rules
type: call
call: "paloalto.list-security-rules"
with:
device_group: "{{device_group}}"
- name: create-remediation
type: call
call: "jira.create-remediation-ticket"
with:
project_key: "GISO"
issuetype: "Task"
summary: "Firewall rule audit violations in {{device_group}}"
description: "Audit found {{get-security-rules.violation_count}} overly permissive rules in device group {{device_group}}."
consumes:
- type: http
namespace: paloalto
baseUri: "https://roche-panorama.paloaltonetworks.com/restapi/v10.1"
authentication:
type: apikey
key: "X-PAN-KEY"
value: "$secrets.paloalto_api_key"
placement: header
resources:
- name: security-rules
path: "/Objects/SecurityRules"
operations:
- name: list-security-rules
method: GET
- type: http
namespace: jira
baseUri: "https://roche.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-remediation-ticket
method: POST
Processes patient assistance program enrollments by creating cases in Salesforce, verifying eligibility, and notifying patient services for Roche.
naftiko: "0.5"
info:
label: "Patient Assistance Program Enrollment Processor"
description: "Processes patient assistance program enrollments by creating cases in Salesforce, verifying eligibility, and notifying patient services for Roche."
tags:
- commercial
- salesforce
- patient-services
- compliance
capability:
exposes:
- type: mcp
namespace: patient-services
port: 8080
tools:
- name: process-pap-enrollment
description: "Given patient enrollment details, create a Salesforce case, verify eligibility, and notify the patient services team."
inputParameters:
- name: patient_id
in: body
type: string
description: "The patient identifier."
- name: product_name
in: body
type: string
description: "The product for which assistance is requested."
- name: insurance_status
in: body
type: string
description: "Patient insurance status."
steps:
- name: create-case
type: call
call: salesforce.create-case
with:
subject: "PAP Enrollment: {{product_name}} — Patient {{patient_id}}"
type: "Patient_Assistance"
- name: verify-eligibility
type: call
call: snowflake.execute-query
with:
statement: "SELECT eligible FROM pap_eligibility_rules WHERE product = '{{product_name}}'"
warehouse: "COMMERCIAL_WH"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.patient_services_channel"
text: "PAP Enrollment: Patient {{patient_id}} for {{product_name}}. Eligibility: {{verify-eligibility.data}}. Case: {{create-case.id}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves current headcount by division and cost center from Workday for use in global workforce planning and IFRS financial reporting.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot by Division"
description: "Retrieves current headcount by division and cost center from Workday for use in global workforce planning and IFRS financial reporting."
tags:
- hr
- finance
- payroll
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: hr-finance
port: 8080
tools:
- name: get-headcount-by-division
description: "Returns active employees grouped by division and cost center from Workday. Use for global headcount planning, budget allocation, and Roche group reporting."
call: "workday.headcount-export"
outputParameters:
- name: employees
type: array
mapping: "$.data"
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-export
path: "/roche/workers"
operations:
- name: headcount-export
method: GET
Runs pharmacovigilance signal detection queries in Snowflake, generates summary reports, and alerts the safety review board for Roche.
naftiko: "0.5"
info:
label: "Pharmacovigilance Signal Detection Reporter"
description: "Runs pharmacovigilance signal detection queries in Snowflake, generates summary reports, and alerts the safety review board for Roche."
tags:
- drug-safety
- pharmacovigilance
- snowflake
- analytics
capability:
exposes:
- type: mcp
namespace: pv-analytics
port: 8080
tools:
- name: run-signal-detection
description: "Given a product and time period, run signal detection queries, create a Jira tracking issue, and alert the safety board."
inputParameters:
- name: product_name
in: body
type: string
description: "The drug product name."
- name: period_start
in: body
type: string
description: "Analysis period start date."
- name: period_end
in: body
type: string
description: "Analysis period end date."
steps:
- name: run-detection
type: call
call: snowflake.execute-query
with:
statement: "CALL pv_signal_detection('{{product_name}}', '{{period_start}}', '{{period_end}}')"
warehouse: "PV_WH"
- name: create-review-ticket
type: call
call: jira.create-issue
with:
project: "PV"
summary: "Signal Detection: {{product_name}} ({{period_start}} to {{period_end}})"
issuetype: "Task"
- name: alert-safety-board
type: call
call: msteams.send-message
with:
channel_id: "$secrets.safety_board_channel"
text: "PV Signal Detection: {{product_name}} ({{period_start}} to {{period_end}}). Signals: {{run-detection.signal_count}}. Jira: {{create-review-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks the last refresh status of a Power BI dataset for Roche analytics operations.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Status"
description: "Checks the last refresh status of a Power BI dataset for Roche analytics operations."
tags:
- analytics
- power-bi
- reporting
- lookup
capability:
exposes:
- type: mcp
namespace: analytics-ops
port: 8080
tools:
- name: get-refresh-status
description: "Given a Power BI dataset ID, return the last refresh status, start time, and end time."
inputParameters:
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID."
call: powerbi.get-refresh-history
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
- name: start_time
type: string
mapping: "$.value[0].startTime"
- 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: datasets
path: "/datasets/{{dataset_id}}/refreshes?$top=1"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh-history
method: GET
Triggers a Power BI dataset refresh for Roche's pharmaceutical pipeline portfolio dashboard and notifies the pipeline management office in Teams.
naftiko: "0.5"
info:
label: "Power BI Portfolio Pipeline Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for Roche's pharmaceutical pipeline portfolio dashboard and notifies the pipeline management office in Teams."
tags:
- data
- analytics
- power-bi
- microsoft-teams
- reporting
- portfolio
capability:
exposes:
- type: mcp
namespace: portfolio-analytics
port: 8080
tools:
- name: refresh-portfolio-dashboard
description: "Given a Power BI workspace and dataset ID for the pharmaceutical pipeline portfolio dashboard, trigger a refresh and notify the pipeline management office in Teams."
inputParameters:
- name: workspace_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 for the portfolio dashboard."
steps:
- name: trigger-refresh
type: call
call: "powerbi.trigger-refresh"
with:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-pmo
type: call
call: "msteams.post-refresh-notice"
with:
channel_id: "pipeline-management-office"
message: "Portfolio pipeline dashboard (dataset {{dataset_id}}) has been refreshed."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-refresh-notice
method: POST
Coordinates product recall activities by creating cases in Salesforce, notifying logistics via SAP, and alerting leadership for Roche.
naftiko: "0.5"
info:
label: "Product Recall Coordination Workflow"
description: "Coordinates product recall activities by creating cases in Salesforce, notifying logistics via SAP, and alerting leadership for Roche."
tags:
- quality
- product-recall
- salesforce
- sap
capability:
exposes:
- type: mcp
namespace: quality-recall
port: 8080
tools:
- name: initiate-recall
description: "Given product recall details, create a Salesforce case, update SAP batch status, and send urgent notifications."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name being recalled."
- name: batch_numbers
in: body
type: string
description: "Comma-separated affected batch numbers."
- name: recall_reason
in: body
type: string
description: "Reason for the recall."
- name: recall_class
in: body
type: string
description: "Recall classification (Class I, II, III)."
steps:
- name: create-recall-case
type: call
call: salesforce.create-case
with:
subject: "Product Recall: {{product_name}} — {{recall_class}}"
type: "Product_Recall"
- name: update-batch-status
type: call
call: sap.update-batch-status
with:
batch_numbers: "{{batch_numbers}}"
status: "blocked"
- name: alert-leadership
type: call
call: msteams.send-message
with:
channel_id: "$secrets.executive_channel"
text: "URGENT — Product Recall: {{product_name}} ({{recall_class}}). Batches: {{batch_numbers}}. Case: {{create-recall-case.id}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Refreshes the R&D pipeline dashboard by pulling compound status from Snowflake, updating Power BI, and notifying R&D leadership for Roche.
naftiko: "0.5"
info:
label: "R&D Compound Pipeline Dashboard Refresh"
description: "Refreshes the R&D pipeline dashboard by pulling compound status from Snowflake, updating Power BI, and notifying R&D leadership for Roche."
tags:
- r-and-d
- snowflake
- power-bi
- analytics
capability:
exposes:
- type: mcp
namespace: rd-analytics
port: 8080
tools:
- name: refresh-pipeline-dashboard
description: "Trigger a pipeline data extract from Snowflake, refresh the Power BI dataset, and notify leadership."
inputParameters:
- name: dashboard_id
in: body
type: string
description: "The Power BI dashboard dataset ID."
- name: teams_channel_id
in: body
type: string
description: "Teams channel for R&D leadership."
steps:
- name: extract-pipeline-data
type: call
call: snowflake.execute-query
with:
statement: "CALL refresh_rd_pipeline_snapshot()"
warehouse: "RD_WH"
- name: refresh-powerbi
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "{{dashboard_id}}"
- name: notify-leadership
type: call
call: msteams.send-message
with:
channel_id: "{{teams_channel_id}}"
text: "R&D Pipeline Dashboard refreshed. Data as of {{extract-pipeline-data.timestamp}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates RWE data ingestion from external sources into Snowflake, validates data quality, and notifies the HEOR team for Roche.
naftiko: "0.5"
info:
label: "Real-World Evidence Data Ingestion Pipeline"
description: "Orchestrates RWE data ingestion from external sources into Snowflake, validates data quality, and notifies the HEOR team for Roche."
tags:
- r-and-d
- real-world-evidence
- snowflake
- data-engineering
capability:
exposes:
- type: mcp
namespace: rwe-analytics
port: 8080
tools:
- name: ingest-rwe-data
description: "Given a data source and dataset identifier, ingest into Snowflake, run quality checks, and notify HEOR."
inputParameters:
- name: data_source
in: body
type: string
description: "The RWE data source name (claims, EMR, registry)."
- name: dataset_id
in: body
type: string
description: "The dataset identifier."
- name: study_id
in: body
type: string
description: "The associated study ID."
steps:
- name: ingest-data
type: call
call: snowflake.execute-query
with:
statement: "CALL rwe_ingest_pipeline('{{data_source}}', '{{dataset_id}}', '{{study_id}}')"
warehouse: "RWE_WH"
- name: validate-quality
type: call
call: snowflake.execute-query
with:
statement: "CALL rwe_data_quality_check('{{dataset_id}}')"
warehouse: "RWE_WH"
- name: notify-heor
type: call
call: msteams.send-message
with:
channel_id: "$secrets.heor_channel"
text: "RWE Data Ingestion Complete: {{data_source}} ({{dataset_id}}) for Study {{study_id}}. Records: {{ingest-data.row_count}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Veeva Vault for upcoming regulatory submission deadlines, creates Jira tracking tickets, and alerts the regulatory affairs team for Roche.
naftiko: "0.5"
info:
label: "Regulatory Submission Deadline Tracker"
description: "Queries Veeva Vault for upcoming regulatory submission deadlines, creates Jira tracking tickets, and alerts the regulatory affairs team for Roche."
tags:
- regulatory
- veeva-vault
- jira
- compliance
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: track-submission-deadlines
description: "Given a time horizon in days, find upcoming submission deadlines, create Jira tickets, and post a summary."
inputParameters:
- name: days_ahead
in: body
type: integer
description: "Number of days ahead to check for deadlines."
- name: teams_channel_id
in: body
type: string
description: "Teams channel for regulatory affairs notifications."
steps:
- name: query-deadlines
type: call
call: veeva.query-submissions
with:
query: "SELECT id, name__v, submission_date__c FROM submission__c WHERE submission_date__c <= DATEADD(day,{{days_ahead}},GETDATE())"
- name: create-tracker
type: call
call: jira.create-issue
with:
project: "REG"
summary: "Upcoming Submissions: {{query-deadlines.totalCount}} items within {{days_ahead}} days"
issuetype: "Task"
- name: alert-team
type: call
call: msteams.send-message
with:
channel_id: "{{teams_channel_id}}"
text: "Regulatory Alert: {{query-deadlines.totalCount}} submissions due within {{days_ahead}} days. Jira: {{create-tracker.key}}"
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: object-records
path: "/vobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-object-record
method: POST
- type: http
namespace: jira
baseUri: "https://roche.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates commercial territory realignment by updating Salesforce territories, adjusting Workday reporting, and notifying the commercial team for Roche.
naftiko: "0.5"
info:
label: "Salesforce Commercial Territory Realignment Orchestrator"
description: "Orchestrates commercial territory realignment by updating Salesforce territories, adjusting Workday reporting, and notifying the commercial team for Roche."
tags:
- commercial
- salesforce
- workday
- territory-management
capability:
exposes:
- type: mcp
namespace: commercial-ops-mgmt
port: 8080
tools:
- name: realign-territories
description: "Given territory changes, update Salesforce assignments, adjust Workday structures, and notify the team."
inputParameters:
- name: territory_id
in: body
type: string
description: "The territory identifier."
- name: new_rep_id
in: body
type: string
description: "The new sales representative employee ID."
- name: effective_date
in: body
type: string
description: "Effective date of the realignment."
steps:
- name: update-salesforce
type: call
call: salesforce.update-record
with:
object_type: "Territory2"
id: "{{territory_id}}"
Assigned_Rep__c: "{{new_rep_id}}"
- name: update-workday
type: call
call: workday.update-assignment
with:
employee_id: "{{new_rep_id}}"
territory: "{{territory_id}}"
- name: notify-commercial
type: call
call: msteams.send-message
with:
channel_id: "$secrets.commercial_ops_channel"
text: "Territory Realignment: Territory {{territory_id}} assigned to Rep {{new_rep_id}} effective {{effective_date}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: territories
path: "/sobjects/Territory2/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: update-record
method: PATCH
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Staffing/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: assignments
path: "/workers/{{employee_id}}/assignments"
inputParameters:
- name: employee_id
in: path
operations:
- name: update-assignment
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves healthcare provider account details from Salesforce CRM by account ID for Roche commercial operations.
naftiko: "0.5"
info:
label: "Salesforce HCP Account Lookup"
description: "Retrieves healthcare provider account details from Salesforce CRM by account ID for Roche commercial operations."
tags:
- commercial
- salesforce
- hcp
- lookup
capability:
exposes:
- type: mcp
namespace: commercial-ops
port: 8080
tools:
- name: get-hcp-account
description: "Given a Salesforce account ID, return the HCP name, specialty, prescribing tier, and territory."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID for the healthcare provider."
call: salesforce.get-account
with:
account_id: "{{account_id}}"
outputParameters:
- name: hcp_name
type: string
mapping: "$.Name"
- name: specialty
type: string
mapping: "$.Specialty__c"
- name: tier
type: string
mapping: "$.Prescribing_Tier__c"
- name: territory
type: string
mapping: "$.Territory__c"
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.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
Tracks KOL engagement activities by pulling data from Salesforce, summarizing in Snowflake, and reporting to medical affairs for Roche.
naftiko: "0.5"
info:
label: "Salesforce Key Opinion Leader Engagement Tracker"
description: "Tracks KOL engagement activities by pulling data from Salesforce, summarizing in Snowflake, and reporting to medical affairs for Roche."
tags:
- medical-affairs
- salesforce
- snowflake
- analytics
capability:
exposes:
- type: mcp
namespace: medical-affairs-analytics
port: 8080
tools:
- name: track-kol-engagement
description: "Given a therapeutic area, pull KOL engagement data, aggregate in Snowflake, and post a summary."
inputParameters:
- name: therapeutic_area
in: body
type: string
description: "The therapeutic area (e.g., oncology, immunology)."
- name: period
in: body
type: string
description: "Reporting period (e.g., Q1-2026)."
steps:
- name: pull-kol-data
type: call
call: salesforce.query
with:
q: "SELECT Name, Total_Engagements__c FROM Contact WHERE Therapeutic_Area__c = '{{therapeutic_area}}' AND KOL_Flag__c = true"
- name: aggregate-data
type: call
call: snowflake.execute-query
with:
statement: "INSERT INTO kol_engagement_summary SELECT * FROM staged_kol_data WHERE period = '{{period}}'"
warehouse: "ANALYTICS_WH"
- name: post-summary
type: call
call: msteams.send-message
with:
channel_id: "$secrets.med_affairs_channel"
text: "KOL Engagement Summary for {{therapeutic_area}} ({{period}}): {{pull-kol-data.totalSize}} KOLs tracked."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates a weekly Salesforce digest of medical affairs HCP account activity, pipeline status, and engagement metrics, posted to the global medical affairs Teams channel.
naftiko: "0.5"
info:
label: "Salesforce Medical Affairs Account Intelligence Digest"
description: "Generates a weekly Salesforce digest of medical affairs HCP account activity, pipeline status, and engagement metrics, posted to the global medical affairs Teams channel."
tags:
- crm
- sales
- salesforce
- microsoft-teams
- reporting
- medical-affairs
capability:
exposes:
- type: mcp
namespace: medical-affairs-reporting
port: 8080
tools:
- name: digest-hcp-account-activity
description: "Fetch Salesforce medical affairs HCP account activity for the past week and post a formatted engagement digest to the global medical affairs Teams channel."
inputParameters:
- name: channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the global medical affairs team."
steps:
- name: query-hcp-activity
type: call
call: "salesforce.query-hcp-accounts"
with:
account_type: "HCP"
- name: post-digest
type: call
call: "msteams.post-hcp-digest"
with:
channel_id: "{{channel_id}}"
message: "HCP account digest: {{query-hcp-activity.accounts_touched}} accounts engaged, {{query-hcp-activity.interactions}} interactions recorded this week."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/query"
operations:
- name: query-hcp-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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-hcp-digest
method: POST
When a new oncology product launch campaign is created in Salesforce, activates target HCP accounts, creates ServiceNow launch coordination tasks, and notifies the brand team in Teams.
naftiko: "0.5"
info:
label: "Salesforce Oncology Product Launch Campaign"
description: "When a new oncology product launch campaign is created in Salesforce, activates target HCP accounts, creates ServiceNow launch coordination tasks, and notifies the brand team in Teams."
tags:
- crm
- sales
- salesforce
- servicenow
- microsoft-teams
- product-launch
- oncology
capability:
exposes:
- type: mcp
namespace: product-launch
port: 8080
tools:
- name: activate-oncology-launch
description: "Given a Salesforce campaign ID for an oncology product launch, activate target HCP accounts, create ServiceNow coordination tasks, and alert the brand team in Teams."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The Salesforce campaign ID for the oncology product launch."
steps:
- name: get-campaign
type: call
call: "salesforce.get-campaign"
with:
campaign_id: "{{campaign_id}}"
- name: create-launch-tasks
type: call
call: "servicenow.create-launch-project"
with:
name: "Launch: {{get-campaign.name}}"
description: "Coordination tasks for {{get-campaign.name}} targeting {{get-campaign.target_count}} HCP accounts."
- name: notify-brand-team
type: call
call: "msteams.post-launch-notice"
with:
channel_id: "brand-management"
message: "Oncology launch campaign '{{get-campaign.name}}' activated. ServiceNow project: {{create-launch-tasks.number}}. Target HCPs: {{get-campaign.target_count}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: projects
path: "/table/pm_project"
operations:
- name: create-launch-project
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-launch-notice
method: POST
Manages contract renewal workflows by checking expiring contracts in SAP Ariba, creating ServiceNow tasks, and notifying procurement for Roche.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Renewal Workflow"
description: "Manages contract renewal workflows by checking expiring contracts in SAP Ariba, creating ServiceNow tasks, and notifying procurement for Roche."
tags:
- procurement
- sap-ariba
- servicenow
- contract-management
capability:
exposes:
- type: mcp
namespace: procurement-contracts
port: 8080
tools:
- name: process-contract-renewal
description: "Given a contract ID, check renewal terms, create a ServiceNow task, and notify procurement."
inputParameters:
- name: contract_id
in: body
type: string
description: "The SAP Ariba contract ID."
- name: contract_owner
in: body
type: string
description: "The contract owner name."
steps:
- name: get-contract
type: call
call: ariba.get-contract
with:
contract_id: "{{contract_id}}"
- name: create-renewal-task
type: call
call: servicenow.create-incident
with:
short_description: "Contract Renewal: {{get-contract.title}} — Expires {{get-contract.end_date}}"
category: "procurement"
- name: notify-procurement
type: call
call: msteams.send-message
with:
channel_id: "$secrets.procurement_channel"
text: "Contract Renewal: {{get-contract.title}} ({{contract_id}}) expires {{get-contract.end_date}}. Task: {{create-renewal-task.number}}."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/procurement/v2/roche"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a purchase requisition is submitted in SAP Ariba, validates budget in SAP S/4HANA and posts an approval notification to the procurement Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Ariba Procurement Requisition Approval"
description: "When a purchase requisition is submitted in SAP Ariba, validates budget in SAP S/4HANA and posts an approval notification to the procurement Microsoft Teams channel."
tags:
- procurement
- finance
- sap-ariba
- sap
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: procurement-approval
port: 8080
tools:
- name: approve-requisition
description: "Given an SAP Ariba requisition ID, fetch requisition details, validate budget in SAP S/4HANA, and notify the approver in Teams."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The SAP Ariba purchase requisition ID."
- name: approver_email
in: body
type: string
description: "Email address of the designated approver."
steps:
- name: get-requisition
type: call
call: "ariba.get-requisition"
with:
requisition_id: "{{requisition_id}}"
- name: check-budget
type: call
call: "sap-budget.get-budget"
with:
cost_center: "{{get-requisition.cost_center}}"
- name: notify-approver
type: call
call: "msteams.send-approval-notice"
with:
recipient: "{{approver_email}}"
message: "Requisition {{requisition_id}} for {{get-requisition.total_amount}} {{get-requisition.currency}} awaits approval. Budget available: {{check-budget.available_amount}}."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/purchase-requisition/v1"
authentication:
type: apikey
key: "APIKey"
value: "$secrets.ariba_api_key"
placement: header
resources:
- name: requisitions
path: "/requisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-requisition
method: GET
- type: http
namespace: sap-budget
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/FM_BUDGET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budget-availability
path: "/BudgetAvailability"
operations:
- name: get-budget
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}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-approval-notice
method: POST
Retrieves batch genealogy and traceability data from SAP for a given batch number in Roche manufacturing.
naftiko: "0.5"
info:
label: "SAP Batch Genealogy Lookup"
description: "Retrieves batch genealogy and traceability data from SAP for a given batch number in Roche manufacturing."
tags:
- manufacturing
- sap
- batch-tracking
- quality
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: get-batch-genealogy
description: "Given a batch number and plant code, return the batch creation date, material, and expiry date."
inputParameters:
- name: batch_number
in: body
type: string
description: "The SAP batch number."
- name: plant
in: body
type: string
description: "The SAP plant code."
call: sap.get-batch
with:
batch_number: "{{batch_number}}"
plant: "{{plant}}"
outputParameters:
- name: material
type: string
mapping: "$.d.Material"
- name: manufacture_date
type: string
mapping: "$.d.ManufactureDate"
- name: shelf_life_expiry
type: string
mapping: "$.d.ShelfLifeExpirationDate"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-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(Material='',Batch='{{batch_number}}',Plant='{{plant}}')"
inputParameters:
- name: batch_number
in: path
- name: plant
in: path
operations:
- name: get-batch
method: GET
Checks travel expense reports for policy violations, creates audit findings in ServiceNow, and notifies finance for Roche.
naftiko: "0.5"
info:
label: "SAP Concur Travel Policy Compliance Checker"
description: "Checks travel expense reports for policy violations, creates audit findings in ServiceNow, and notifies finance for Roche."
tags:
- finance
- sap-concur
- compliance
- audit
capability:
exposes:
- type: mcp
namespace: finance-compliance
port: 8080
tools:
- name: check-travel-compliance
description: "Given an expense report ID, check for policy violations, create audit findings, and notify the compliance team."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: employee_id
in: body
type: string
description: "The employee ID who submitted the report."
steps:
- name: get-report
type: call
call: concur.get-expense-report
with:
report_id: "{{report_id}}"
- name: log-findings
type: call
call: servicenow.create-incident
with:
short_description: "Travel Compliance Review: Report {{report_id}}"
category: "finance_audit"
- name: notify-finance
type: call
call: msteams.send-message
with:
channel_id: "$secrets.finance_compliance_channel"
text: "Travel Compliance: Report {{report_id}} by Employee {{employee_id}}. Total: {{get-report.total}}. Violations: {{get-report.violations_count}}. SNOW: {{log-findings.number}}."
consumes:
- type: http
namespace: concur
baseUri: "https://us2.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Reports cost center budget variances from SAP, creates finance review tasks, and notifies the finance team for Roche.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Variance Reporter"
description: "Reports cost center budget variances from SAP, creates finance review tasks, and notifies the finance team for Roche."
tags:
- finance
- sap
- budgeting
- reporting
capability:
exposes:
- type: mcp
namespace: finance-reporting
port: 8080
tools:
- name: report-budget-variance
description: "Given a cost center and period, calculate budget variance, create a review task, and notify finance."
inputParameters:
- name: cost_center
in: body
type: string
description: "The SAP cost center."
- name: fiscal_period
in: body
type: string
description: "The fiscal period (e.g., 2026-03)."
steps:
- name: get-variance
type: call
call: sap.get-budget-variance
with:
cost_center: "{{cost_center}}"
period: "{{fiscal_period}}"
- name: create-review
type: call
call: servicenow.create-incident
with:
short_description: "Budget Variance: CC {{cost_center}} — {{fiscal_period}}"
category: "finance"
- name: notify-finance
type: call
call: msteams.send-message
with:
channel_id: "$secrets.finance_channel"
text: "Budget Variance: CC {{cost_center}} for {{fiscal_period}}. Variance: {{get-variance.variance}}. Review: {{create-review.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves cost element master data from SAP for Roche finance and controlling operations.
naftiko: "0.5"
info:
label: "SAP Cost Element Lookup"
description: "Retrieves cost element master data from SAP for Roche finance and controlling operations."
tags:
- finance
- sap
- controlling
- lookup
capability:
exposes:
- type: mcp
namespace: finance-controlling
port: 8080
tools:
- name: get-cost-element
description: "Given a cost element code, return the description, category, and controlling area."
inputParameters:
- name: cost_element
in: body
type: string
description: "The SAP cost element code."
call: sap.get-cost-element
with:
cost_element: "{{cost_element}}"
outputParameters:
- name: description
type: string
mapping: "$.d.CostElementDescription"
- name: category
type: string
mapping: "$.d.CostElementCategory"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_COSTELEMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: get-record
method: GET
Retrieves outbound delivery document details from SAP by delivery number for Roche logistics operations.
naftiko: "0.5"
info:
label: "SAP Delivery Document Lookup"
description: "Retrieves outbound delivery document details from SAP by delivery number for Roche logistics operations."
tags:
- logistics
- sap
- delivery
- lookup
capability:
exposes:
- type: mcp
namespace: logistics-ops
port: 8080
tools:
- name: get-delivery-document
description: "Given a SAP delivery number, return the ship-to party, delivery date, and total weight."
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: ship_to
type: string
mapping: "$.d.ShipToParty"
- name: delivery_date
type: string
mapping: "$.d.DeliveryDate"
- name: total_weight
type: string
mapping: "$.d.HeaderGrossWeight"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: get-record
method: GET
Creates breakdown maintenance notifications in SAP when equipment failures are reported and notifies the maintenance team for Roche.
naftiko: "0.5"
info:
label: "SAP Equipment Breakdown Incident Creator"
description: "Creates breakdown maintenance notifications in SAP when equipment failures are reported and notifies the maintenance team for Roche."
tags:
- manufacturing
- sap
- maintenance
- incident
capability:
exposes:
- type: mcp
namespace: manufacturing-breakdown
port: 8080
tools:
- name: create-breakdown-incident
description: "Given equipment failure details, create a SAP breakdown notification and a ServiceNow incident."
inputParameters:
- name: equipment_id
in: body
type: string
description: "The SAP equipment ID."
- name: failure_description
in: body
type: string
description: "Description of the equipment failure."
- name: plant
in: body
type: string
description: "The manufacturing plant code."
- name: priority
in: body
type: string
description: "Incident priority (P1-P4)."
steps:
- name: create-sap-notification
type: call
call: sap.create-maintenance-notification
with:
equipment: "{{equipment_id}}"
notification_type: "M2"
description: "{{failure_description}}"
plant: "{{plant}}"
- name: create-snow-incident
type: call
call: servicenow.create-incident
with:
short_description: "Equipment Breakdown: {{equipment_id}} at Plant {{plant}}"
priority: "{{priority}}"
description: "Equipment: {{equipment_id}} | Failure: {{failure_description}} | Plant: {{plant}} | SAP: {{create-sap-notification.notification_number}}"
- name: notify-maintenance
type: call
call: msteams.send-message
with:
channel_id: "$secrets.maintenance_channel"
text: "EQUIPMENT BREAKDOWN: {{equipment_id}} at Plant {{plant}}. Priority: {{priority}}. SAP: {{create-sap-notification.notification_number}}. SNOW: {{create-snow-incident.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: get-record
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes goods receipt in SAP, triggers quality inspection, and notifies the warehouse team upon completion for Roche.
naftiko: "0.5"
info:
label: "SAP Goods Receipt and Quality Release"
description: "Processes goods receipt in SAP, triggers quality inspection, and notifies the warehouse team upon completion for Roche."
tags:
- supply-chain
- sap
- quality
- warehouse
capability:
exposes:
- type: mcp
namespace: warehouse-ops
port: 8080
tools:
- name: process-goods-receipt
description: "Given a purchase order and delivery details, post goods receipt, trigger quality inspection, and notify warehouse."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number."
- name: delivery_number
in: body
type: string
description: "The inbound delivery number."
- name: plant
in: body
type: string
description: "The receiving plant code."
steps:
- name: post-goods-receipt
type: call
call: sap.post-goods-receipt
with:
po_number: "{{po_number}}"
delivery: "{{delivery_number}}"
plant: "{{plant}}"
- name: trigger-qi
type: call
call: sap.create-inspection-lot
with:
material_document: "{{post-goods-receipt.material_document}}"
plant: "{{plant}}"
- name: notify-warehouse
type: call
call: msteams.send-message
with:
channel_id: "$secrets.warehouse_channel"
text: "Goods Receipt for PO {{po_number}}, Delivery {{delivery_number}} at Plant {{plant}}. Material Doc: {{post-goods-receipt.material_document}}. QI Lot: {{trigger-qi.inspection_lot}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves current inventory stock levels from SAP for a material at a given plant for Roche supply chain operations.
naftiko: "0.5"
info:
label: "SAP Inventory Stock Lookup"
description: "Retrieves current inventory stock levels from SAP for a material at a given plant for Roche supply chain operations."
tags:
- supply-chain
- sap
- inventory
- manufacturing
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: get-stock-level
description: "Given a material number and plant code, return the unrestricted stock, quality inspection stock, and blocked stock quantities."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: plant
in: body
type: string
description: "The SAP plant code."
call: sap.get-stock
with:
material_number: "{{material_number}}"
plant: "{{plant}}"
outputParameters:
- name: unrestricted
type: string
mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
- name: quality_inspection
type: string
mapping: "$.d.QualityInspectionStockQty"
- name: blocked
type: string
mapping: "$.d.BlockedStockQty"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant}}')"
inputParameters:
- name: material_number
in: path
- name: plant
in: path
operations:
- name: get-stock
method: GET
Validates invoices by performing three-way matching in SAP, logs exceptions in ServiceNow, and notifies accounts payable for Roche.
naftiko: "0.5"
info:
label: "SAP Invoice Three-Way Match Validator"
description: "Validates invoices by performing three-way matching in SAP, logs exceptions in ServiceNow, and notifies accounts payable for Roche."
tags:
- finance
- sap
- accounts-payable
- compliance
capability:
exposes:
- type: mcp
namespace: finance-ap
port: 8080
tools:
- name: validate-invoice-match
description: "Given an invoice number, perform three-way match validation, log exceptions, and notify AP."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP invoice document number."
- name: company_code
in: body
type: string
description: "The SAP company code."
steps:
- name: check-match
type: call
call: sap.validate-three-way-match
with:
invoice_number: "{{invoice_number}}"
company_code: "{{company_code}}"
- name: log-exception
type: call
call: servicenow.create-incident
with:
short_description: "Invoice Match Exception: {{invoice_number}}"
category: "accounts_payable"
- name: notify-ap
type: call
call: msteams.send-message
with:
channel_id: "$secrets.ap_channel"
text: "Invoice Match: {{invoice_number}} in Company {{company_code}}. Status: {{check-match.status}}. Variance: {{check-match.variance}}. SNOW: {{log-exception.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves material master data from SAP S/4HANA by material number for Roche manufacturing and supply chain operations.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP S/4HANA by material number for Roche manufacturing and supply chain operations."
tags:
- manufacturing
- sap
- supply-chain
- lookup
capability:
exposes:
- type: mcp
namespace: supply-chain
port: 8080
tools:
- name: get-material
description: "Given a SAP material number, return the material description, base unit of measure, and material group."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number (e.g., MAT-001234)."
call: sap.get-material
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
- name: base_uom
type: string
mapping: "$.d.BaseUnit"
- name: material_group
type: string
mapping: "$.d.MaterialGroup"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-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
Handles MRP run exceptions from SAP by creating supply chain alerts, logging in ServiceNow, and notifying the planning team for Roche.
naftiko: "0.5"
info:
label: "SAP MRP Run Exception Handler"
description: "Handles MRP run exceptions from SAP by creating supply chain alerts, logging in ServiceNow, and notifying the planning team for Roche."
tags:
- supply-chain
- sap
- planning
- manufacturing
capability:
exposes:
- type: mcp
namespace: supply-planning
port: 8080
tools:
- name: handle-mrp-exception
description: "Given MRP exception details, create a ServiceNow alert and notify the supply planning team."
inputParameters:
- name: material_number
in: body
type: string
description: "The material with the MRP exception."
- name: exception_type
in: body
type: string
description: "Type of MRP exception (shortage, excess, rescheduling)."
- name: plant
in: body
type: string
description: "The plant code."
- name: quantity
in: body
type: string
description: "The exception quantity."
steps:
- name: create-alert
type: call
call: servicenow.create-incident
with:
short_description: "MRP Exception: {{exception_type}} — Material {{material_number}}"
category: "supply_planning"
- name: notify-planning
type: call
call: msteams.send-message
with:
channel_id: "$secrets.planning_channel"
text: "MRP Exception: {{exception_type}} for Material {{material_number}} at Plant {{plant}}. Qty: {{quantity}}. SNOW: {{create-alert.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers SAP S/4HANA period-close for Roche group entities at month end and notifies the global finance team in Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Period-Close Financial Reconciliation"
description: "Triggers SAP S/4HANA period-close for Roche group entities at month end and notifies the global finance team in Microsoft Teams."
tags:
- finance
- erp
- sap
- microsoft-teams
- period-close
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: run-period-close
description: "Given a fiscal period and Roche group company code, trigger SAP S/4HANA period-close for all cost objects and notify the global finance team in Teams."
inputParameters:
- name: company_code
in: body
type: string
description: "SAP company code for the Roche entity (e.g., RO01 for Roche Basel)."
- name: fiscal_period
in: body
type: string
description: "Fiscal period in YYYYMM format."
steps:
- name: trigger-close
type: call
call: "sap.trigger-period-close"
with:
company_code: "{{company_code}}"
fiscal_period: "{{fiscal_period}}"
- name: notify-global-finance
type: call
call: "msteams.post-close-notification"
with:
channel_id: "global-finance"
message: "Period close for {{fiscal_period}} (company {{company_code}}) initiated. SAP job ID: {{trigger-close.job_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close
path: "/A_CompanyCode('{{company_code}}')/to_PeriodClose"
inputParameters:
- name: company_code
in: path
operations:
- name: trigger-period-close
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-close-notification
method: POST
Creates planned maintenance orders in SAP for manufacturing equipment, schedules in ServiceNow, and notifies the maintenance team for Roche.
naftiko: "0.5"
info:
label: "SAP Planned Maintenance Order Creator"
description: "Creates planned maintenance orders in SAP for manufacturing equipment, schedules in ServiceNow, and notifies the maintenance team for Roche."
tags:
- manufacturing
- sap
- maintenance
- servicenow
capability:
exposes:
- type: mcp
namespace: manufacturing-maintenance
port: 8080
tools:
- name: create-maintenance-order
description: "Given equipment details, create a SAP maintenance order, a ServiceNow work order, and notify maintenance."
inputParameters:
- name: equipment_id
in: body
type: string
description: "The SAP equipment ID."
- name: maintenance_type
in: body
type: string
description: "Type of maintenance (preventive, calibration, qualification)."
- name: plant
in: body
type: string
description: "The plant code."
- name: scheduled_date
in: body
type: string
description: "Scheduled maintenance date."
steps:
- name: create-sap-order
type: call
call: sap.create-maintenance-order
with:
equipment: "{{equipment_id}}"
order_type: "{{maintenance_type}}"
plant: "{{plant}}"
- name: create-snow-work-order
type: call
call: servicenow.create-incident
with:
short_description: "Maintenance: {{maintenance_type}} — Equipment {{equipment_id}}"
category: "manufacturing_maintenance"
- name: notify-maintenance
type: call
call: msteams.send-message
with:
channel_id: "$secrets.maintenance_channel"
text: "Maintenance Scheduled: {{maintenance_type}} for Equipment {{equipment_id}} at Plant {{plant}} on {{scheduled_date}}. SAP: {{create-sap-order.order_number}}. SNOW: {{create-snow-work-order.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves production order status and details from SAP for Roche manufacturing operations.
naftiko: "0.5"
info:
label: "SAP Production Order Status Lookup"
description: "Retrieves production order status and details from SAP for Roche manufacturing operations."
tags:
- manufacturing
- sap
- production
- lookup
capability:
exposes:
- type: mcp
namespace: manufacturing-mgmt
port: 8080
tools:
- name: get-production-order
description: "Given a SAP production order number, return the order type, status, planned quantity, and material."
inputParameters:
- name: order_number
in: body
type: string
description: "The SAP production order number."
call: sap.get-prod-order
with:
order_number: "{{order_number}}"
outputParameters:
- name: order_type
type: string
mapping: "$.d.ManufacturingOrderType"
- name: status
type: string
mapping: "$.d.MfgOrderPlannedTotalQty"
- name: material
type: string
mapping: "$.d.Material"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder_2('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-prod-order
method: GET
Looks up a SAP S/4HANA purchase order by number, returning status, vendor details, and total value for global procurement and finance teams.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up a SAP S/4HANA purchase order by number, returning status, vendor details, and total value for global procurement and finance teams."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp
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, and transaction currency."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number to retrieve."
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"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves quality inspection lot details from SAP for Roche quality assurance operations.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP for Roche quality assurance operations."
tags:
- quality
- sap
- manufacturing
- inspection
capability:
exposes:
- type: mcp
namespace: quality-mgmt
port: 8080
tools:
- name: get-inspection-lot
description: "Given an inspection lot number, return the material, inspection type, lot status, and result."
inputParameters:
- name: inspection_lot
in: body
type: string
description: "The SAP quality inspection lot number."
call: sap.get-inspection-lot
with:
inspection_lot: "{{inspection_lot}}"
outputParameters:
- name: material
type: string
mapping: "$.d.Material"
- name: inspection_type
type: string
mapping: "$.d.InspectionLotType"
- name: lot_status
type: string
mapping: "$.d.InspectionLotStatusID"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-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
Tracks outbound shipments in SAP TM, updates delivery status in Salesforce, and notifies the distribution team for Roche.
naftiko: "0.5"
info:
label: "SAP Transport Management Shipment Tracker"
description: "Tracks outbound shipments in SAP TM, updates delivery status in Salesforce, and notifies the distribution team for Roche."
tags:
- supply-chain
- sap
- salesforce
- logistics
capability:
exposes:
- type: mcp
namespace: distribution-ops
port: 8080
tools:
- name: track-shipment
description: "Given a shipment ID, retrieve tracking data from SAP TM, update Salesforce, and notify distribution."
inputParameters:
- name: shipment_id
in: body
type: string
description: "The SAP Transportation Management shipment ID."
- name: salesforce_order_id
in: body
type: string
description: "The related Salesforce order ID."
steps:
- name: get-tracking
type: call
call: sap.get-shipment-status
with:
shipment_id: "{{shipment_id}}"
- name: update-salesforce
type: call
call: salesforce.update-record
with:
object_type: "Order"
id: "{{salesforce_order_id}}"
Shipping_Status__c: "{{get-tracking.status}}"
- name: notify-distribution
type: call
call: msteams.send-message
with:
channel_id: "$secrets.distribution_channel"
text: "Shipment Update: {{shipment_id}} — Status: {{get-tracking.status}}. ETA: {{get-tracking.eta}}. Salesforce updated."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: update-record
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Synchronizes new or updated vendor records from SAP S/4HANA to SAP Ariba to maintain procurement catalog consistency across Roche's global supply chain.
naftiko: "0.5"
info:
label: "SAP Vendor Master Data Sync to Ariba"
description: "Synchronizes new or updated vendor records from SAP S/4HANA to SAP Ariba to maintain procurement catalog consistency across Roche's global supply chain."
tags:
- procurement
- finance
- sap
- sap-ariba
- data-sync
capability:
exposes:
- type: mcp
namespace: vendor-sync
port: 8080
tools:
- name: sync-vendor-to-ariba
description: "Given a SAP vendor account number, fetch the vendor master record from SAP S/4HANA and upsert the corresponding supplier profile in SAP Ariba."
inputParameters:
- name: vendor_account
in: body
type: string
description: "The SAP vendor account number."
steps:
- name: get-vendor
type: call
call: "sap.get-vendor"
with:
vendor_account: "{{vendor_account}}"
- name: upsert-supplier
type: call
call: "ariba.upsert-supplier"
with:
supplier_id: "{{get-vendor.vendor_account}}"
name: "{{get-vendor.name}}"
country: "{{get-vendor.country}}"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-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_account}}')"
inputParameters:
- name: vendor_account
in: path
operations:
- name: get-vendor
method: GET
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier/v1"
authentication:
type: apikey
key: "APIKey"
value: "$secrets.ariba_api_key"
placement: header
resources:
- name: suppliers
path: "/suppliers/{{supplier_id}}"
inputParameters:
- name: supplier_id
in: path
operations:
- name: upsert-supplier
method: PUT
Retrieves vendor master data from SAP S/4HANA by vendor number for Roche procurement operations.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master data from SAP S/4HANA by vendor number for Roche procurement operations."
tags:
- procurement
- sap
- vendor-management
- lookup
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: get-vendor
description: "Given a SAP vendor number, return the vendor name, payment terms, and purchasing organization."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor account number."
call: sap.get-vendor
with:
vendor_number: "{{vendor_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.SupplierName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: purchasing_org
type: string
mapping: "$.d.PurchasingOrganization"
consumes:
- type: http
namespace: sap
baseUri: "https://roche-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('{{vendor_number}}')"
inputParameters:
- name: vendor_number
in: path
operations:
- name: get-vendor
method: GET
Monitors warehouse capacity levels in SAP, creates planning alerts in ServiceNow, and notifies logistics when thresholds are breached for Roche.
naftiko: "0.5"
info:
label: "SAP Warehouse Capacity Planning Alert"
description: "Monitors warehouse capacity levels in SAP, creates planning alerts in ServiceNow, and notifies logistics when thresholds are breached for Roche."
tags:
- supply-chain
- sap
- warehouse
- capacity-planning
capability:
exposes:
- type: mcp
namespace: logistics-planning
port: 8080
tools:
- name: alert-warehouse-capacity
description: "Given a warehouse and capacity threshold, check current utilization and alert if exceeded."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "The SAP warehouse number."
- name: threshold_percent
in: body
type: integer
description: "Capacity utilization threshold percentage."
- name: plant
in: body
type: string
description: "The SAP plant code."
steps:
- name: check-capacity
type: call
call: sap.get-warehouse-utilization
with:
warehouse: "{{warehouse_id}}"
plant: "{{plant}}"
- name: create-alert
type: call
call: servicenow.create-incident
with:
short_description: "Warehouse Capacity Alert: {{warehouse_id}} at {{check-capacity.utilization}}%"
category: "logistics"
- name: notify-logistics
type: call
call: msteams.send-message
with:
channel_id: "$secrets.logistics_channel"
text: "Warehouse Capacity: {{warehouse_id}} at Plant {{plant}} is at {{check-capacity.utilization}}% (threshold: {{threshold_percent}}%). SNOW: {{create-alert.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves configuration item details from ServiceNow CMDB by asset tag for Roche IT asset management.
naftiko: "0.5"
info:
label: "ServiceNow CMDB Asset Lookup"
description: "Retrieves configuration item details from ServiceNow CMDB by asset tag for Roche IT asset management."
tags:
- it-operations
- servicenow
- cmdb
- lookup
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: get-cmdb-asset
description: "Given an asset tag, return the CI name, class, operational status, and assigned support group."
inputParameters:
- name: asset_tag
in: body
type: string
description: "The ServiceNow asset tag identifier."
call: servicenow.get-ci
with:
asset_tag: "{{asset_tag}}"
outputParameters:
- name: ci_name
type: string
mapping: "$.result.name"
- name: ci_class
type: string
mapping: "$.result.sys_class_name"
- name: operational_status
type: string
mapping: "$.result.operational_status"
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb-ci
path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
inputParameters:
- name: asset_tag
in: query
operations:
- name: get-ci
method: GET
Opens a ServiceNow change control request for GxP-validated system changes, routes through quality assurance review, and notifies the global QA team in Teams.
naftiko: "0.5"
info:
label: "ServiceNow GxP Validated System Change Control"
description: "Opens a ServiceNow change control request for GxP-validated system changes, routes through quality assurance review, and notifies the global QA team in Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- gxp
- quality
capability:
exposes:
- type: mcp
namespace: gxp-change-control
port: 8080
tools:
- name: open-gxp-change-request
description: "Given a change description and GxP system name, create a ServiceNow validated system change request and notify the global QA review board in Teams."
inputParameters:
- name: short_description
in: body
type: string
description: "Brief description of the proposed change to the validated system."
- name: system_name
in: body
type: string
description: "Name of the GxP-validated system being changed."
- name: scheduled_start
in: body
type: string
description: "Planned start datetime in ISO 8601 format."
steps:
- name: create-change
type: call
call: "servicenow.create-gxp-change"
with:
short_description: "{{short_description}}"
system: "{{system_name}}"
start_date: "{{scheduled_start}}"
category: "gxp_validated_system"
- name: notify-global-qa
type: call
call: "msteams.notify-qa-board"
with:
channel_id: "global-quality-assurance"
message: "GxP change request {{create-change.number}} submitted for {{system_name}}: {{short_description}} | Start: {{scheduled_start}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-gxp-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: notify-qa-board
method: POST
When a ServiceNow P1 incident for a critical system breaches its SLA, escalates by creating a Jira ticket and notifying Roche leadership in Teams.
naftiko: "0.5"
info:
label: "ServiceNow P1 Incident Escalation to Jira"
description: "When a ServiceNow P1 incident for a critical system breaches its SLA, escalates by creating a Jira ticket and notifying Roche leadership in Teams."
tags:
- itsm
- incident-response
- servicenow
- jira
- microsoft-teams
- escalation
capability:
exposes:
- type: mcp
namespace: incident-escalation
port: 8080
tools:
- name: escalate-p1-incident
description: "Given a ServiceNow P1 incident number that has breached its SLA, create a Jira Engineering ticket and notify the executive escalation Teams channel."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number (e.g., INC0012345)."
steps:
- name: get-incident
type: call
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
- name: create-escalation
type: call
call: "jira.create-escalation-ticket"
with:
project_key: "ENG"
issuetype: "Incident"
summary: "[P1 Escalation] {{get-incident.short_description}}"
description: "ServiceNow: {{incident_number}}\nImpact: {{get-incident.impact}}\nOpened: {{get-incident.opened_at}}"
- name: alert-leadership
type: call
call: "msteams.post-escalation"
with:
channel_id: "executive-escalations"
message: "P1 SLA breach: {{incident_number}}. Jira: {{create-escalation.key}}. {{get-incident.short_description}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
- type: http
namespace: jira
baseUri: "https://roche.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-escalation-ticket
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-escalation
method: POST
Retrieves standard operating procedure document metadata from SharePoint by document name for Roche quality operations.
naftiko: "0.5"
info:
label: "SharePoint SOP Document Retrieval"
description: "Retrieves standard operating procedure document metadata from SharePoint by document name for Roche quality operations."
tags:
- quality
- sharepoint
- document-management
- sop
capability:
exposes:
- type: mcp
namespace: quality-ops
port: 8080
tools:
- name: get-sop-document
description: "Given an SOP document name or ID, return the document title, version, approval status, and URL."
inputParameters:
- name: document_name
in: body
type: string
description: "The SOP document name or ID."
call: sharepoint.get-document
with:
document_name: "{{document_name}}"
outputParameters:
- name: title
type: string
mapping: "$.d.Title"
- name: version
type: string
mapping: "$.d.UIVersionLabel"
- name: modified
type: string
mapping: "$.d.Modified"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://roche.sharepoint.com/_api/web"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: files
path: "/GetFileByServerRelativeUrl('/sites/SOPs/{{document_name}}')"
inputParameters:
- name: document_name
in: path
operations:
- name: get-document
method: GET
Validates training records in SharePoint against Workday assignments and creates compliance tickets for gaps for Roche.
naftiko: "0.5"
info:
label: "SharePoint Training Record Validator"
description: "Validates training records in SharePoint against Workday assignments and creates compliance tickets for gaps for Roche."
tags:
- quality
- sharepoint
- workday
- compliance
capability:
exposes:
- type: mcp
namespace: quality-training
port: 8080
tools:
- name: validate-training-records
description: "Given a department and training program, cross-reference SharePoint records with Workday and report gaps."
inputParameters:
- name: department
in: body
type: string
description: "The department to validate."
- name: training_program
in: body
type: string
description: "The training program name."
steps:
- name: get-sharepoint-records
type: call
call: sharepoint.get-training-records
with:
department: "{{department}}"
program: "{{training_program}}"
- name: get-workday-assignments
type: call
call: workday.get-training-assignments
with:
department: "{{department}}"
program: "{{training_program}}"
- name: create-gap-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Training Compliance Gap: {{department}} — {{training_program}}"
category: "quality_compliance"
- name: notify-quality
type: call
call: msteams.send-message
with:
channel_id: "$secrets.quality_training_channel"
text: "Training Gap Alert: {{department}} for {{training_program}}. SharePoint: {{get-sharepoint-records.count}}. Workday: {{get-workday-assignments.count}}. SNOW: {{create-gap-ticket.number}}."
consumes:
- type: http
namespace: sharepoint
baseUri: "https://roche.sharepoint.com/_api/web"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: lists
path: "/lists"
operations:
- name: get-training-records
method: GET
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Learning/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/learningAssignments"
operations:
- name: get-training-assignments
method: GET
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Runs automated data quality checks on Snowflake clinical data warehouse tables and posts a validation report to the data engineering Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Clinical Data Quality Validation"
description: "Runs automated data quality checks on Snowflake clinical data warehouse tables and posts a validation report to the data engineering Teams channel."
tags:
- data
- analytics
- snowflake
- microsoft-teams
- data-quality
- clinical-trials
capability:
exposes:
- type: mcp
namespace: clinical-data-quality
port: 8080
tools:
- name: validate-clinical-data-quality
description: "Given a Snowflake database and schema containing clinical trial data, execute quality checks for completeness, referential integrity, and outliers, then post results to Teams."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database containing clinical trial data."
- name: schema_name
in: body
type: string
description: "The Snowflake schema to run quality checks on."
- name: channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the data engineering team."
steps:
- name: run-checks
type: call
call: "snowflake.execute-quality-check"
with:
database: "{{database_name}}"
schema: "{{schema_name}}"
- name: post-report
type: call
call: "msteams.post-quality-report"
with:
channel_id: "{{channel_id}}"
message: "Clinical data quality check {{database_name}}.{{schema_name}}: {{run-checks.pass_count}} passed, {{run-checks.fail_count}} failed."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: sql-statements
path: "/statements"
operations:
- name: execute-quality-check
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-quality-report
method: POST
Executes a predefined SQL query against the Roche clinical data warehouse in Snowflake and returns summary results.
naftiko: "0.5"
info:
label: "Snowflake Clinical Query Runner"
description: "Executes a predefined SQL query against the Roche clinical data warehouse in Snowflake and returns summary results."
tags:
- clinical-trials
- snowflake
- data-warehouse
- analytics
capability:
exposes:
- type: mcp
namespace: clinical-analytics
port: 8080
tools:
- name: run-clinical-query
description: "Given a query identifier and optional study ID filter, execute the corresponding Snowflake query and return results."
inputParameters:
- name: query_id
in: body
type: string
description: "Predefined query identifier (e.g., enrollment-summary, ae-counts)."
- name: study_id
in: body
type: string
description: "Optional clinical study ID filter."
call: snowflake.execute-query
with:
query_id: "{{query_id}}"
study_id: "{{study_id}}"
outputParameters:
- name: row_count
type: integer
mapping: "$.resultSetMetaData.numRows"
- name: data
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Monitors Snowflake drug discovery data pipeline task failures and ETL anomalies, raising a Jira incident when failures exceed threshold.
naftiko: "0.5"
info:
label: "Snowflake Drug Discovery Data Pipeline Health Check"
description: "Monitors Snowflake drug discovery data pipeline task failures and ETL anomalies, raising a Jira incident when failures exceed threshold."
tags:
- data
- analytics
- snowflake
- jira
- monitoring
- drug-discovery
capability:
exposes:
- type: mcp
namespace: drug-discovery-data-ops
port: 8080
tools:
- name: check-drug-discovery-pipeline
description: "Given a Snowflake warehouse name used for drug discovery ETL, query task history for failures in the last 24 hours and open a Jira incident if failures are detected."
inputParameters:
- name: warehouse_name
in: body
type: string
description: "The Snowflake warehouse for drug discovery data pipelines."
steps:
- name: query-task-failures
type: call
call: "snowflake.get-task-history"
with:
warehouse_name: "{{warehouse_name}}"
- name: create-incident
type: call
call: "jira.create-data-incident"
with:
project_key: "DATA"
issuetype: "Incident"
summary: "Drug discovery pipeline failures in {{warehouse_name}}"
description: "Failed tasks: {{query-task-failures.failure_count}} in warehouse {{warehouse_name}} in last 24 hours."
consumes:
- type: http
namespace: snowflake
baseUri: "https://roche.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/warehouses/{{warehouse_name}}/tasks/history"
inputParameters:
- name: warehouse_name
in: path
operations:
- name: get-task-history
method: GET
- type: http
namespace: jira
baseUri: "https://roche.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-data-incident
method: POST
Detects shipment delays in SAP, creates a ServiceNow case, and alerts the logistics team for Roche.
naftiko: "0.5"
info:
label: "Supply Chain Shipment Delay Escalation"
description: "Detects shipment delays in SAP, creates a ServiceNow case, and alerts the logistics team for Roche."
tags:
- supply-chain
- sap
- servicenow
- logistics
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: escalate-shipment-delay
description: "Given a delivery number and delay reason, create a ServiceNow case and notify supply chain leadership."
inputParameters:
- name: delivery_number
in: body
type: string
description: "The SAP delivery number."
- name: delay_reason
in: body
type: string
description: "Reason for the shipment delay."
- name: expected_date
in: body
type: string
description: "Originally expected delivery date."
- name: new_date
in: body
type: string
description: "Revised delivery date."
steps:
- name: create-sc-case
type: call
call: servicenow.create-incident
with:
short_description: "Shipment Delay: Delivery {{delivery_number}}"
category: "supply_chain"
description: "Delivery: {{delivery_number}} | Reason: {{delay_reason}} | Original: {{expected_date}} | Revised: {{new_date}}"
- name: notify-logistics
type: call
call: msteams.send-message
with:
channel_id: "$secrets.supply_chain_channel"
text: "Supply Chain Alert: Delivery {{delivery_number}} delayed from {{expected_date}} to {{new_date}}. Reason: {{delay_reason}}. Case: {{create-sc-case.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks the last extract refresh status for a Tableau workbook for Roche analytics operations.
naftiko: "0.5"
info:
label: "Tableau Workbook Refresh Status"
description: "Checks the last extract refresh status for a Tableau workbook for Roche analytics operations."
tags:
- analytics
- tableau
- reporting
- lookup
capability:
exposes:
- type: mcp
namespace: analytics-tableau
port: 8080
tools:
- name: get-workbook-refresh
description: "Given a Tableau workbook ID, return the last refresh status and extract time."
inputParameters:
- name: workbook_id
in: body
type: string
description: "The Tableau workbook ID."
call: tableau.get-extract-refresh
with:
workbook_id: "{{workbook_id}}"
outputParameters:
- name: status
type: string
mapping: "$.extractRefreshes[0].status"
- name: completed_at
type: string
mapping: "$.extractRefreshes[0].completedAt"
consumes:
- type: http
namespace: tableau
baseUri: "https://roche.online.tableau.com/api/3.21"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refreshes"
inputParameters:
- name: workbook_id
in: path
operations:
- name: get-extract-refresh
method: GET
Manages infrastructure provisioning by creating ServiceNow change requests, triggering Terraform plans, and notifying the cloud team for Roche.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Provisioning with Approval"
description: "Manages infrastructure provisioning by creating ServiceNow change requests, triggering Terraform plans, and notifying the cloud team for Roche."
tags:
- devops
- terraform
- servicenow
- cloud
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: provision-infrastructure
description: "Given infrastructure requirements, create a change request, generate a Terraform plan, and notify cloud engineering."
inputParameters:
- name: environment
in: body
type: string
description: "Target environment (dev, staging, production)."
- name: resource_type
in: body
type: string
description: "Type of resource to provision."
- name: requestor
in: body
type: string
description: "Name of the requestor."
steps:
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "Infra Provisioning: {{resource_type}} in {{environment}}"
category: "cloud_infrastructure"
- name: trigger-plan
type: call
call: github.trigger-workflow
with:
repo: "infrastructure"
workflow: "terraform-plan.yml"
- name: notify-cloud-team
type: call
call: msteams.send-message
with:
channel_id: "$secrets.cloud_eng_channel"
text: "Infra Request: {{resource_type}} in {{environment}} by {{requestor}}. Change: {{create-change.number}}. Terraform plan triggered."
consumes:
- type: http
namespace: servicenow
baseUri: "https://roche.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: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflows
path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current lifecycle status of a document in Veeva Vault by document ID for Roche regulatory operations.
naftiko: "0.5"
info:
label: "Veeva Vault Document Status Lookup"
description: "Retrieves the current lifecycle status of a document in Veeva Vault by document ID for Roche regulatory operations."
tags:
- regulatory
- veeva-vault
- document-management
- lookup
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: get-document-status
description: "Given a Veeva Vault document ID, return the lifecycle state, owner, and last modified date."
inputParameters:
- name: document_id
in: body
type: string
description: "The Veeva Vault document ID."
call: veeva.get-document
with:
document_id: "{{document_id}}"
outputParameters:
- name: lifecycle_state
type: string
mapping: "$.responseDetails.lifecycle__v"
- name: owner
type: string
mapping: "$.responseDetails.owner__v"
- name: last_modified
type: string
mapping: "$.responseDetails.last_modified_date__v"
consumes:
- type: http
namespace: veeva
baseUri: "https://roche.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
Orchestrates vendor qualification reviews by pulling vendor data from SAP, creating a ServiceNow assessment task, and notifying procurement for Roche.
naftiko: "0.5"
info:
label: "Vendor Qualification Review Orchestrator"
description: "Orchestrates vendor qualification reviews by pulling vendor data from SAP, creating a ServiceNow assessment task, and notifying procurement for Roche."
tags:
- procurement
- sap
- servicenow
- vendor-management
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: initiate-vendor-review
description: "Given a vendor number, retrieve vendor details from SAP, create an assessment task, and notify procurement."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor number."
- name: review_type
in: body
type: string
description: "Type of qualification review (initial, periodic, for-cause)."
steps:
- name: get-vendor-data
type: call
call: sap.get-vendor
with:
vendor_number: "{{vendor_number}}"
- name: create-assessment
type: call
call: servicenow.create-incident
with:
short_description: "Vendor Qualification: {{get-vendor-data.SupplierName}} — {{review_type}}"
category: "vendor_management"
- name: notify-procurement
type: call
call: msteams.send-message
with:
channel_id: "$secrets.procurement_channel"
text: "Vendor Review initiated for {{get-vendor-data.SupplierName}} ({{vendor_number}}). Type: {{review_type}}. Task: {{create-assessment.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://roche.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves employee absence and leave balance from Workday for Roche HR operations.
naftiko: "0.5"
info:
label: "Workday Absence Balance Lookup"
description: "Retrieves employee absence and leave balance from Workday for Roche HR operations."
tags:
- hr
- workday
- absence
- lookup
capability:
exposes:
- type: mcp
namespace: hr-absence
port: 8080
tools:
- name: get-absence-balance
description: "Given an employee ID, return the PTO balance, sick leave balance, and next scheduled absence."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: workday.get-absence-balance
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: pto_balance
type: string
mapping: "$.TimeOff.PTO_Balance"
- name: sick_balance
type: string
mapping: "$.TimeOff.Sick_Balance"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Absence_Management/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: absences
path: "/workers/{{employee_id}}/absenceBalances"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-absence-balance
method: GET
Retrieves compensation plan details for an employee from Workday for Roche HR total rewards operations.
naftiko: "0.5"
info:
label: "Workday Compensation Lookup"
description: "Retrieves compensation plan details for an employee from Workday for Roche HR total rewards operations."
tags:
- hr
- workday
- compensation
- lookup
capability:
exposes:
- type: mcp
namespace: hr-rewards
port: 8080
tools:
- name: get-compensation
description: "Given an employee ID, return the base pay, bonus target percentage, and compensation grade."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: workday.get-compensation
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: base_pay
type: string
mapping: "$.Compensation.Base_Pay"
- name: bonus_target
type: string
mapping: "$.Compensation.Bonus_Target_Percent"
- name: grade
type: string
mapping: "$.Compensation.Compensation_Grade"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Compensation/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: compensation
path: "/workers/{{employee_id}}/compensationPlans"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-compensation
method: GET
Retrieves employee profile details from Workday by employee ID for Roche HR operations.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves employee profile details from Workday by employee ID for Roche HR operations."
tags:
- hr
- workday
- employee
- lookup
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: get-employee-profile
description: "Given a Workday employee ID, return the name, department, manager, and hire date."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: workday.get-worker
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.Worker.Worker_Data.Personal_Data.Name_Data.Legal_Name.Name_Detail_Data.Formatted_Name"
- name: department
type: string
mapping: "$.Worker.Worker_Data.Organization_Data.Worker_Organization_Data[0].Organization_Data.Organization_Name"
- name: hire_date
type: string
mapping: "$.Worker.Worker_Data.Employment_Data.Worker_Status_Data.Hire_Date"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Human_Resources/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-worker
method: GET
Identifies overdue compliance training assignments in Workday and sends reminder notifications for Roche.
naftiko: "0.5"
info:
label: "Workday Learning Compliance Reminder"
description: "Identifies overdue compliance training assignments in Workday and sends reminder notifications for Roche."
tags:
- hr
- workday
- compliance
- training
capability:
exposes:
- type: mcp
namespace: hr-compliance
port: 8080
tools:
- name: send-compliance-reminders
description: "Given a compliance training program ID, find overdue assignments and send reminders."
inputParameters:
- name: program_id
in: body
type: string
description: "The Workday learning program ID."
- name: days_overdue
in: body
type: integer
description: "Minimum days overdue to trigger reminder."
steps:
- name: get-overdue
type: call
call: workday.get-overdue-training
with:
program_id: "{{program_id}}"
days_overdue: "{{days_overdue}}"
- name: send-reminder
type: call
call: msteams.send-message
with:
channel_id: "$secrets.hr_compliance_channel"
text: "Compliance Training Alert: {{get-overdue.count}} employees overdue for program {{program_id}} (>{{days_overdue}} days)."
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Learning/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/learningAssignments?overdue=true&program={{program_id}}"
inputParameters:
- name: program_id
in: query
operations:
- name: get-overdue-training
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves a Roche employee's current leave balances and pending absence requests from Workday for HR business partners and managers.
naftiko: "0.5"
info:
label: "Workday Leave Balance Lookup"
description: "Retrieves a Roche employee's current leave balances and pending absence requests from Workday for HR business partners and managers."
tags:
- hr
- workday
- leave-management
capability:
exposes:
- type: mcp
namespace: hr-leave
port: 8080
tools:
- name: get-leave-balance
description: "Given a Workday employee ID, return current PTO, sick leave, and other leave type balances along with any pending absence requests."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID."
call: "workday.get-leave-balance"
with:
worker_id: "{{employee_id}}"
outputParameters:
- name: pto_balance
type: number
mapping: "$.data.timeOffBalances.ptoBalance"
- name: sick_balance
type: number
mapping: "$.data.timeOffBalances.sickBalance"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: leave-balances
path: "/roche/workers/{{worker_id}}/timeOffBalances"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-leave-balance
method: GET
Initiates the global annual performance review cycle in Workday and sends kick-off notifications to managers across Roche's divisions in Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Performance Review Cycle Launcher"
description: "Initiates the global annual performance review cycle in Workday and sends kick-off notifications to managers across Roche's divisions in Microsoft Teams."
tags:
- hr
- performance-management
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-performance
port: 8080
tools:
- name: launch-global-review-cycle
description: "Given a review cycle name and deadline, initiate the Workday performance review process for all active Roche employees globally and notify managers in Teams."
inputParameters:
- name: cycle_name
in: body
type: string
description: "The performance review cycle name (e.g., 2025 Annual PDR)."
- name: deadline
in: body
type: string
description: "Review completion deadline in YYYY-MM-DD format."
steps:
- name: create-cycle
type: call
call: "workday.create-review-cycle"
with:
name: "{{cycle_name}}"
deadline: "{{deadline}}"
- name: notify-managers
type: call
call: "msteams.broadcast-review-kickoff"
with:
channel_id: "global-people-managers"
message: "Performance review cycle '{{cycle_name}}' is now open globally. Deadline: {{deadline}}. Workday cycle ID: {{create-cycle.cycle_id}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: review-cycles
path: "/roche/performanceReviews"
operations:
- name: create-review-cycle
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/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: broadcast-review-kickoff
method: POST
Processes new position requisitions by validating budget in SAP, creating the requisition in Workday, and notifying HR for Roche.
naftiko: "0.5"
info:
label: "Workday Position Requisition Approval Workflow"
description: "Processes new position requisitions by validating budget in SAP, creating the requisition in Workday, and notifying HR for Roche."
tags:
- hr
- workday
- sap
- hiring
capability:
exposes:
- type: mcp
namespace: hr-talent
port: 8080
tools:
- name: process-position-requisition
description: "Given requisition details, validate budget, create the position in Workday, and notify HR."
inputParameters:
- name: department
in: body
type: string
description: "The department requesting the position."
- name: job_title
in: body
type: string
description: "The job title."
- name: cost_center
in: body
type: string
description: "The SAP cost center."
- name: hiring_manager
in: body
type: string
description: "Name of the hiring manager."
steps:
- name: validate-budget
type: call
call: sap.check-budget
with:
cost_center: "{{cost_center}}"
amount_type: "headcount"
- name: create-requisition
type: call
call: workday.create-requisition
with:
department: "{{department}}"
job_title: "{{job_title}}"
hiring_manager: "{{hiring_manager}}"
- name: notify-hr
type: call
call: msteams.send-message
with:
channel_id: "$secrets.hr_recruiting_channel"
text: "New Position Requisition: {{job_title}} in {{department}}. Manager: {{hiring_manager}}. Budget: {{validate-budget.status}}. Workday Req: {{create-requisition.requisition_id}}."
consumes:
- type: http
namespace: sap
baseUri: "https://roche-s4.sap.com/sap/opu/odata/sap/API_BUDGET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/"
operations:
- name: create-record
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-services1.myworkday.com/ccx/service/roche/Recruiting/v42.0"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/jobRequisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When an employee's role or division changes in Workday, updates their Salesforce profile, revises Okta group memberships, and notifies the new manager in Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Propagation"
description: "When an employee's role or division changes in Workday, updates their Salesforce profile, revises Okta group memberships, and notifies the new manager in Teams."
tags:
- hr
- identity
- workday
- salesforce
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-role-change
port: 8080
tools:
- name: propagate-role-change
description: "Given a Workday employee ID and new role details, update the Salesforce user profile, revise Okta group memberships, and send a Teams notification to the new manager."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID of the employee changing roles."
- name: new_role
in: body
type: string
description: "The new job title or role name."
- name: new_division
in: body
type: string
description: "The new division (e.g., Pharmaceuticals, Diagnostics, Genentech)."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: update-salesforce
type: call
call: "salesforce.update-user"
with:
user_id: "{{get-employee.salesforce_user_id}}"
title: "{{new_role}}"
department: "{{new_division}}"
- name: notify-manager
type: call
call: "msteams.send-role-notice"
with:
recipient: "{{get-employee.manager_email}}"
message: "{{get-employee.full_name}} has moved to {{new_division}} as {{new_role}}. Okta and Salesforce have been updated."
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: "/roche/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: salesforce
baseUri: "https://roche.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-role-notice
method: POST