Novo Nordisk Capabilities
Naftiko 0.5 capability definitions for Novo Nordisk - 100 capabilities showing integration workflows and service orchestrations.
Retrieves a supplier risk profile from SAP Ariba Supplier Risk and returns compliance status, financial health score, and regulatory certification status for procurement.
naftiko: "0.5"
info:
label: "Ariba Supplier Risk Assessment"
description: "Retrieves a supplier risk profile from SAP Ariba Supplier Risk and returns compliance status, financial health score, and regulatory certification status for procurement."
tags:
- procurement
- supplier-management
- sap-ariba
- risk
capability:
exposes:
- type: mcp
namespace: supplier-risk
port: 8080
tools:
- name: get-supplier-risk
description: "Look up a supplier risk profile in SAP Ariba by supplier ID. Returns overall risk score, compliance status, and certification validity."
inputParameters:
- name: supplier_id
in: body
type: string
description: "The SAP Ariba supplier identifier."
call: "ariba.get-supplier-risk"
with:
supplier_id: "{{supplier_id}}"
outputParameters:
- name: risk_score
type: number
mapping: "$.data.overallRiskScore"
- name: compliance_status
type: string
mapping: "$.data.complianceStatus"
- name: gmp_certification
type: string
mapping: "$.data.certifications.gmp.status"
- name: financial_health
type: string
mapping: "$.data.financialHealthIndicator"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-risk/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers/{{supplier_id}}/risk-profile"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier-risk
method: GET
When a clinical data query is opened in Medidata Rave, retrieves the query details, creates a follow-up task in Jira for the data management team, and notifies the site monitor on Microsoft Teams.
naftiko: "0.5"
info:
label: "Clinical Data Query Resolution Workflow"
description: "When a clinical data query is opened in Medidata Rave, retrieves the query details, creates a follow-up task in Jira for the data management team, and notifies the site monitor on Microsoft Teams."
tags:
- clinical-trials
- data-management
- medidata-rave
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ct-data-queries
port: 8080
tools:
- name: route-data-query
description: "Given a Medidata Rave query ID and study ID, retrieve the query, create a Jira task for data management, and notify the site monitor."
inputParameters:
- name: study_id
in: body
type: string
description: "The Medidata Rave study identifier."
- name: query_id
in: body
type: string
description: "The data query identifier from Medidata Rave."
- name: monitor_email
in: body
type: string
description: "The clinical site monitor email address."
steps:
- name: get-query
type: call
call: "medidata.get-query"
with:
study_id: "{{study_id}}"
query_id: "{{query_id}}"
- name: create-jira-task
type: call
call: "jira.create-issue"
with:
project_key: "CDM"
issue_type: "Task"
summary: "Data query {{query_id}} — {{get-query.query_text}}"
description: "Study: {{study_id}}, Site: {{get-query.site_number}}, Subject: {{get-query.subject_id}}, Form: {{get-query.form_name}}, Field: {{get-query.field_name}}. Query: {{get-query.query_text}}"
priority: "{{get-query.priority}}"
- name: notify-monitor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{monitor_email}}"
text: "Data query {{query_id}} opened for study {{study_id}}, site {{get-query.site_number}}. Subject: {{get-query.subject_id}}. Jira: {{create-jira-task.key}}. Query: {{get-query.query_text}}"
consumes:
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: queries
path: "/studies/{{study_id}}/queries/{{query_id}}"
inputParameters:
- name: study_id
in: path
- name: query_id
in: path
operations:
- name: get-query
method: GET
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Orchestrates clinical trial site activation by verifying IRB approval in Veeva Vault eTMF, confirming investigator credentials in Veeva CRM, provisioning the site in Medidata Rave, and notifying the clinical operations team on Microsoft Teams.
naftiko: "0.5"
info:
label: "Clinical Site Activation Orchestrator"
description: "Orchestrates clinical trial site activation by verifying IRB approval in Veeva Vault eTMF, confirming investigator credentials in Veeva CRM, provisioning the site in Medidata Rave, and notifying the clinical operations team on Microsoft Teams."
tags:
- clinical-trials
- site-activation
- veeva-vault
- veeva-crm
- medidata-rave
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ct-site-activation
port: 8080
tools:
- name: activate-clinical-site
description: "Given a study ID, site number, and principal investigator NPI, verify IRB approval, confirm investigator credentials, provision the site in Rave, and notify the team."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study identifier."
- name: site_number
in: body
type: string
description: "The clinical site number."
- name: pi_npi
in: body
type: string
description: "The principal investigator NPI number."
steps:
- name: check-irb-approval
type: call
call: "veeva-etmf.get-irb-status"
with:
study_id: "{{study_id}}"
site_number: "{{site_number}}"
- name: get-investigator
type: call
call: "veeva-crm.get-hcp"
with:
npi_number: "{{pi_npi}}"
- name: provision-site
type: call
call: "medidata.activate-site"
with:
study_id: "{{study_id}}"
site_number: "{{site_number}}"
pi_name: "{{get-investigator.full_name}}"
- name: notify-clinical-ops
type: call
call: "msteams.send-channel-message"
with:
team_id: "clinical-operations"
channel_id: "site-activation"
text: "Site {{site_number}} activated for study {{study_id}}. PI: {{get-investigator.full_name}}. IRB status: {{check-irb-approval.approval_status}}. Rave provisioning: {{provision-site.status}}."
consumes:
- type: http
namespace: veeva-etmf
baseUri: "https://novonordisk-etmf.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_etmf_token"
resources:
- name: irb-status
path: "/objects/site__v/{{site_number}}/irb_approval"
inputParameters:
- name: site_number
in: path
operations:
- name: get-irb-status
method: GET
- type: http
namespace: veeva-crm
baseUri: "https://novonordisk.veevacrm.com/api/v1"
authentication:
type: bearer
token: "$secrets.veeva_crm_token"
resources:
- name: hcps
path: "/accounts?q=npi__v={{npi_number}}"
inputParameters:
- name: npi_number
in: query
operations:
- name: get-hcp
method: GET
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: sites
path: "/studies/{{study_id}}/sites/{{site_number}}/activate"
inputParameters:
- name: study_id
in: path
- name: site_number
in: path
operations:
- name: activate-site
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
When a site investigator logs an adverse event in Medidata Rave, retrieves trial and patient context, creates a safety case in Veeva Vault Safety, and notifies the pharmacovigilance team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Clinical Trial Adverse Event Reporter"
description: "When a site investigator logs an adverse event in Medidata Rave, retrieves trial and patient context, creates a safety case in Veeva Vault Safety, and notifies the pharmacovigilance team via Microsoft Teams."
tags:
- pharmacovigilance
- clinical-trials
- medidata-rave
- veeva-vault
- microsoft-teams
- adverse-events
capability:
exposes:
- type: mcp
namespace: pv-adverse-events
port: 8080
tools:
- name: report-adverse-event
description: "Given a Medidata Rave adverse event form ID and study ID, pull event details, create a Veeva Vault Safety case, and alert the pharmacovigilance team on Microsoft Teams."
inputParameters:
- name: study_id
in: body
type: string
description: "The Medidata Rave study identifier."
- name: ae_form_id
in: body
type: string
description: "The adverse event form ID from Medidata Rave."
- name: site_number
in: body
type: string
description: "The clinical site number where the event was reported."
steps:
- name: get-ae-form
type: call
call: "medidata.get-ae-form"
with:
study_id: "{{study_id}}"
form_id: "{{ae_form_id}}"
- name: create-safety-case
type: call
call: "veeva-safety.create-case"
with:
case_type: "adverse_event"
study_id: "{{study_id}}"
site_number: "{{site_number}}"
event_term: "{{get-ae-form.preferred_term}}"
severity: "{{get-ae-form.severity}}"
onset_date: "{{get-ae-form.onset_date}}"
patient_id: "{{get-ae-form.subject_id}}"
- name: notify-pv-team
type: call
call: "msteams.send-channel-message"
with:
team_id: "pv-safety-operations"
channel_id: "ae-alerts"
text: "New AE reported — Study {{study_id}}, Site {{site_number}}: {{get-ae-form.preferred_term}} ({{get-ae-form.severity}}). Safety case {{create-safety-case.case_number}} created in Veeva Vault."
consumes:
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: ae-forms
path: "/studies/{{study_id}}/forms/{{form_id}}"
inputParameters:
- name: study_id
in: path
- name: form_id
in: path
operations:
- name: get-ae-form
method: GET
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: cases
path: "/objects/safety_case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Queries Medidata Rave for current enrollment counts, compares against CTMS targets, and posts a progress update to the clinical operations Slack channel when enrollment milestones are reached or at risk.
naftiko: "0.5"
info:
label: "Clinical Trial Enrollment Tracker and Alert"
description: "Queries Medidata Rave for current enrollment counts, compares against CTMS targets, and posts a progress update to the clinical operations Slack channel when enrollment milestones are reached or at risk."
tags:
- clinical-trials
- medidata-rave
- enrollment
- ctms
- slack
capability:
exposes:
- type: mcp
namespace: ct-enrollment
port: 8080
tools:
- name: track-enrollment
description: "Given a study ID, pull enrollment counts from Medidata Rave, compare against CTMS targets, and alert clinical ops on Slack."
inputParameters:
- name: study_id
in: body
type: string
description: "The Medidata Rave study identifier."
steps:
- name: get-enrollment
type: call
call: "medidata.get-enrollment"
with:
study_id: "{{study_id}}"
- name: get-targets
type: call
call: "ctms.get-enrollment-targets"
with:
study_id: "{{study_id}}"
- name: post-update
type: call
call: "slack.post-message"
with:
channel: "clinical-operations"
text: "Enrollment update — Study {{study_id}}: Enrolled {{get-enrollment.enrolled_count}}/{{get-targets.target_enrollment}} ({{get-enrollment.sites_active}} active sites). Screened: {{get-enrollment.screened_count}}. Target date: {{get-targets.target_date}}."
consumes:
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: enrollment
path: "/studies/{{study_id}}/enrollment"
inputParameters:
- name: study_id
in: path
operations:
- name: get-enrollment
method: GET
- type: http
namespace: ctms
baseUri: "https://ctms.novonordisk.com/api/v2"
authentication:
type: bearer
token: "$secrets.ctms_token"
resources:
- name: enrollment-targets
path: "/studies/{{study_id}}/enrollment-targets"
inputParameters:
- name: study_id
in: path
operations:
- name: get-enrollment-targets
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Aggregates adverse event data from Medidata Rave, pulls the latest DSMB recommendations from SharePoint, generates a periodic safety report in Veeva Vault eTMF, and notifies the medical monitor on Microsoft Teams.
naftiko: "0.5"
info:
label: "Clinical Trial Safety Report Generator"
description: "Aggregates adverse event data from Medidata Rave, pulls the latest DSMB recommendations from SharePoint, generates a periodic safety report in Veeva Vault eTMF, and notifies the medical monitor on Microsoft Teams."
tags:
- clinical-trials
- safety-reporting
- medidata-rave
- sharepoint
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ct-safety-reports
port: 8080
tools:
- name: generate-safety-report
description: "Given a study ID and reporting period, aggregate AE data, pull DSMB notes, create a safety report in eTMF, and notify the medical monitor."
inputParameters:
- name: study_id
in: body
type: string
description: "The clinical study identifier."
- name: period_start
in: body
type: string
description: "Reporting period start date (YYYY-MM-DD)."
- name: period_end
in: body
type: string
description: "Reporting period end date (YYYY-MM-DD)."
- name: medical_monitor_email
in: body
type: string
description: "Email of the medical monitor."
steps:
- name: get-ae-summary
type: call
call: "medidata.get-ae-summary"
with:
study_id: "{{study_id}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
- name: get-dsmb-notes
type: call
call: "sharepoint.get-file"
with:
site_id: "clinical-ops"
file_path: "DSMB/{{study_id}}/latest_recommendations.pdf"
- name: create-safety-report
type: call
call: "veeva-etmf.create-document"
with:
study_id: "{{study_id}}"
document_type: "periodic_safety_report"
title: "Safety Report {{study_id}} ({{period_start}} to {{period_end}})"
ae_count: "{{get-ae-summary.total_events}}"
sae_count: "{{get-ae-summary.serious_events}}"
- name: notify-medical-monitor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{medical_monitor_email}}"
text: "Periodic safety report generated for study {{study_id}} ({{period_start}} to {{period_end}}). Total AEs: {{get-ae-summary.total_events}}, SAEs: {{get-ae-summary.serious_events}}. Report: {{create-safety-report.document_url}}."
consumes:
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: ae-summary
path: "/studies/{{study_id}}/adverse-events/summary"
inputParameters:
- name: study_id
in: path
operations:
- name: get-ae-summary
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file
method: GET
- type: http
namespace: veeva-etmf
baseUri: "https://novonordisk-etmf.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_etmf_token"
resources:
- name: documents
path: "/objects/documents"
operations:
- name: create-document
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves an expense report from SAP Concur, validates the submitter against Workday, and creates a ServiceNow compliance task when policy exceptions are detected.
naftiko: "0.5"
info:
label: "Concur Expense Report Review and Escalation"
description: "Retrieves an expense report from SAP Concur, validates the submitter against Workday, and creates a ServiceNow compliance task when policy exceptions are detected."
tags:
- finance
- concur
- sap-concur
- expense
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: finance-expense
port: 8080
tools:
- name: review-expense-report
description: "Given a Concur report ID and employee ID, fetch the report, validate the submitter, and escalate policy exceptions to ServiceNow."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: employee_id
in: body
type: string
description: "The Workday employee ID of the expense submitter."
steps:
- name: get-report
type: call
call: "concur.get-report"
with:
report_id: "{{report_id}}"
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-review-task
type: call
call: "servicenow.create-task"
with:
short_description: "Expense policy review: {{get-report.report_name}} — {{get-employee.full_name}}"
description: "Report {{report_id}} total: {{get-report.total_amount}} {{get-report.currency}}. Submitter: {{get-employee.full_name}} ({{get-employee.department}}). Policy exceptions: {{get-report.policy_exceptions}}."
assigned_group: "Finance_Audit"
category: "expense_review"
consumes:
- type: http
namespace: concur
baseUri: "https://us2.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-report
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
When a travel request is submitted in SAP Concur, validates against HCP interaction compliance rules, checks Sunshine Act reporting requirements, and creates a compliance task in ServiceNow if required.
naftiko: "0.5"
info:
label: "Concur Travel Request to Compliance Check"
description: "When a travel request is submitted in SAP Concur, validates against HCP interaction compliance rules, checks Sunshine Act reporting requirements, and creates a compliance task in ServiceNow if required."
tags:
- compliance
- concur
- sap-concur
- sunshine-act
- servicenow
- hcp-engagement
capability:
exposes:
- type: mcp
namespace: travel-compliance
port: 8080
tools:
- name: check-travel-compliance
description: "Given a Concur travel request ID and employee ID, validate HCP interaction compliance and Sunshine Act reporting needs."
inputParameters:
- name: request_id
in: body
type: string
description: "The SAP Concur travel request ID."
- name: employee_id
in: body
type: string
description: "The Workday employee ID of the traveler."
steps:
- name: get-travel-request
type: call
call: "concur.get-travel-request"
with:
request_id: "{{request_id}}"
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-compliance-task
type: call
call: "servicenow.create-task"
with:
short_description: "Sunshine Act review: {{get-employee.full_name}} travel to {{get-travel-request.destination}}"
description: "Travel request {{request_id}} by {{get-employee.full_name}} ({{get-employee.department}}) to {{get-travel-request.destination}} on {{get-travel-request.travel_date}}. Purpose: {{get-travel-request.purpose}}. Estimated cost: {{get-travel-request.total_estimate}}. Review for HCP interaction and Sunshine Act reporting."
assigned_group: "Compliance_HCP"
category: "sunshine_act_review"
consumes:
- type: http
namespace: concur
baseUri: "https://us2.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: travel-requests
path: "/travelrequest/requests/{{request_id}}"
inputParameters:
- name: request_id
in: path
operations:
- name: get-travel-request
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Verifies patient copay card eligibility through the hub services API, activates the copay benefit in Salesforce Health Cloud, and sends a confirmation to the prescriber via Veeva CRM Approved Email.
naftiko: "0.5"
info:
label: "Copay Assistance Eligibility and Activation"
description: "Verifies patient copay card eligibility through the hub services API, activates the copay benefit in Salesforce Health Cloud, and sends a confirmation to the prescriber via Veeva CRM Approved Email."
tags:
- patient-support
- copay
- salesforce-health-cloud
- veeva-crm
- patient-access
capability:
exposes:
- type: mcp
namespace: copay-assistance
port: 8080
tools:
- name: activate-copay-card
description: "Given a patient ID and prescriber NPI, verify copay eligibility, activate the benefit, and notify the prescriber via Veeva CRM Approved Email."
inputParameters:
- name: patient_id
in: body
type: string
description: "The Salesforce Health Cloud patient ID."
- name: prescriber_npi
in: body
type: string
description: "The prescriber NPI number."
- name: product_ndc
in: body
type: string
description: "The NDC code of the prescribed product."
steps:
- name: check-eligibility
type: call
call: "sfdc-health.check-copay-eligibility"
with:
patient_id: "{{patient_id}}"
product_ndc: "{{product_ndc}}"
- name: activate-benefit
type: call
call: "sfdc-health.activate-copay"
with:
patient_id: "{{patient_id}}"
product_ndc: "{{product_ndc}}"
max_benefit: "{{check-eligibility.max_monthly_benefit}}"
- name: notify-prescriber
type: call
call: "veeva-crm.send-approved-email"
with:
npi_number: "{{prescriber_npi}}"
template: "copay_card_activated"
merge_fields:
patient_id: "{{patient_id}}"
card_number: "{{activate-benefit.card_number}}"
max_benefit: "{{check-eligibility.max_monthly_benefit}}"
consumes:
- type: http
namespace: sfdc-health
baseUri: "https://novonordisk.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.sfdc_token"
resources:
- name: copay-eligibility
path: "/sobjects/CopayEligibility__c/{{patient_id}}"
inputParameters:
- name: patient_id
in: path
operations:
- name: check-copay-eligibility
method: GET
- name: copay-activation
path: "/sobjects/CopayBenefit__c"
operations:
- name: activate-copay
method: POST
- type: http
namespace: veeva-crm
baseUri: "https://novonordisk.veevacrm.com/api/v1"
authentication:
type: bearer
token: "$secrets.veeva_crm_token"
resources:
- name: approved-email
path: "/approved-email/send"
operations:
- name: send-approved-email
method: POST
Pulls patient outcome data from the electronic health record integration, retrieves prescription adherence from the pharmacy benefit manager API, generates an outcome report in SharePoint, and notifies the HEOR team on Slack.
naftiko: "0.5"
info:
label: "Diabetes Patient Outcome Reporting Pipeline"
description: "Pulls patient outcome data from the electronic health record integration, retrieves prescription adherence from the pharmacy benefit manager API, generates an outcome report in SharePoint, and notifies the HEOR team on Slack."
tags:
- patient-outcomes
- heor
- ehr-integration
- pharmacy-benefits
- sharepoint
- slack
capability:
exposes:
- type: mcp
namespace: patient-outcomes
port: 8080
tools:
- name: generate-outcome-report
description: "Given a patient cohort ID and time period, pull EHR outcome data, get adherence metrics, store the report, and notify the HEOR team."
inputParameters:
- name: cohort_id
in: body
type: string
description: "The patient cohort identifier."
- name: period_start
in: body
type: string
description: "Reporting period start (YYYY-MM-DD)."
- name: period_end
in: body
type: string
description: "Reporting period end (YYYY-MM-DD)."
steps:
- name: get-outcomes
type: call
call: "ehr-integration.get-cohort-outcomes"
with:
cohort_id: "{{cohort_id}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
- name: get-adherence
type: call
call: "pbm.get-adherence-metrics"
with:
cohort_id: "{{cohort_id}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
- name: store-report
type: call
call: "sharepoint.create-file"
with:
site_id: "heor-analytics"
file_path: "OutcomeReports/{{cohort_id}}_{{period_start}}_{{period_end}}.json"
content_type: "application/json"
- name: notify-heor
type: call
call: "slack.post-message"
with:
channel: "heor-analytics"
text: "Outcome report generated for cohort {{cohort_id}} ({{period_start}} to {{period_end}}). Patients: {{get-outcomes.patient_count}}. Mean HbA1c change: {{get-outcomes.mean_hba1c_change}}. Adherence rate: {{get-adherence.pdc_rate}}%. Report: {{store-report.url}}"
consumes:
- type: http
namespace: ehr-integration
baseUri: "https://ehr-hub.novonordisk.com/api/v1"
authentication:
type: bearer
token: "$secrets.ehr_token"
resources:
- name: cohort-outcomes
path: "/cohorts/{{cohort_id}}/outcomes"
inputParameters:
- name: cohort_id
in: path
operations:
- name: get-cohort-outcomes
method: GET
- type: http
namespace: pbm
baseUri: "https://pbm-analytics.novonordisk.com/api/v1"
authentication:
type: bearer
token: "$secrets.pbm_token"
resources:
- name: adherence
path: "/cohorts/{{cohort_id}}/adherence"
inputParameters:
- name: cohort_id
in: path
operations:
- name: get-adherence-metrics
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves the latest artwork version from Veeva Vault PromoMats, routes it for regulatory and quality review via ServiceNow, and notifies the labeling manager on Microsoft Teams when approvals are complete.
naftiko: "0.5"
info:
label: "Drug Labeling Artwork Approval Pipeline"
description: "Retrieves the latest artwork version from Veeva Vault PromoMats, routes it for regulatory and quality review via ServiceNow, and notifies the labeling manager on Microsoft Teams when approvals are complete."
tags:
- regulatory
- labeling
- veeva-vault
- servicenow
- microsoft-teams
- packaging
capability:
exposes:
- type: mcp
namespace: labeling-approval
port: 8080
tools:
- name: route-artwork-approval
description: "Given a Veeva Vault PromoMats document ID and labeling manager email, retrieve the artwork, create review tasks, and notify upon completion."
inputParameters:
- name: document_id
in: body
type: string
description: "The Veeva Vault PromoMats artwork document ID."
- name: labeling_manager_email
in: body
type: string
description: "Email address of the labeling manager."
- name: product_name
in: body
type: string
description: "The product name on the label."
steps:
- name: get-artwork
type: call
call: "veeva-promomats.get-document"
with:
document_id: "{{document_id}}"
- name: create-reg-review
type: call
call: "servicenow.create-task"
with:
short_description: "Regulatory review: {{product_name}} label artwork v{{get-artwork.version}}"
description: "Review label artwork for {{product_name}}. Document: {{document_id}}, Version: {{get-artwork.version}}. URL: {{get-artwork.document_url}}."
assigned_group: "Regulatory_Labeling"
category: "labeling_review"
- name: create-qa-review
type: call
call: "servicenow.create-task"
with:
short_description: "QA review: {{product_name}} label artwork v{{get-artwork.version}}"
description: "Quality review for {{product_name}} label artwork. Document: {{document_id}}, Version: {{get-artwork.version}}."
assigned_group: "QA_Labeling"
category: "labeling_review"
- name: notify-manager
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{labeling_manager_email}}"
text: "Label artwork for {{product_name}} (v{{get-artwork.version}}) routed for review. Regulatory task: {{create-reg-review.number}}, QA task: {{create-qa-review.number}}."
consumes:
- type: http
namespace: veeva-promomats
baseUri: "https://novonordisk-promomats.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_promomats_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Orchestrates batch release by pulling QC results from LabWare LIMS, verifying batch record completion in SAP, generating the certificate of analysis in Veeva Vault QMS, and notifying the QP (Qualified Person) for final release.
naftiko: "0.5"
info:
label: "Drug Product Batch Release Orchestrator"
description: "Orchestrates batch release by pulling QC results from LabWare LIMS, verifying batch record completion in SAP, generating the certificate of analysis in Veeva Vault QMS, and notifying the QP (Qualified Person) for final release."
tags:
- manufacturing
- batch-release
- labware
- sap
- sap-s4hana
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: mfg-release
port: 8080
tools:
- name: orchestrate-batch-release
description: "Given a batch number and plant code, pull QC results, verify SAP batch record, generate CoA, and notify the Qualified Person for release approval."
inputParameters:
- name: batch_number
in: body
type: string
description: "The manufacturing batch number."
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: qp_worker_id
in: body
type: string
description: "The Workday worker ID of the Qualified Person."
steps:
- name: get-qc-results
type: call
call: "labware.get-batch-results"
with:
batch_number: "{{batch_number}}"
- name: get-batch-record
type: call
call: "sap.get-batch"
with:
batch_number: "{{batch_number}}"
plant_code: "{{plant_code}}"
- name: generate-coa
type: call
call: "veeva-qms.create-coa"
with:
batch_number: "{{batch_number}}"
qc_disposition: "{{get-qc-results.overall_disposition}}"
yield: "{{get-batch-record.total_yield}}"
- name: notify-qp
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{qp_worker_id}}@novonordisk.com"
text: "Batch {{batch_number}} (Plant {{plant_code}}) ready for QP release. QC disposition: {{get-qc-results.overall_disposition}}. CoA: {{generate-coa.document_url}}. Yield: {{get-batch-record.total_yield}}."
consumes:
- type: http
namespace: labware
baseUri: "https://lims.novonordisk.com/labware/api/v3"
authentication:
type: bearer
token: "$secrets.labware_token"
resources:
- name: batch-results
path: "/batches/{{batch_number}}/results"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-batch-results
method: GET
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: batches
path: "/A_Batch(Batch='{{batch_number}}',Plant='{{plant_code}}')"
inputParameters:
- name: batch_number
in: path
- name: plant_code
in: path
operations:
- name: get-batch
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: coa
path: "/objects/coa__v"
operations:
- name: create-coa
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls aggregated adverse event data from Veeva Vault Safety, runs disproportionality analysis via the internal safety analytics API, and posts the signal summary to the safety review board's Slack channel.
naftiko: "0.5"
info:
label: "Drug Safety Signal Detection Pipeline"
description: "Pulls aggregated adverse event data from Veeva Vault Safety, runs disproportionality analysis via the internal safety analytics API, and posts the signal summary to the safety review board's Slack channel."
tags:
- pharmacovigilance
- signal-detection
- veeva-vault
- safety-analytics
- slack
capability:
exposes:
- type: mcp
namespace: pv-signals
port: 8080
tools:
- name: detect-safety-signal
description: "Given a product name and reporting period, aggregate adverse events from Veeva Vault Safety, perform disproportionality analysis, and alert the safety review board on Slack."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name (e.g., semaglutide, liraglutide)."
- name: period_start
in: body
type: string
description: "Start date for the analysis period in YYYY-MM-DD format."
- name: period_end
in: body
type: string
description: "End date for the analysis period in YYYY-MM-DD format."
steps:
- name: get-ae-aggregates
type: call
call: "veeva-safety.get-ae-summary"
with:
product_name: "{{product_name}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
- name: run-dispro-analysis
type: call
call: "safety-analytics.run-analysis"
with:
product_name: "{{product_name}}"
ae_data: "{{get-ae-aggregates.cases}}"
method: "PRR"
- name: post-signal-summary
type: call
call: "slack.post-message"
with:
channel: "safety-review-board"
text: "Signal Detection Report — {{product_name}} ({{period_start}} to {{period_end}}): {{get-ae-aggregates.total_cases}} cases analyzed. {{run-dispro-analysis.signals_detected}} signals detected. Top signal: {{run-dispro-analysis.top_signal_term}} (PRR: {{run-dispro-analysis.top_signal_prr}}). Full report: {{run-dispro-analysis.report_url}}"
consumes:
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: ae-summary
path: "/objects/safety_case/actions/aggregate"
operations:
- name: get-ae-summary
method: POST
- type: http
namespace: safety-analytics
baseUri: "https://safety-analytics.novonordisk.com/api/v2"
authentication:
type: bearer
token: "$secrets.safety_analytics_token"
resources:
- name: analysis
path: "/signal-detection/run"
operations:
- name: run-analysis
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Validates that all required documents for an eCTD regulatory submission are present and approved in Veeva Vault RIM, checks the publishing queue status, and posts readiness summary to the regulatory affairs Slack channel.
naftiko: "0.5"
info:
label: "eCTD Submission Readiness Checker"
description: "Validates that all required documents for an eCTD regulatory submission are present and approved in Veeva Vault RIM, checks the publishing queue status, and posts readiness summary to the regulatory affairs Slack channel."
tags:
- regulatory
- ectd
- veeva-vault
- publishing
- slack
capability:
exposes:
- type: mcp
namespace: reg-submissions
port: 8080
tools:
- name: check-submission-readiness
description: "Given a Veeva Vault RIM submission ID, validate document completeness, check publishing status, and alert the regulatory team on Slack."
inputParameters:
- name: submission_id
in: body
type: string
description: "The Veeva Vault RIM submission identifier."
- name: target_authority
in: body
type: string
description: "The target regulatory authority (e.g., FDA, EMA, PMDA)."
steps:
- name: get-submission
type: call
call: "veeva-rim.get-submission"
with:
submission_id: "{{submission_id}}"
- name: check-documents
type: call
call: "veeva-rim.validate-documents"
with:
submission_id: "{{submission_id}}"
authority: "{{target_authority}}"
- name: post-readiness
type: call
call: "slack.post-message"
with:
channel: "regulatory-affairs"
text: "eCTD Readiness — Submission {{submission_id}} ({{target_authority}}): Status: {{get-submission.status}}. Documents complete: {{check-documents.documents_complete}}/{{check-documents.documents_required}}. Missing: {{check-documents.missing_documents}}. Ready for publishing: {{check-documents.is_ready}}."
consumes:
- type: http
namespace: veeva-rim
baseUri: "https://novonordisk-rim.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_rim_token"
resources:
- name: submissions
path: "/objects/submission__v/{{submission_id}}"
inputParameters:
- name: submission_id
in: path
operations:
- name: get-submission
method: GET
- name: validation
path: "/objects/submission__v/{{submission_id}}/actions/validate"
inputParameters:
- name: submission_id
in: path
operations:
- name: validate-documents
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a new employee joins a GxP area, retrieves their role from Workday, assigns required SOPs in Veeva Vault QMS Training, and sends a training schedule via Microsoft Teams.
naftiko: "0.5"
info:
label: "Employee GxP Training Assignment"
description: "When a new employee joins a GxP area, retrieves their role from Workday, assigns required SOPs in Veeva Vault QMS Training, and sends a training schedule via Microsoft Teams."
tags:
- quality
- training
- workday
- veeva-vault
- microsoft-teams
- gxp
- onboarding
capability:
exposes:
- type: mcp
namespace: gxp-training
port: 8080
tools:
- name: assign-gxp-training
description: "Given a Workday worker ID and GxP area, retrieve the employee role, assign required training in Veeva Vault QMS, and notify the employee."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID of the new GxP area employee."
- name: gxp_area
in: body
type: string
description: "The GxP manufacturing or lab area (e.g., aseptic_filling, qc_lab, packaging)."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: assign-training
type: call
call: "veeva-qms.assign-training-curriculum"
with:
employee_name: "{{get-employee.full_name}}"
employee_email: "{{get-employee.work_email}}"
job_role: "{{get-employee.job_title}}"
gxp_area: "{{gxp_area}}"
- name: notify-employee
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to the {{gxp_area}} area, {{get-employee.first_name}}! Your GxP training has been assigned. {{assign-training.sop_count}} SOPs require completion by {{assign-training.due_date}}. Access your training: {{assign-training.training_url}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: training
path: "/objects/training_assignment__v"
operations:
- name: assign-training-curriculum
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls environmental monitoring readings from the facility monitoring system, compares against GMP limits, creates a deviation in ServiceNow if out-of-spec, and alerts the facilities team on Microsoft Teams.
naftiko: "0.5"
info:
label: "Environmental Monitoring Alert Pipeline"
description: "Pulls environmental monitoring readings from the facility monitoring system, compares against GMP limits, creates a deviation in ServiceNow if out-of-spec, and alerts the facilities team on Microsoft Teams."
tags:
- manufacturing
- environmental-monitoring
- gmp
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-monitoring
port: 8080
tools:
- name: check-env-reading
description: "Given a cleanroom zone and reading type, pull the latest environmental monitoring data, check against limits, and alert if out of specification."
inputParameters:
- name: zone_id
in: body
type: string
description: "The cleanroom zone identifier (e.g., CR-A-01)."
- name: reading_type
in: body
type: string
description: "The type of reading (e.g., particle_count, temperature, humidity)."
steps:
- name: get-reading
type: call
call: "env-monitor.get-latest-reading"
with:
zone_id: "{{zone_id}}"
reading_type: "{{reading_type}}"
- name: open-deviation
type: call
call: "servicenow.create-incident"
with:
short_description: "EM excursion: {{zone_id}} — {{reading_type}}"
category: "environmental_monitoring"
assigned_group: "QA_Environmental"
description: "Zone {{zone_id}} {{reading_type}} reading: {{get-reading.value}} {{get-reading.unit}}. Limit: {{get-reading.spec_limit}} {{get-reading.unit}}. Timestamp: {{get-reading.timestamp}}. Classification: {{get-reading.classification}}."
- name: alert-facilities
type: call
call: "msteams.send-channel-message"
with:
team_id: "manufacturing-ops"
channel_id: "env-monitoring"
text: "EM Alert — Zone {{zone_id}}: {{reading_type}} reading of {{get-reading.value}} {{get-reading.unit}} exceeds limit of {{get-reading.spec_limit}}. Deviation: {{open-deviation.number}}."
consumes:
- type: http
namespace: env-monitor
baseUri: "https://ems.novonordisk.com/api/v2"
authentication:
type: bearer
token: "$secrets.ems_token"
resources:
- name: readings
path: "/zones/{{zone_id}}/readings/{{reading_type}}/latest"
inputParameters:
- name: zone_id
in: path
- name: reading_type
in: path
operations:
- name: get-latest-reading
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Retrieves prescriber engagement data from Veeva CRM, pulls latest real-world evidence from the medical information system, creates a personalized outreach plan in Salesforce Marketing Cloud, and logs the interaction in Veeva CRM.
naftiko: "0.5"
info:
label: "GLP-1 Prescriber Engagement Orchestrator"
description: "Retrieves prescriber engagement data from Veeva CRM, pulls latest real-world evidence from the medical information system, creates a personalized outreach plan in Salesforce Marketing Cloud, and logs the interaction in Veeva CRM."
tags:
- commercial
- medical-affairs
- veeva-crm
- salesforce-marketing-cloud
- hcp-engagement
- glp-1
capability:
exposes:
- type: mcp
namespace: hcp-outreach
port: 8080
tools:
- name: plan-prescriber-outreach
description: "Given a prescriber NPI and product, pull engagement history, retrieve relevant evidence, create a targeted outreach campaign, and log the plan."
inputParameters:
- name: npi_number
in: body
type: string
description: "The prescriber NPI number."
- name: product_name
in: body
type: string
description: "The product for the engagement (e.g., Ozempic, Wegovy, Rybelsus)."
steps:
- name: get-prescriber
type: call
call: "veeva-crm.get-hcp"
with:
npi_number: "{{npi_number}}"
- name: get-evidence
type: call
call: "med-info.get-evidence"
with:
product_name: "{{product_name}}"
specialty: "{{get-prescriber.specialty}}"
- name: create-campaign
type: call
call: "sfmc.create-journey"
with:
contact_email: "{{get-prescriber.email}}"
journey_name: "{{product_name}}_outreach_{{get-prescriber.territory}}"
content_key: "{{get-evidence.content_key}}"
- name: log-interaction
type: call
call: "veeva-crm.log-call"
with:
npi_number: "{{npi_number}}"
call_type: "outreach_plan"
notes: "Outreach plan created for {{product_name}}. Campaign: {{create-campaign.journey_id}}. Evidence: {{get-evidence.title}}."
consumes:
- type: http
namespace: veeva-crm
baseUri: "https://novonordisk.veevacrm.com/api/v1"
authentication:
type: bearer
token: "$secrets.veeva_crm_token"
resources:
- name: hcps
path: "/accounts?q=npi__v={{npi_number}}"
inputParameters:
- name: npi_number
in: query
operations:
- name: get-hcp
method: GET
- name: calls
path: "/calls"
operations:
- name: log-call
method: POST
- type: http
namespace: med-info
baseUri: "https://medinfo.novonordisk.com/api/v2"
authentication:
type: bearer
token: "$secrets.medinfo_token"
resources:
- name: evidence
path: "/evidence?product={{product_name}}&specialty={{specialty}}"
inputParameters:
- name: product_name
in: query
- name: specialty
in: query
operations:
- name: get-evidence
method: GET
- type: http
namespace: sfmc
baseUri: "https://novonordisk.rest.marketingcloudapis.com/v1"
authentication:
type: bearer
token: "$secrets.sfmc_token"
resources:
- name: journeys
path: "/journeys"
operations:
- name: create-journey
method: POST
When a GxP deviation is raised in ServiceNow, creates a linked CAPA record in Veeva Vault QMS, assigns an investigator from Workday, and notifies the quality team on Microsoft Teams.
naftiko: "0.5"
info:
label: "GxP Deviation to CAPA Orchestrator"
description: "When a GxP deviation is raised in ServiceNow, creates a linked CAPA record in Veeva Vault QMS, assigns an investigator from Workday, and notifies the quality team on Microsoft Teams."
tags:
- quality
- gxp
- capa
- servicenow
- veeva-vault
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: qa-capa
port: 8080
tools:
- name: initiate-capa
description: "Given a ServiceNow deviation incident number, create a CAPA in Veeva Vault QMS, assign an investigator, and notify the quality team."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number for the GxP deviation."
- name: investigator_id
in: body
type: string
description: "The Workday worker ID of the assigned CAPA investigator."
steps:
- name: get-deviation
type: call
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
- name: get-investigator
type: call
call: "workday.get-worker"
with:
worker_id: "{{investigator_id}}"
- name: create-capa
type: call
call: "veeva-qms.create-capa"
with:
deviation_ref: "{{incident_number}}"
title: "CAPA for deviation {{incident_number}}: {{get-deviation.short_description}}"
severity: "{{get-deviation.severity}}"
investigator_name: "{{get-investigator.full_name}}"
investigator_email: "{{get-investigator.work_email}}"
- name: notify-quality-team
type: call
call: "msteams.send-channel-message"
with:
team_id: "quality-operations"
channel_id: "capa-tracking"
text: "CAPA {{create-capa.capa_number}} initiated for deviation {{incident_number}}. Investigator: {{get-investigator.full_name}}. Severity: {{get-deviation.severity}}. Due date: {{create-capa.due_date}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: capas
path: "/objects/capa__v"
operations:
- name: create-capa
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/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Looks up a healthcare professional in Veeva CRM by NPI number, retrieves recent call activity, and posts a profile summary to the medical affairs Slack channel for pre-visit preparation.
naftiko: "0.5"
info:
label: "HCP Profile and Interaction History Reporter"
description: "Looks up a healthcare professional in Veeva CRM by NPI number, retrieves recent call activity, and posts a profile summary to the medical affairs Slack channel for pre-visit preparation."
tags:
- medical-affairs
- veeva-crm
- hcp-engagement
- slack
capability:
exposes:
- type: mcp
namespace: med-affairs
port: 8080
tools:
- name: prepare-hcp-brief
description: "Given an NPI number, pull the HCP profile and call history from Veeva CRM and post a summary to Slack."
inputParameters:
- name: npi_number
in: body
type: string
description: "The National Provider Identifier for the healthcare professional."
steps:
- name: get-hcp
type: call
call: "veeva-crm.get-hcp"
with:
npi_number: "{{npi_number}}"
- name: get-call-history
type: call
call: "veeva-crm.get-calls"
with:
npi_number: "{{npi_number}}"
- name: post-brief
type: call
call: "slack.post-message"
with:
channel: "medical-affairs"
text: "HCP Brief — {{get-hcp.full_name}} (NPI: {{npi_number}}): Specialty: {{get-hcp.specialty}}, Institution: {{get-hcp.institution}}, Territory: {{get-hcp.territory}}. Last {{get-call-history.call_count}} interactions: {{get-call-history.summary}}."
consumes:
- type: http
namespace: veeva-crm
baseUri: "https://novonordisk.veevacrm.com/api/v1"
authentication:
type: bearer
token: "$secrets.veeva_crm_token"
resources:
- name: hcps
path: "/accounts?q=npi__v={{npi_number}}"
inputParameters:
- name: npi_number
in: query
operations:
- name: get-hcp
method: GET
- name: calls
path: "/calls?q=account_npi={{npi_number}}"
inputParameters:
- name: npi_number
in: query
operations:
- name: get-calls
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries the Sensitech cold chain monitoring API for a shipment's temperature data and creates a quality deviation in ServiceNow if any excursion is detected during transit.
naftiko: "0.5"
info:
label: "Insulin Cold Chain Temperature Monitor"
description: "Queries the Sensitech cold chain monitoring API for a shipment's temperature data and creates a quality deviation in ServiceNow if any excursion is detected during transit."
tags:
- supply-chain
- cold-chain
- sensitech
- servicenow
- quality
- temperature-monitoring
capability:
exposes:
- type: mcp
namespace: cold-chain
port: 8080
tools:
- name: check-shipment-temperature
description: "Given a shipment tracking ID, pull cold chain temperature readings from Sensitech and open a ServiceNow deviation if excursions are found."
inputParameters:
- name: shipment_id
in: body
type: string
description: "The Sensitech shipment tracking identifier."
- name: product_name
in: body
type: string
description: "The product name being shipped (e.g., Ozempic, Wegovy)."
steps:
- name: get-temperature-data
type: call
call: "sensitech.get-readings"
with:
shipment_id: "{{shipment_id}}"
- name: open-deviation
type: call
call: "servicenow.create-incident"
with:
short_description: "Temperature excursion: {{product_name}} shipment {{shipment_id}}"
category: "quality_deviation"
assigned_group: "QA_Cold_Chain"
description: "Temperature excursion detected for {{product_name}} shipment {{shipment_id}}. Min temp: {{get-temperature-data.min_temp}}C, Max temp: {{get-temperature-data.max_temp}}C. Excursion duration: {{get-temperature-data.excursion_minutes}} minutes. Acceptable range: 2-8C."
consumes:
- type: http
namespace: sensitech
baseUri: "https://api.sensitech.com/v2"
authentication:
type: bearer
token: "$secrets.sensitech_token"
resources:
- name: readings
path: "/shipments/{{shipment_id}}/temperature"
inputParameters:
- name: shipment_id
in: path
operations:
- name: get-readings
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.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
Receives a patient device complaint via Salesforce Health Cloud, creates a product quality complaint in Veeva Vault QMS, opens a ServiceNow investigation, and notifies the device engineering team on Slack.
naftiko: "0.5"
info:
label: "Insulin Pen Device Complaint Handler"
description: "Receives a patient device complaint via Salesforce Health Cloud, creates a product quality complaint in Veeva Vault QMS, opens a ServiceNow investigation, and notifies the device engineering team on Slack."
tags:
- quality
- device-complaints
- salesforce-health-cloud
- veeva-vault
- servicenow
- slack
- medical-devices
capability:
exposes:
- type: mcp
namespace: device-complaints
port: 8080
tools:
- name: handle-device-complaint
description: "Given a Salesforce case ID for a device complaint, create a Veeva QMS complaint, open a ServiceNow investigation, and alert device engineering."
inputParameters:
- name: case_id
in: body
type: string
description: "The Salesforce Health Cloud case ID for the device complaint."
- name: product_code
in: body
type: string
description: "The product code of the insulin delivery device."
steps:
- name: get-complaint-case
type: call
call: "sfdc-health.get-case"
with:
case_id: "{{case_id}}"
- name: create-qms-complaint
type: call
call: "veeva-qms.create-complaint"
with:
complaint_type: "device"
product_code: "{{product_code}}"
description: "{{get-complaint-case.description}}"
patient_impact: "{{get-complaint-case.patient_impact}}"
lot_number: "{{get-complaint-case.lot_number}}"
- name: open-investigation
type: call
call: "servicenow.create-incident"
with:
short_description: "Device complaint investigation: {{product_code}} — {{create-qms-complaint.complaint_number}}"
category: "product_quality"
assigned_group: "Device_Engineering"
description: "Complaint {{create-qms-complaint.complaint_number}} for product {{product_code}}. Lot: {{get-complaint-case.lot_number}}. Patient impact: {{get-complaint-case.patient_impact}}. Description: {{get-complaint-case.description}}."
- name: alert-engineering
type: call
call: "slack.post-message"
with:
channel: "device-engineering"
text: "Device complaint {{create-qms-complaint.complaint_number}} — Product: {{product_code}}, Lot: {{get-complaint-case.lot_number}}. Patient impact: {{get-complaint-case.patient_impact}}. Investigation: {{open-investigation.number}}."
consumes:
- type: http
namespace: sfdc-health
baseUri: "https://novonordisk.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.sfdc_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: complaints
path: "/objects/complaint__v"
operations:
- name: create-complaint
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.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: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a GxP system access request is made, validates the requestor in Workday, checks training completion in Veeva Vault QMS, provisions access in ServiceNow, and notifies the requestor on Microsoft Teams.
naftiko: "0.5"
info:
label: "IT Access Request for GxP Systems"
description: "When a GxP system access request is made, validates the requestor in Workday, checks training completion in Veeva Vault QMS, provisions access in ServiceNow, and notifies the requestor on Microsoft Teams."
tags:
- it
- access-management
- gxp
- workday
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-access
port: 8080
tools:
- name: provision-gxp-access
description: "Given a worker ID and target GxP system, validate the employee, confirm required training, provision access, and notify."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID of the requestor."
- name: target_system
in: body
type: string
description: "The GxP system to provision access for (e.g., SAP_QM, LIMS, MES)."
- name: access_level
in: body
type: string
description: "The requested access level (e.g., read, write, admin)."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: check-training
type: call
call: "veeva-qms.check-system-training"
with:
employee_email: "{{get-employee.work_email}}"
system_name: "{{target_system}}"
- name: provision-access
type: call
call: "servicenow.create-request"
with:
short_description: "GxP access: {{get-employee.full_name}} — {{target_system}} ({{access_level}})"
description: "Provision {{access_level}} access to {{target_system}} for {{get-employee.full_name}} ({{get-employee.department}}). Training status: {{check-training.status}}. Training completion date: {{check-training.completion_date}}."
assigned_group: "IT_GxP_Access"
category: "access_request"
- name: notify-requestor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Your access request for {{target_system}} ({{access_level}}) has been submitted. Request: {{provision-access.number}}. Training status: {{check-training.status}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: system-training
path: "/objects/training_assignment__v?q=employee={{employee_email}}&system={{system_name}}"
inputParameters:
- name: employee_email
in: query
- name: system_name
in: query
operations:
- name: check-system-training
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves a Jira issue by key and returns summary, status, assignee, and priority for project tracking.
naftiko: "0.5"
info:
label: "Jira Issue Lookup"
description: "Retrieves a Jira issue by key and returns summary, status, assignee, and priority for project tracking."
tags:
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: project-tracking
port: 8080
tools:
- name: get-jira-issue
description: "Look up a Jira issue by key. Returns summary, status, assignee, priority, and last updated date."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g., CDM-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://novonordisk.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
Retrieves quality control lab results from the LabWare LIMS system by sample ID and returns test results, specifications, and pass/fail status for QC analysts.
naftiko: "0.5"
info:
label: "LIMS Lab Result Retrieval"
description: "Retrieves quality control lab results from the LabWare LIMS system by sample ID and returns test results, specifications, and pass/fail status for QC analysts."
tags:
- quality
- lims
- labware
- lab-testing
capability:
exposes:
- type: mcp
namespace: qc-lab
port: 8080
tools:
- name: get-lab-result
description: "Look up a QC lab result in LabWare LIMS by sample ID. Returns test name, result value, specification limits, and pass/fail status."
inputParameters:
- name: sample_id
in: body
type: string
description: "The LabWare LIMS sample identifier."
call: "labware.get-sample-results"
with:
sample_id: "{{sample_id}}"
outputParameters:
- name: test_name
type: string
mapping: "$.data.test_name"
- name: result_value
type: string
mapping: "$.data.result_value"
- name: spec_low
type: string
mapping: "$.data.spec_low_limit"
- name: spec_high
type: string
mapping: "$.data.spec_high_limit"
- name: disposition
type: string
mapping: "$.data.disposition"
consumes:
- type: http
namespace: labware
baseUri: "https://lims.novonordisk.com/labware/api/v3"
authentication:
type: bearer
token: "$secrets.labware_token"
resources:
- name: samples
path: "/samples/{{sample_id}}/results"
inputParameters:
- name: sample_id
in: path
operations:
- name: get-sample-results
method: GET
Initiates a manufacturing change control by creating a change request in Veeva Vault QMS, linking affected SOPs, assigning impact assessment tasks via ServiceNow, and notifying the change control board on Microsoft Teams.
naftiko: "0.5"
info:
label: "Manufacturing Change Control Orchestrator"
description: "Initiates a manufacturing change control by creating a change request in Veeva Vault QMS, linking affected SOPs, assigning impact assessment tasks via ServiceNow, and notifying the change control board on Microsoft Teams."
tags:
- manufacturing
- change-control
- veeva-vault
- servicenow
- microsoft-teams
- quality
capability:
exposes:
- type: mcp
namespace: mfg-change-control
port: 8080
tools:
- name: initiate-change-control
description: "Given a change description, affected area, and change owner, create a Veeva Vault QMS change request, open ServiceNow impact assessment tasks, and notify the change control board."
inputParameters:
- name: change_description
in: body
type: string
description: "Description of the proposed manufacturing change."
- name: affected_area
in: body
type: string
description: "The manufacturing area affected (e.g., filling, formulation, packaging)."
- name: change_owner_id
in: body
type: string
description: "Workday worker ID of the change owner."
steps:
- name: get-owner
type: call
call: "workday.get-worker"
with:
worker_id: "{{change_owner_id}}"
- name: create-change-request
type: call
call: "veeva-qms.create-change-control"
with:
title: "{{change_description}}"
affected_area: "{{affected_area}}"
owner_name: "{{get-owner.full_name}}"
owner_email: "{{get-owner.work_email}}"
- name: create-impact-task
type: call
call: "servicenow.create-task"
with:
short_description: "Impact assessment: {{create-change-request.cc_number}}"
description: "Assess impact of proposed change: {{change_description}}. Affected area: {{affected_area}}. Change request: {{create-change-request.cc_number}}."
assigned_group: "QA_Change_Control"
category: "change_control"
- name: notify-ccb
type: call
call: "msteams.send-channel-message"
with:
team_id: "quality-operations"
channel_id: "change-control"
text: "New change control {{create-change-request.cc_number}} initiated by {{get-owner.full_name}}. Area: {{affected_area}}. Description: {{change_description}}. Impact assessment task: {{create-impact-task.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: change-controls
path: "/objects/change_control__v"
operations:
- name: create-change-control
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Retrieves clinical trial subject visit data from Medidata Rave by study and subject ID and returns visit schedule compliance, completed visits, and next scheduled visit.
naftiko: "0.5"
info:
label: "Medidata Rave Subject Visit Lookup"
description: "Retrieves clinical trial subject visit data from Medidata Rave by study and subject ID and returns visit schedule compliance, completed visits, and next scheduled visit."
tags:
- clinical-trials
- medidata-rave
- subject-visits
capability:
exposes:
- type: mcp
namespace: ct-visits
port: 8080
tools:
- name: get-subject-visits
description: "Look up subject visit data in Medidata Rave. Returns completed visits, missed visits, and next scheduled visit date."
inputParameters:
- name: study_id
in: body
type: string
description: "The Medidata Rave study identifier."
- name: subject_id
in: body
type: string
description: "The subject identifier."
call: "medidata.get-visits"
with:
study_id: "{{study_id}}"
subject_id: "{{subject_id}}"
outputParameters:
- name: completed_visits
type: number
mapping: "$.data.completed_count"
- name: missed_visits
type: number
mapping: "$.data.missed_count"
- name: next_visit_date
type: string
mapping: "$.data.next_visit.scheduled_date"
- name: next_visit_type
type: string
mapping: "$.data.next_visit.visit_name"
consumes:
- type: http
namespace: medidata
baseUri: "https://api.imedidata.com/rave/v1"
authentication:
type: bearer
token: "$secrets.medidata_token"
resources:
- name: visits
path: "/studies/{{study_id}}/subjects/{{subject_id}}/visits"
inputParameters:
- name: study_id
in: path
- name: subject_id
in: path
operations:
- name: get-visits
method: GET
When a patient is referred to a support program, verifies insurance eligibility via Salesforce Health Cloud, creates a case in the patient hub, and sends an enrollment confirmation via Twilio SMS.
naftiko: "0.5"
info:
label: "Patient Support Program Enrollment"
description: "When a patient is referred to a support program, verifies insurance eligibility via Salesforce Health Cloud, creates a case in the patient hub, and sends an enrollment confirmation via Twilio SMS."
tags:
- patient-support
- salesforce
- salesforce-health-cloud
- twilio
- patient-enrollment
capability:
exposes:
- type: mcp
namespace: patient-programs
port: 8080
tools:
- name: enroll-patient
description: "Given a patient ID and program code, verify insurance eligibility, create a patient support case, and send enrollment confirmation via SMS."
inputParameters:
- name: patient_id
in: body
type: string
description: "The Salesforce Health Cloud patient ID."
- name: program_code
in: body
type: string
description: "The patient support program code (e.g., NNI-OZEMPIC-PSP)."
- name: phone_number
in: body
type: string
description: "Patient phone number for SMS confirmation."
steps:
- name: verify-eligibility
type: call
call: "sfdc-health.get-patient-eligibility"
with:
patient_id: "{{patient_id}}"
program_code: "{{program_code}}"
- name: create-case
type: call
call: "sfdc-health.create-case"
with:
patient_id: "{{patient_id}}"
subject: "PSP Enrollment: {{program_code}}"
description: "Patient {{patient_id}} enrolled in {{program_code}}. Eligibility status: {{verify-eligibility.eligibility_status}}. Coverage: {{verify-eligibility.coverage_type}}."
record_type: "patient_support"
- name: send-confirmation
type: call
call: "twilio.send-sms"
with:
to: "{{phone_number}}"
body: "You have been enrolled in the Novo Nordisk patient support program ({{program_code}}). Your case reference is {{create-case.case_number}}. Questions? Call 1-888-NOVO."
consumes:
- type: http
namespace: sfdc-health
baseUri: "https://novonordisk.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.sfdc_token"
resources:
- name: patient-eligibility
path: "/sobjects/PatientEligibility__c/{{patient_id}}"
inputParameters:
- name: patient_id
in: path
operations:
- name: get-patient-eligibility
method: GET
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Messages.json"
operations:
- name: send-sms
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 1"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- salesforce
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-1
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-1"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "salesforce.create-account"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-1
method: POST
- type: http
namespace: salesforce
baseUri: "https://novonordisk.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/accounts"
operations:
- name: create-account
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 10"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- sharepoint
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-10
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-10"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "sharepoint.upload-document"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-10
method: POST
- type: http
namespace: sharepoint
baseUri: "https://novonordisk.sharepoint.com/_api/v2.0"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: documents
path: "/documents"
operations:
- name: upload-document
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 11"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- hubspot
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-11
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-11"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "hubspot.send-email"
with:
to: "{{process.email}}"
subject: "Workflow 11 Complete"
body: "{{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-11
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com/crm/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/contacts"
operations:
- name: send-email
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 12"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- datadog
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-12
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-12"
with:
identifier: "{{identifier}}"
- name: push
type: call
call: "datadog.submit-metrics"
with:
metric_name: "pharma.workflow_12"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-12
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_token"
resources:
- name: metrics
path: "/metrics"
operations:
- name: submit-metrics
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 13"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- salesforce
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-13
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-13"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "salesforce.create-account"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-13
method: POST
- type: http
namespace: salesforce
baseUri: "https://novonordisk.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/accounts"
operations:
- name: create-account
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 14"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- servicenow
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-14
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-14"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "servicenow.create-incident"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-14
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now/v1"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 15"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- slack
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-15
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-15"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#pharma"
text: "Completed workflow 15: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-15
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/messages"
operations:
- name: post-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 16"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- confluence
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-16
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-16"
with:
identifier: "{{identifier}}"
- name: publish
type: call
call: "confluence.create-page"
with:
space: "PHARMA"
title: "Report 16"
content: "{{process.report}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-16
method: POST
- type: http
namespace: confluence
baseUri: "https://novonordisk.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 17"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- powerbi
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-17
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-17"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "workflow_17"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-17
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets"
operations:
- name: refresh-dataset
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 18"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- jira
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-18
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-18"
with:
identifier: "{{identifier}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "PHAR"
summary: "Task from workflow 18"
description: "{{process.details}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-18
method: POST
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issues"
operations:
- name: create-issue
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 19"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- teams
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-19
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-19"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "teams.send-message"
with:
channel_id: "pharma"
message: "Workflow 19 complete: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-19
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 2"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- servicenow
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-2
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-2"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "servicenow.create-incident"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-2
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now/v1"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 20"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- tableau
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-20
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-20"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "tableau.publish-datasource"
with:
dataset_id: "workflow_20"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-20
method: POST
- type: http
namespace: tableau
baseUri: "https://novonordisk-tableau.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: datasources
path: "/datasources"
operations:
- name: publish-datasource
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 21"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- box
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-21
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-21"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "box.upload-file"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-21
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files"
operations:
- name: upload-file
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 22"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- sharepoint
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-22
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-22"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "sharepoint.upload-document"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-22
method: POST
- type: http
namespace: sharepoint
baseUri: "https://novonordisk.sharepoint.com/_api/v2.0"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: documents
path: "/documents"
operations:
- name: upload-document
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 23"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- hubspot
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-23
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-23"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "hubspot.send-email"
with:
to: "{{process.email}}"
subject: "Workflow 23 Complete"
body: "{{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-23
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com/crm/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/contacts"
operations:
- name: send-email
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 24"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- datadog
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-24
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-24"
with:
identifier: "{{identifier}}"
- name: push
type: call
call: "datadog.submit-metrics"
with:
metric_name: "pharma.workflow_24"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-24
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_token"
resources:
- name: metrics
path: "/metrics"
operations:
- name: submit-metrics
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 25"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- salesforce
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-25
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-25"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "salesforce.create-account"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-25
method: POST
- type: http
namespace: salesforce
baseUri: "https://novonordisk.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/accounts"
operations:
- name: create-account
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 26"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- servicenow
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-26
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-26"
with:
identifier: "{{identifier}}"
- name: create
type: call
call: "servicenow.create-incident"
with:
data: "{{process.result}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-26
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now/v1"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 27"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- slack
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-27
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-27"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#pharma"
text: "Completed workflow 27: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-27
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/messages"
operations:
- name: post-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 28"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- confluence
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-28
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-28"
with:
identifier: "{{identifier}}"
- name: publish
type: call
call: "confluence.create-page"
with:
space: "PHARMA"
title: "Report 28"
content: "{{process.report}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-28
method: POST
- type: http
namespace: confluence
baseUri: "https://novonordisk.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 29"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- powerbi
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-29
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-29"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "workflow_29"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-29
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets"
operations:
- name: refresh-dataset
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 3"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- slack
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-3
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-3"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#pharma"
text: "Completed workflow 3: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-3
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/messages"
operations:
- name: post-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 30"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- jira
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-30
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-30"
with:
identifier: "{{identifier}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "PHAR"
summary: "Task from workflow 30"
description: "{{process.details}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-30
method: POST
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issues"
operations:
- name: create-issue
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 31"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- teams
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-31
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-31"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "teams.send-message"
with:
channel_id: "pharma"
message: "Workflow 31 complete: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-31
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 32"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- tableau
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-32
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-32"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "tableau.publish-datasource"
with:
dataset_id: "workflow_32"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-32
method: POST
- type: http
namespace: tableau
baseUri: "https://novonordisk-tableau.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: datasources
path: "/datasources"
operations:
- name: publish-datasource
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 33"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- box
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-33
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-33"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "box.upload-file"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-33
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files"
operations:
- name: upload-file
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 34"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- sharepoint
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-34
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-34"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "sharepoint.upload-document"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-34
method: POST
- type: http
namespace: sharepoint
baseUri: "https://novonordisk.sharepoint.com/_api/v2.0"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: documents
path: "/documents"
operations:
- name: upload-document
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 35"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- hubspot
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-35
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-35"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "hubspot.send-email"
with:
to: "{{process.email}}"
subject: "Workflow 35 Complete"
body: "{{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-35
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com/crm/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/contacts"
operations:
- name: send-email
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 4"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- confluence
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-4
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-4"
with:
identifier: "{{identifier}}"
- name: publish
type: call
call: "confluence.create-page"
with:
space: "PHARMA"
title: "Report 4"
content: "{{process.report}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-4
method: POST
- type: http
namespace: confluence
baseUri: "https://novonordisk.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 5"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- powerbi
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-5
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-5"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "powerbi.refresh-dataset"
with:
dataset_id: "workflow_5"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-5
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets"
operations:
- name: refresh-dataset
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 6"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- jira
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-6
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-6"
with:
identifier: "{{identifier}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "PHAR"
summary: "Task from workflow 6"
description: "{{process.details}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-6
method: POST
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issues"
operations:
- name: create-issue
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 7"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- teams
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-7
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-7"
with:
identifier: "{{identifier}}"
- name: notify
type: call
call: "teams.send-message"
with:
channel_id: "pharma"
message: "Workflow 7 complete: {{process.summary}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-7
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-message
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 8"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- tableau
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-8
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-8"
with:
identifier: "{{identifier}}"
- name: refresh
type: call
call: "tableau.publish-datasource"
with:
dataset_id: "workflow_8"
data: "{{process.metrics}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-8
method: POST
- type: http
namespace: tableau
baseUri: "https://novonordisk-tableau.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: datasources
path: "/datasources"
operations:
- name: publish-datasource
method: POST
Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk.
naftiko: "0.5"
info:
label: "Novo Nordisk Workflow 9"
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
tags:
- pharma
- operations
- box
capability:
exposes:
- type: mcp
namespace: pharma
port: 8080
tools:
- name: novo-nordisk-workflow-9
description: "Orchestrates pharma operations including data retrieval, processing, and automated notification for Novo Nordisk."
inputParameters:
- name: identifier
in: body
type: string
description: "Primary identifier for this workflow"
steps:
- name: process
type: call
call: "novonordisk-ops.run-workflow-9"
with:
identifier: "{{identifier}}"
- name: upload
type: call
call: "box.upload-file"
with:
content: "{{process.document}}"
consumes:
- type: http
namespace: novonordisk-ops
baseUri: "https://api.novonordisk.com/operations/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: operations
path: "/operations"
operations:
- name: run-workflow-9
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files"
operations:
- name: upload-file
method: POST
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 1"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-1
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-1"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-1
path: "/data-1/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-1
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 10"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-10
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-10"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-10
path: "/data-10/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-10
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 11"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-11
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-11"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-11
path: "/data-11/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-11
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 12"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-12
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-12"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-12
path: "/data-12/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-12
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 13"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-13
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-13"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-13
path: "/data-13/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-13
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 14"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-14
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-14"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-14
path: "/data-14/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-14
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 15"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-15
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-15"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-15
path: "/data-15/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-15
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 2"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-2
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-2"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-2
path: "/data-2/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-2
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 3"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-3
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-3"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-3
path: "/data-3/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-3
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 4"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-4
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-4"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-4
path: "/data-4/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-4
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 5"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-5
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-5"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-5
path: "/data-5/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-5
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 6"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-6
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-6"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-6
path: "/data-6/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-6
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 7"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-7
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-7"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-7
path: "/data-7/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-7
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 8"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-8
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-8"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-8
path: "/data-8/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-8
method: GET
Retrieves operational data for Novo Nordisk pharma workflows.
naftiko: "0.5"
info:
label: "Novo Nordisk Data Lookup 9"
description: "Retrieves operational data for Novo Nordisk pharma workflows."
tags:
- pharma
- operations
capability:
exposes:
- type: mcp
namespace: novonordisk-data
port: 8080
tools:
- name: get-data-9
description: "Retrieves operational data for Novo Nordisk pharma workflows."
inputParameters:
- name: identifier
in: body
type: string
description: "Resource identifier"
call: "novonordisk-data.get-data-9"
with:
identifier: "{{identifier}}"
consumes:
- type: http
namespace: novonordisk-data
baseUri: "https://api.novonordisk.com/data/v1"
authentication:
type: bearer
token: "$secrets.novonordisk_api_token"
resources:
- name: data-9
path: "/data-9/{{identifier}}"
inputParameters:
- name: identifier
in: path
operations:
- name: get-data-9
method: GET
Takes an Individual Case Safety Report from Veeva Vault Safety, formats it for E2B(R3) compliance, submits to the EudraVigilance gateway, and logs the submission in ServiceNow.
naftiko: "0.5"
info:
label: "Pharmacovigilance ICSR Submission Pipeline"
description: "Takes an Individual Case Safety Report from Veeva Vault Safety, formats it for E2B(R3) compliance, submits to the EudraVigilance gateway, and logs the submission in ServiceNow."
tags:
- pharmacovigilance
- icsr
- veeva-vault
- eudravigilance
- servicenow
- regulatory
capability:
exposes:
- type: mcp
namespace: pv-icsr
port: 8080
tools:
- name: submit-icsr
description: "Given a Veeva Vault Safety case number, generate the E2B(R3) XML, submit to EudraVigilance, and log the submission in ServiceNow."
inputParameters:
- name: case_number
in: body
type: string
description: "The Veeva Vault Safety case number."
- name: target_authority
in: body
type: string
description: "The target authority (e.g., EMA, FDA)."
steps:
- name: get-safety-case
type: call
call: "veeva-safety.get-case"
with:
case_number: "{{case_number}}"
- name: generate-e2b
type: call
call: "veeva-safety.generate-e2b"
with:
case_number: "{{case_number}}"
format: "E2B_R3"
authority: "{{target_authority}}"
- name: submit-to-authority
type: call
call: "eudravigilance.submit-icsr"
with:
e2b_xml: "{{generate-e2b.xml_payload}}"
authority: "{{target_authority}}"
- name: log-submission
type: call
call: "servicenow.create-task"
with:
short_description: "ICSR submitted: {{case_number}} to {{target_authority}}"
description: "Case {{case_number}} submitted to {{target_authority}}. Acknowledgment ID: {{submit-to-authority.ack_id}}. Submission timestamp: {{submit-to-authority.timestamp}}."
assigned_group: "PV_Submissions"
category: "icsr_submission"
consumes:
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: cases
path: "/objects/safety_case/{{case_number}}"
inputParameters:
- name: case_number
in: path
operations:
- name: get-case
method: GET
- name: e2b-export
path: "/objects/safety_case/{{case_number}}/actions/export-e2b"
inputParameters:
- name: case_number
in: path
operations:
- name: generate-e2b
method: POST
- type: http
namespace: eudravigilance
baseUri: "https://eudravigilance.ema.europa.eu/gateway/v1"
authentication:
type: certificate
cert: "$secrets.eudra_cert"
key: "$secrets.eudra_key"
resources:
- name: icsr
path: "/submit"
operations:
- name: submit-icsr
method: POST
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Queries PubMed for new publications mentioning Novo Nordisk products, screens for potential adverse event reports, logs findings in Veeva Vault Safety, and notifies the literature surveillance team on Microsoft Teams.
naftiko: "0.5"
info:
label: "Pharmacovigilance Literature Screening Pipeline"
description: "Queries PubMed for new publications mentioning Novo Nordisk products, screens for potential adverse event reports, logs findings in Veeva Vault Safety, and notifies the literature surveillance team on Microsoft Teams."
tags:
- pharmacovigilance
- literature-surveillance
- pubmed
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pv-literature
port: 8080
tools:
- name: screen-literature
description: "Given a product name and date range, search PubMed for new publications, identify potential safety signals, and log findings in Veeva Vault Safety."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name to search (e.g., semaglutide, liraglutide)."
- name: date_from
in: body
type: string
description: "Search start date (YYYY/MM/DD)."
- name: date_to
in: body
type: string
description: "Search end date (YYYY/MM/DD)."
steps:
- name: search-pubmed
type: call
call: "pubmed.search-articles"
with:
query: "{{product_name}} AND (adverse OR safety OR side effect)"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: log-findings
type: call
call: "veeva-safety.create-literature-case"
with:
product_name: "{{product_name}}"
article_count: "{{search-pubmed.result_count}}"
articles: "{{search-pubmed.articles}}"
- name: notify-surveillance-team
type: call
call: "msteams.send-channel-message"
with:
team_id: "pv-safety-operations"
channel_id: "literature-screening"
text: "Literature screening complete for {{product_name}} ({{date_from}} to {{date_to}}). {{search-pubmed.result_count}} articles found. {{log-findings.cases_created}} potential safety cases created. Review: {{log-findings.review_url}}"
consumes:
- type: http
namespace: pubmed
baseUri: "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
authentication:
type: apiKey
name: "api_key"
in: query
value: "$secrets.pubmed_api_key"
resources:
- name: search
path: "/esearch.fcgi"
operations:
- name: search-articles
method: GET
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: literature-cases
path: "/objects/safety_case/actions/literature-intake"
operations:
- name: create-literature-case
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Retrieves a quality document from Veeva Vault QMS, checks associated training completion rates, and posts a compliance summary to the quality team's Slack channel.
naftiko: "0.5"
info:
label: "Quality Document Review and Training Check"
description: "Retrieves a quality document from Veeva Vault QMS, checks associated training completion rates, and posts a compliance summary to the quality team's Slack channel."
tags:
- quality
- veeva-vault
- document-management
- gxp
- slack
capability:
exposes:
- type: mcp
namespace: qa-docs
port: 8080
tools:
- name: review-quality-document
description: "Given a Veeva Vault QMS document number, retrieve the document, check training compliance, and post a summary to Slack."
inputParameters:
- name: document_number
in: body
type: string
description: "The Veeva Vault QMS document number."
steps:
- name: get-document
type: call
call: "veeva-qms.get-document"
with:
document_number: "{{document_number}}"
- name: get-training-status
type: call
call: "veeva-qms.get-training-assignments"
with:
document_number: "{{document_number}}"
- name: post-summary
type: call
call: "slack.post-message"
with:
channel: "quality-documents"
text: "Document {{document_number}} ({{get-document.title}}) — Version: {{get-document.version}}, State: {{get-document.lifecycle_state}}, Effective: {{get-document.effective_date}}. Training: {{get-training-status.completed_count}}/{{get-training-status.total_assigned}} completed."
consumes:
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: documents
path: "/objects/documents?q=document_number__v={{document_number}}"
inputParameters:
- name: document_number
in: query
operations:
- name: get-document
method: GET
- name: training-assignments
path: "/objects/training_assignment__v?q=document_number={{document_number}}"
inputParameters:
- name: document_number
in: query
operations:
- name: get-training-assignments
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves real-world evidence summaries from the medical information API, pulls the prescriber profile from Veeva CRM, and generates a tailored MSL briefing document in SharePoint for the upcoming engagement.
naftiko: "0.5"
info:
label: "Real-World Evidence Request and MSL Briefing"
description: "Retrieves real-world evidence summaries from the medical information API, pulls the prescriber profile from Veeva CRM, and generates a tailored MSL briefing document in SharePoint for the upcoming engagement."
tags:
- medical-affairs
- real-world-evidence
- medical-information
- veeva-crm
- sharepoint
capability:
exposes:
- type: mcp
namespace: rwe
port: 8080
tools:
- name: prepare-msl-briefing
description: "Given a product, therapeutic area, and prescriber NPI, pull RWE data, get the prescriber profile, and create a briefing document in SharePoint."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name (e.g., semaglutide)."
- name: therapeutic_area
in: body
type: string
description: "The therapeutic area (e.g., type-2-diabetes, obesity)."
- name: npi_number
in: body
type: string
description: "The prescriber NPI number."
steps:
- name: get-rwe
type: call
call: "med-info.get-rwe"
with:
product_name: "{{product_name}}"
therapeutic_area: "{{therapeutic_area}}"
- name: get-prescriber
type: call
call: "veeva-crm.get-hcp"
with:
npi_number: "{{npi_number}}"
- name: create-briefing
type: call
call: "sharepoint.create-file"
with:
site_id: "medical-affairs"
file_path: "MSL-Briefings/{{get-prescriber.full_name}}_{{product_name}}_briefing.json"
content_type: "application/json"
consumes:
- type: http
namespace: med-info
baseUri: "https://medinfo.novonordisk.com/api/v2"
authentication:
type: bearer
token: "$secrets.medinfo_token"
resources:
- name: rwe
path: "/real-world-evidence?product={{product_name}}&area={{therapeutic_area}}"
inputParameters:
- name: product_name
in: query
- name: therapeutic_area
in: query
operations:
- name: get-rwe
method: GET
- type: http
namespace: veeva-crm
baseUri: "https://novonordisk.veevacrm.com/api/v1"
authentication:
type: bearer
token: "$secrets.veeva_crm_token"
resources:
- name: hcps
path: "/accounts?q=npi__v={{npi_number}}"
inputParameters:
- name: npi_number
in: query
operations:
- name: get-hcp
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Retrieves health authority correspondence from Veeva Vault RIM, logs the response deadline in Jira, and sends a reminder to the regulatory affairs lead on Microsoft Teams.
naftiko: "0.5"
info:
label: "Regulatory Health Authority Correspondence Tracker"
description: "Retrieves health authority correspondence from Veeva Vault RIM, logs the response deadline in Jira, and sends a reminder to the regulatory affairs lead on Microsoft Teams."
tags:
- regulatory
- veeva-vault
- jira
- microsoft-teams
- health-authority
capability:
exposes:
- type: mcp
namespace: reg-correspondence
port: 8080
tools:
- name: track-ha-correspondence
description: "Given a Veeva Vault RIM correspondence ID, retrieve details, create a Jira tracking issue, and notify the regulatory lead."
inputParameters:
- name: correspondence_id
in: body
type: string
description: "The Veeva Vault RIM correspondence document ID."
- name: reg_lead_email
in: body
type: string
description: "The regulatory affairs lead email."
steps:
- name: get-correspondence
type: call
call: "veeva-rim.get-correspondence"
with:
correspondence_id: "{{correspondence_id}}"
- name: create-tracking-issue
type: call
call: "jira.create-issue"
with:
project_key: "REG"
issue_type: "Task"
summary: "HA Correspondence: {{get-correspondence.subject}} — Due {{get-correspondence.response_due_date}}"
description: "Authority: {{get-correspondence.authority}}. Product: {{get-correspondence.product}}. Type: {{get-correspondence.correspondence_type}}. Response due: {{get-correspondence.response_due_date}}."
priority: "High"
- name: notify-reg-lead
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{reg_lead_email}}"
text: "New HA correspondence received: {{get-correspondence.subject}}. Authority: {{get-correspondence.authority}}. Response due: {{get-correspondence.response_due_date}}. Jira: {{create-tracking-issue.key}}."
consumes:
- type: http
namespace: veeva-rim
baseUri: "https://novonordisk-rim.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_rim_token"
resources:
- name: correspondence
path: "/objects/correspondence__v/{{correspondence_id}}"
inputParameters:
- name: correspondence_id
in: path
operations:
- name: get-correspondence
method: GET
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Generates a Periodic Safety Update Report by pulling case data from Veeva Vault Safety, aggregating line listings, creating the PSUR document in Veeva Vault RIM, and scheduling the regulatory submission in Jira.
naftiko: "0.5"
info:
label: "Regulatory PSUR Generation Pipeline"
description: "Generates a Periodic Safety Update Report by pulling case data from Veeva Vault Safety, aggregating line listings, creating the PSUR document in Veeva Vault RIM, and scheduling the regulatory submission in Jira."
tags:
- pharmacovigilance
- regulatory
- psur
- veeva-vault
- jira
capability:
exposes:
- type: mcp
namespace: pv-psur
port: 8080
tools:
- name: generate-psur
description: "Given a product name and PSUR period, aggregate safety data, generate the PSUR document, and schedule the regulatory submission."
inputParameters:
- name: product_name
in: body
type: string
description: "The product name for the PSUR."
- name: period_start
in: body
type: string
description: "PSUR period start date (YYYY-MM-DD)."
- name: period_end
in: body
type: string
description: "PSUR period end date (YYYY-MM-DD)."
- name: submission_deadline
in: body
type: string
description: "Regulatory submission deadline (YYYY-MM-DD)."
steps:
- name: get-case-data
type: call
call: "veeva-safety.get-psur-cases"
with:
product_name: "{{product_name}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
- name: create-psur-document
type: call
call: "veeva-rim.create-psur"
with:
product_name: "{{product_name}}"
period_start: "{{period_start}}"
period_end: "{{period_end}}"
case_count: "{{get-case-data.total_cases}}"
sae_count: "{{get-case-data.serious_cases}}"
- name: schedule-submission
type: call
call: "jira.create-issue"
with:
project_key: "REG"
issue_type: "Task"
summary: "Submit PSUR: {{product_name}} ({{period_start}} to {{period_end}})"
description: "PSUR document: {{create-psur-document.document_url}}. Total cases: {{get-case-data.total_cases}}, SAEs: {{get-case-data.serious_cases}}. Submission deadline: {{submission_deadline}}."
priority: "High"
due_date: "{{submission_deadline}}"
consumes:
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: psur-cases
path: "/objects/safety_case/actions/psur-aggregate"
operations:
- name: get-psur-cases
method: POST
- type: http
namespace: veeva-rim
baseUri: "https://novonordisk-rim.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_rim_token"
resources:
- name: psur
path: "/objects/psur__v"
operations:
- name: create-psur
method: POST
- type: http
namespace: jira
baseUri: "https://novonordisk.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Retrieves a regulatory submission document from Veeva Vault RIM by document number, checks its approval workflow progress, and notifies the regulatory affairs lead on Microsoft Teams with the status summary.
naftiko: "0.5"
info:
label: "Regulatory Submission Document Status and Notification"
description: "Retrieves a regulatory submission document from Veeva Vault RIM by document number, checks its approval workflow progress, and notifies the regulatory affairs lead on Microsoft Teams with the status summary."
tags:
- regulatory
- veeva-vault
- microsoft-teams
- document-management
capability:
exposes:
- type: mcp
namespace: reg-docs
port: 8080
tools:
- name: check-submission-document
description: "Look up a Veeva Vault RIM regulatory document by document number, check approval progress, and notify the regulatory lead."
inputParameters:
- name: document_number
in: body
type: string
description: "The Veeva Vault RIM document number."
- name: reg_lead_email
in: body
type: string
description: "Email of the regulatory affairs lead to notify."
steps:
- name: get-document
type: call
call: "veeva-rim.get-document"
with:
document_number: "{{document_number}}"
- name: notify-reg-lead
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{reg_lead_email}}"
text: "Submission document {{document_number}}: Status — {{get-document.status}}, Version — {{get-document.version}}, Lifecycle — {{get-document.lifecycle_state}}, Reviewer — {{get-document.reviewer}}."
consumes:
- type: http
namespace: veeva-rim
baseUri: "https://novonordisk-rim.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_rim_token"
resources:
- name: documents
path: "/objects/documents?q=document_number__v={{document_number}}"
inputParameters:
- name: document_number
in: query
operations:
- name: get-document
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves a patient support case from Salesforce Health Cloud by case number and returns case status, assigned coordinator, program details, and recent interactions.
naftiko: "0.5"
info:
label: "Salesforce Health Cloud Patient Case Lookup"
description: "Retrieves a patient support case from Salesforce Health Cloud by case number and returns case status, assigned coordinator, program details, and recent interactions."
tags:
- patient-support
- salesforce
- salesforce-health-cloud
- case-management
capability:
exposes:
- type: mcp
namespace: patient-cases
port: 8080
tools:
- name: get-patient-case
description: "Look up a patient support case in Salesforce Health Cloud by case number. Returns status, program, coordinator, and last contact date."
inputParameters:
- name: case_number
in: body
type: string
description: "The Salesforce Health Cloud case number."
call: "sfdc-health.get-case"
with:
case_number: "{{case_number}}"
outputParameters:
- name: status
type: string
mapping: "$.Status"
- name: program
type: string
mapping: "$.Program__c"
- name: coordinator
type: string
mapping: "$.Owner.Name"
- name: last_contact
type: string
mapping: "$.LastModifiedDate"
consumes:
- type: http
namespace: sfdc-health
baseUri: "https://novonordisk.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.sfdc_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_number}}"
inputParameters:
- name: case_number
in: path
operations:
- name: get-case
method: GET
Queries SAP S/4HANA for an insulin manufacturing batch record and returns batch status, yield, release state, and quality disposition.
naftiko: "0.5"
info:
label: "SAP Manufacturing Batch Status"
description: "Queries SAP S/4HANA for an insulin manufacturing batch record and returns batch status, yield, release state, and quality disposition."
tags:
- manufacturing
- sap
- sap-s4hana
- batch-management
- quality
capability:
exposes:
- type: mcp
namespace: mfg-batch
port: 8080
tools:
- name: get-batch-status
description: "Look up an SAP manufacturing batch by batch number and plant code. Returns batch status, quantity produced, quality inspection result, and release state."
inputParameters:
- name: batch_number
in: body
type: string
description: "The SAP batch number."
- name: plant_code
in: body
type: string
description: "The SAP plant code (e.g., DK01 for Kalundborg)."
call: "sap.get-batch"
with:
batch_number: "{{batch_number}}"
plant_code: "{{plant_code}}"
outputParameters:
- name: status
type: string
mapping: "$.d.BatchStatus"
- name: quantity_produced
type: string
mapping: "$.d.TotalGoodsReceiptQty"
- name: inspection_result
type: string
mapping: "$.d.QualityInspectionResult"
- name: release_state
type: string
mapping: "$.d.BatchReleaseIndicator"
consumes:
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: batches
path: "/A_Batch(Batch='{{batch_number}}',Plant='{{plant_code}}')"
inputParameters:
- name: batch_number
in: path
- name: plant_code
in: path
operations:
- name: get-batch
method: GET
Retrieves a material master record from SAP S/4HANA by material number and returns description, material type, storage conditions, and shelf life for supply chain planning.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves a material master record from SAP S/4HANA by material number and returns description, material type, storage conditions, and shelf life for supply chain planning."
tags:
- supply-chain
- sap
- sap-s4hana
- material-management
capability:
exposes:
- type: mcp
namespace: supply-chain
port: 8080
tools:
- name: get-material
description: "Look up an SAP material master by material number. Returns description, type, base unit, storage conditions, and remaining shelf life."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap.get-material"
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialName"
- name: material_type
type: string
mapping: "$.d.MaterialType"
- name: base_unit
type: string
mapping: "$.d.BaseUnit"
- name: storage_conditions
type: string
mapping: "$.d.StorageConditions"
- name: shelf_life_days
type: number
mapping: "$.d.MaximumStoragePeriod"
consumes:
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: materials
path: "/A_Product('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
Retrieves a production order from SAP S/4HANA by order number and returns status, planned vs actual quantities, and completion percentage for manufacturing oversight.
naftiko: "0.5"
info:
label: "SAP Production Order Status"
description: "Retrieves a production order from SAP S/4HANA by order number and returns status, planned vs actual quantities, and completion percentage for manufacturing oversight."
tags:
- manufacturing
- sap
- sap-s4hana
- production-order
capability:
exposes:
- type: mcp
namespace: mfg-production
port: 8080
tools:
- name: get-production-order
description: "Look up a SAP production order by order number. Returns status, material, planned quantity, actual quantity, and completion percentage."
inputParameters:
- name: order_number
in: body
type: string
description: "The SAP production order number."
call: "sap.get-production-order"
with:
order_number: "{{order_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.ManufacturingOrderStatus"
- name: material
type: string
mapping: "$.d.Material"
- name: planned_quantity
type: string
mapping: "$.d.TotalPlannedQuantity"
- name: actual_quantity
type: string
mapping: "$.d.TotalGoodsReceiptQuantity"
- name: completion_pct
type: number
mapping: "$.d.CompletionPercent"
consumes:
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-production-order
method: GET
Retrieves a purchase order from SAP S/4HANA by PO number and returns header status, vendor, total value, and delivery date for procurement teams.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Retrieves a purchase order from SAP S/4HANA by PO number and returns header status, vendor, total value, and delivery date for procurement teams."
tags:
- procurement
- sap
- sap-s4hana
- purchase-order
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up an SAP S/4HANA purchase order by PO number. Returns status, vendor name, total value, currency, and expected delivery date."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number (10-digit)."
call: "sap.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Validates drug product serialization data against the SAP ATTP system, checks FDA DSCSA compliance status, and creates a ServiceNow alert if any serialization discrepancy is found.
naftiko: "0.5"
info:
label: "Serialization and Track-and-Trace Validator"
description: "Validates drug product serialization data against the SAP ATTP system, checks FDA DSCSA compliance status, and creates a ServiceNow alert if any serialization discrepancy is found."
tags:
- supply-chain
- serialization
- sap
- dscsa
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: serialization
port: 8080
tools:
- name: validate-serialization
description: "Given a serial number and product GTIN, validate against SAP ATTP, check DSCSA compliance, and alert on discrepancies."
inputParameters:
- name: serial_number
in: body
type: string
description: "The drug product serial number."
- name: gtin
in: body
type: string
description: "The Global Trade Item Number (GTIN) of the product."
- name: lot_number
in: body
type: string
description: "The lot/batch number."
steps:
- name: verify-serial
type: call
call: "sap-attp.verify-serial"
with:
serial_number: "{{serial_number}}"
gtin: "{{gtin}}"
lot_number: "{{lot_number}}"
- name: create-discrepancy-alert
type: call
call: "servicenow.create-incident"
with:
short_description: "Serialization discrepancy: SN {{serial_number}} GTIN {{gtin}}"
category: "serialization"
assigned_group: "Supply_Chain_Serialization"
description: "Serial number {{serial_number}} for GTIN {{gtin}}, Lot {{lot_number}}. Verification status: {{verify-serial.status}}. Expected status: {{verify-serial.expected_status}}. Discrepancy: {{verify-serial.discrepancy_reason}}."
consumes:
- type: http
namespace: sap-attp
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_ATTP_SERIAL_NUMBER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: serial-verification
path: "/A_SerialNumber(SerialNumber='{{serial_number}}',GTIN='{{gtin}}')"
inputParameters:
- name: serial_number
in: path
- name: gtin
in: path
operations:
- name: verify-serial
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.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
Retrieves a GxP deviation ticket from ServiceNow by incident number and returns severity, CAPA status, and root cause classification for quality assurance.
naftiko: "0.5"
info:
label: "ServiceNow GxP Deviation Ticket Lookup"
description: "Retrieves a GxP deviation ticket from ServiceNow by incident number and returns severity, CAPA status, and root cause classification for quality assurance."
tags:
- quality
- servicenow
- gxp
- deviation
capability:
exposes:
- type: mcp
namespace: qa-deviations
port: 8080
tools:
- name: get-deviation-ticket
description: "Look up a GxP deviation ticket in ServiceNow by incident number. Returns severity, current status, CAPA link, root cause, and assigned investigator."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number for the deviation."
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
outputParameters:
- name: severity
type: string
mapping: "$.result.severity"
- name: status
type: string
mapping: "$.result.state"
- name: root_cause
type: string
mapping: "$.result.u_root_cause"
- name: assigned_to
type: string
mapping: "$.result.assigned_to.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
Retrieves a document or file from SharePoint Online by site and file path for cross-functional information sharing.
naftiko: "0.5"
info:
label: "SharePoint Document Retrieval"
description: "Retrieves a document or file from SharePoint Online by site and file path for cross-functional information sharing."
tags:
- collaboration
- sharepoint
- document-management
capability:
exposes:
- type: mcp
namespace: sharepoint-docs
port: 8080
tools:
- name: get-sharepoint-file
description: "Retrieve a file from SharePoint Online by site ID and file path. Returns download URL, last modified date, and file size."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site identifier."
- name: file_path
in: body
type: string
description: "The path to the file within the site drive."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
outputParameters:
- name: download_url
type: string
mapping: "$.['@microsoft.graph.downloadUrl']"
- name: last_modified
type: string
mapping: "$.lastModifiedDateTime"
- name: file_size
type: number
mapping: "$.size"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file
method: GET
Posts a message to a Slack channel using the Slack API for cross-functional team communications.
naftiko: "0.5"
info:
label: "Slack Channel Message Sender"
description: "Posts a message to a Slack channel using the Slack API for cross-functional team communications."
tags:
- communication
- slack
capability:
exposes:
- type: mcp
namespace: comms
port: 8080
tools:
- name: send-slack-message
description: "Post a message to a specified Slack channel."
inputParameters:
- name: channel
in: body
type: string
description: "The Slack channel name or ID."
- name: message_text
in: body
type: string
description: "The message text to post."
call: "slack.post-message"
with:
channel: "{{channel}}"
text: "{{message_text}}"
outputParameters:
- name: message_ts
type: string
mapping: "$.ts"
- name: channel_id
type: string
mapping: "$.channel"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Checks SOP training completion status in Veeva Vault QMS Training, cross-references with Workday employee records, and creates a ServiceNow compliance task for overdue completions.
naftiko: "0.5"
info:
label: "SOP Training Compliance Tracker"
description: "Checks SOP training completion status in Veeva Vault QMS Training, cross-references with Workday employee records, and creates a ServiceNow compliance task for overdue completions."
tags:
- quality
- training
- veeva-vault
- workday
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-training-compliance
description: "Given a document number and department, check training completion rates, identify overdue employees, and create compliance follow-up tasks."
inputParameters:
- name: document_number
in: body
type: string
description: "The Veeva Vault QMS SOP document number."
- name: department
in: body
type: string
description: "The department to check training compliance for."
steps:
- name: get-training-status
type: call
call: "veeva-qms.get-training-assignments"
with:
document_number: "{{document_number}}"
department: "{{department}}"
- name: create-compliance-task
type: call
call: "servicenow.create-task"
with:
short_description: "SOP training overdue: {{document_number}} — {{department}}"
description: "{{get-training-status.overdue_count}} employees in {{department}} have overdue training for SOP {{document_number}}. Overdue list: {{get-training-status.overdue_employees}}. Due date was: {{get-training-status.due_date}}."
assigned_group: "QA_Training"
category: "training_compliance"
consumes:
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: training-assignments
path: "/objects/training_assignment__v?q=document_number={{document_number}}&department={{department}}"
inputParameters:
- name: document_number
in: query
- name: department
in: query
operations:
- name: get-training-assignments
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves stability study sample information from LabWare LIMS, checks upcoming pull dates, and creates a ServiceNow task for the QC lab when the next pull is due within 7 days.
naftiko: "0.5"
info:
label: "Stability Study Sample Pull Reminder"
description: "Retrieves stability study sample information from LabWare LIMS, checks upcoming pull dates, and creates a ServiceNow task for the QC lab when the next pull is due within 7 days."
tags:
- quality
- stability
- labware
- lims
- servicenow
capability:
exposes:
- type: mcp
namespace: stability
port: 8080
tools:
- name: check-stability-pulls
description: "Given a stability study ID, check sample status and create a ServiceNow task if the next pull date is approaching."
inputParameters:
- name: stability_study_id
in: body
type: string
description: "The LabWare LIMS stability study identifier."
steps:
- name: get-study
type: call
call: "labware.get-stability-study"
with:
stability_study_id: "{{stability_study_id}}"
- name: create-pull-task
type: call
call: "servicenow.create-task"
with:
short_description: "Stability sample pull due: Study {{stability_study_id}} — {{get-study.next_pull_date}}"
description: "Stability study {{stability_study_id}}: {{get-study.completed_timepoints}} time points completed, {{get-study.total_samples}} total samples. Next pull date: {{get-study.next_pull_date}}. Storage condition: {{get-study.storage_condition}}."
assigned_group: "QC_Stability_Lab"
category: "stability_testing"
consumes:
- type: http
namespace: labware
baseUri: "https://lims.novonordisk.com/labware/api/v3"
authentication:
type: bearer
token: "$secrets.labware_token"
resources:
- name: stability-studies
path: "/stability-studies/{{stability_study_id}}"
inputParameters:
- name: stability_study_id
in: path
operations:
- name: get-stability-study
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves supplier details from SAP Ariba, checks last audit date in Veeva Vault QMS, schedules an audit task in ServiceNow, and notifies the quality auditor on Microsoft Teams.
naftiko: "0.5"
info:
label: "Supplier GMP Audit Scheduling Orchestrator"
description: "Retrieves supplier details from SAP Ariba, checks last audit date in Veeva Vault QMS, schedules an audit task in ServiceNow, and notifies the quality auditor on Microsoft Teams."
tags:
- quality
- supplier-audit
- sap-ariba
- veeva-vault
- servicenow
- microsoft-teams
- gmp
capability:
exposes:
- type: mcp
namespace: supplier-audits
port: 8080
tools:
- name: schedule-gmp-audit
description: "Given a supplier ID and auditor worker ID, retrieve supplier details, check audit history, schedule an audit, and notify the auditor."
inputParameters:
- name: supplier_id
in: body
type: string
description: "The SAP Ariba supplier identifier."
- name: auditor_worker_id
in: body
type: string
description: "The Workday worker ID of the assigned auditor."
- name: audit_date
in: body
type: string
description: "Proposed audit date in YYYY-MM-DD format."
steps:
- name: get-supplier
type: call
call: "ariba.get-supplier"
with:
supplier_id: "{{supplier_id}}"
- name: get-audit-history
type: call
call: "veeva-qms.get-audit-history"
with:
supplier_id: "{{supplier_id}}"
- name: create-audit-task
type: call
call: "servicenow.create-task"
with:
short_description: "GMP Audit: {{get-supplier.supplier_name}} — {{audit_date}}"
description: "Scheduled GMP audit for {{get-supplier.supplier_name}} ({{supplier_id}}). Last audit: {{get-audit-history.last_audit_date}}. Last finding count: {{get-audit-history.findings_count}}. Proposed date: {{audit_date}}."
assigned_group: "QA_Supplier_Audit"
category: "supplier_audit"
- name: notify-auditor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{auditor_worker_id}}@novonordisk.com"
text: "GMP audit scheduled for {{get-supplier.supplier_name}} on {{audit_date}}. Last audit: {{get-audit-history.last_audit_date}}. Previous findings: {{get-audit-history.findings_count}}. ServiceNow: {{create-audit-task.number}}."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers/{{supplier_id}}"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier
method: GET
- type: http
namespace: veeva-qms
baseUri: "https://novonordisk-qualitydocs.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_qms_token"
resources:
- name: audit-history
path: "/objects/audit__v?q=supplier_id={{supplier_id}}"
inputParameters:
- name: supplier_id
in: query
operations:
- name: get-audit-history
method: GET
- type: http
namespace: servicenow
baseUri: "https://novonordisk.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls demand forecast data from SAP IBP, cross-references with current inventory in SAP S/4HANA, and creates a procurement requisition in SAP Ariba when stock falls below reorder point.
naftiko: "0.5"
info:
label: "Supply Chain Demand Forecast Pipeline"
description: "Pulls demand forecast data from SAP IBP, cross-references with current inventory in SAP S/4HANA, and creates a procurement requisition in SAP Ariba when stock falls below reorder point."
tags:
- supply-chain
- demand-planning
- sap-ibp
- sap-s4hana
- sap-ariba
- inventory
capability:
exposes:
- type: mcp
namespace: supply-demand
port: 8080
tools:
- name: check-demand-vs-inventory
description: "Given a material number and planning horizon, pull the demand forecast from SAP IBP, check current stock in S/4HANA, and create an Ariba requisition if below reorder point."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: horizon_weeks
in: body
type: number
description: "Number of weeks for the demand forecast horizon."
steps:
- name: get-forecast
type: call
call: "sap-ibp.get-demand-forecast"
with:
material_number: "{{material_number}}"
plant_code: "{{plant_code}}"
horizon_weeks: "{{horizon_weeks}}"
- name: get-inventory
type: call
call: "sap.get-stock"
with:
material_number: "{{material_number}}"
plant_code: "{{plant_code}}"
- name: create-requisition
type: call
call: "ariba.create-requisition"
with:
material_number: "{{material_number}}"
plant_code: "{{plant_code}}"
quantity: "{{get-forecast.total_demand}}"
justification: "Forecasted demand: {{get-forecast.total_demand}} units over {{horizon_weeks}} weeks. Current stock: {{get-inventory.available_quantity}}. Reorder point: {{get-inventory.reorder_point}}."
consumes:
- type: http
namespace: sap-ibp
baseUri: "https://novonordisk-ibp.sap.com/sap/opu/odata/IBP/DEMAND_PLANNING_SRV"
authentication:
type: basic
username: "$secrets.sap_ibp_user"
password: "$secrets.sap_ibp_password"
resources:
- name: forecast
path: "/DemandForecast(Material='{{material_number}}',Plant='{{plant_code}}')"
inputParameters:
- name: material_number
in: path
- name: plant_code
in: path
operations:
- name: get-demand-forecast
method: GET
- type: http
namespace: sap
baseUri: "https://novonordisk-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
inputParameters:
- name: Accept
in: header
value: "application/json"
- name: sap-client
in: header
value: "100"
resources:
- name: stock
path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant_code}}')"
inputParameters:
- name: material_number
in: path
- name: plant_code
in: path
operations:
- name: get-stock
method: GET
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: requisitions
path: "/requisitions"
operations:
- name: create-requisition
method: POST
Retrieves a Trial Master File document from Veeva Vault eTMF by document ID and returns title, status, study association, and filing date.
naftiko: "0.5"
info:
label: "Veeva Vault eTMF Document Lookup"
description: "Retrieves a Trial Master File document from Veeva Vault eTMF by document ID and returns title, status, study association, and filing date."
tags:
- clinical-trials
- veeva-vault
- etmf
- document-management
capability:
exposes:
- type: mcp
namespace: etmf-docs
port: 8080
tools:
- name: get-etmf-document
description: "Look up an eTMF document in Veeva Vault by document ID. Returns title, lifecycle state, study, and country."
inputParameters:
- name: document_id
in: body
type: string
description: "The Veeva Vault eTMF document ID."
call: "veeva-etmf.get-document"
with:
document_id: "{{document_id}}"
outputParameters:
- name: title
type: string
mapping: "$.data.name__v"
- name: lifecycle_state
type: string
mapping: "$.data.lifecycle__v.state"
- name: study
type: string
mapping: "$.data.study__v.name"
- name: country
type: string
mapping: "$.data.country__v"
consumes:
- type: http
namespace: veeva-etmf
baseUri: "https://novonordisk-etmf.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_etmf_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
Retrieves a safety case from Veeva Vault Safety by case number and returns case type, seriousness, product, reporter type, and current workflow state.
naftiko: "0.5"
info:
label: "Veeva Vault Safety Case Lookup"
description: "Retrieves a safety case from Veeva Vault Safety by case number and returns case type, seriousness, product, reporter type, and current workflow state."
tags:
- pharmacovigilance
- veeva-vault
- safety-case
capability:
exposes:
- type: mcp
namespace: pv-cases
port: 8080
tools:
- name: get-safety-case
description: "Look up a safety case in Veeva Vault Safety by case number. Returns case type, seriousness, product, and workflow state."
inputParameters:
- name: case_number
in: body
type: string
description: "The Veeva Vault Safety case number."
call: "veeva-safety.get-case"
with:
case_number: "{{case_number}}"
outputParameters:
- name: case_type
type: string
mapping: "$.data.case_type__v"
- name: seriousness
type: string
mapping: "$.data.seriousness_criteria__v"
- name: product
type: string
mapping: "$.data.product__v.name"
- name: workflow_state
type: string
mapping: "$.data.lifecycle__v.state"
consumes:
- type: http
namespace: veeva-safety
baseUri: "https://novonordisk-safety.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_safety_token"
resources:
- name: cases
path: "/objects/safety_case/{{case_number}}"
inputParameters:
- name: case_number
in: path
operations:
- name: get-case
method: GET
Retrieves employee details from Workday by worker ID including department, manager, cost center, and location for HR and compliance inquiries.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee details from Workday by worker ID including department, manager, cost center, and location for HR and compliance inquiries."
tags:
- hr
- workday
- employee-management
capability:
exposes:
- type: mcp
namespace: hr-employees
port: 8080
tools:
- name: get-employee
description: "Look up an employee in Workday by worker ID. Returns full name, department, manager, cost center, and work location."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.worker.descriptor"
- name: department
type: string
mapping: "$.worker.primaryPosition.department"
- name: manager
type: string
mapping: "$.worker.primaryPosition.manager.descriptor"
- name: cost_center
type: string
mapping: "$.worker.primaryPosition.costCenter"
- name: location
type: string
mapping: "$.worker.primaryPosition.location"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/novonordisk"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET