Novo Nordisk Capabilities

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

Sort
Expand

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