AstraZeneca Capabilities

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

Sort
Expand

Collects access entitlements, routes for review, revokes expired access, and creates audit records.

naftiko: "0.5"
info:
  label: "Access Review Certification Pipeline"
  description: "Collects access entitlements, routes for review, revokes expired access, and creates audit records."
  tags:
    - security
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: access_review_certification_pipeline
          description: "Orchestrate access review certification pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-okta
              type: call
              call: "okta.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-okta.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Access Review Certification Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: okta
      baseUri: "https://astrazeneca.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves an adverse event case from the pharmacovigilance safety database by case ID, returning patient demographics, suspected drug, event terms, and seriousness classification.

naftiko: "0.5"
info:
  label: "Adverse Event Report Lookup"
  description: "Retrieves an adverse event case from the pharmacovigilance safety database by case ID, returning patient demographics, suspected drug, event terms, and seriousness classification."
  tags:
    - pharmacovigilance
    - drug-safety
    - adverse-events
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: pharmacovigilance
      port: 8080
      tools:
        - name: get-adverse-event
          description: "Look up an adverse event case by case number, log the inquiry in ServiceNow for audit trail, and notify the pharmacovigilance team via Slack."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The safety database case number."
            - name: requester_name
              in: body
              type: string
              description: "Name of the person requesting the case review."
          steps:
            - name: fetch-case
              type: call
              call: "safety-db.get-case"
              with:
                case_number: "{{case_number}}"
            - name: log-inquiry
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_pv_case_inquiries"
                case_number: "{{case_number}}"
                requester: "{{requester_name}}"
                seriousness: "{{fetch-case.seriousness}}"
            - name: notify-pv
              type: call
              call: "slack.post-message"
              with:
                channel: "pharmacovigilance"
                text: "AE case {{case_number}} reviewed by {{requester_name}}. Product: {{fetch-case.products[0].name}}. PT: {{fetch-case.events[0].meddra_pt}}. Seriousness: {{fetch-case.seriousness}}."
  consumes:
    - type: http
      namespace: safety-db
      baseUri: "https://astrazeneca-safety.oracle.com/argus/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argus_token"
      resources:
        - name: cases
          path: "/cases/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              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

Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress.

naftiko: "0.5"
info:
  label: "API Deprecation Notice Pipeline"
  description: "Identifies deprecated API consumers, sends migration notices, tracks adoption, and reports progress."
  tags:
    - engineering
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: api_deprecation_notice_pipeline
          description: "Orchestrate api deprecation notice pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "API Deprecation Notice Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves current monitoring alert status. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Alert Status Check"
  description: "Retrieves current monitoring alert status. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: elasticsearc
      port: 8080
      tools:
        - name: get-alert_status_check
          description: "Retrieves current monitoring alert status. Used by AstraZeneca teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The alert_id to look up." 
          call: "elasticsearch.get-alert_id"
          with:
            alert_id: "{{alert_id}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://astrazeneca-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_alert_status_check
              method: GET

Checks availability of an API endpoint. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca API Endpoint Status"
  description: "Checks availability of an API endpoint. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: get-api_endpoint_status
          description: "Checks availability of an API endpoint. Used by AstraZeneca teams."
          inputParameters:
            - name: endpoint_url
              in: body
              type: string
              description: "The endpoint_url to look up." 
          call: "grafana.get-endpoint_url"
          with:
            endpoint_url: "{{endpoint_url}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://astrazeneca-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_api_endpoint_statu
              method: GET

Ingests clinical trial data, validates against protocol, loads into analytics platform, and notifies researchers.

naftiko: "0.5"
info:
  label: "Clinical Trial Data Pipeline"
  description: "Ingests clinical trial data, validates against protocol, loads into analytics platform, and notifies researchers."
  tags:
    - clinical
    - snowflake
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: clinical
      port: 8080
      tools:
        - name: astrazeneca_clinical_trial_data_pipeline
          description: "Orchestrate clinical trial data pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Clinical Trial Data Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves compliance check status. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Compliance Check Status"
  description: "Retrieves compliance check status. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - okta
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: get-compliance_check_status
          description: "Retrieves compliance check status. Used by AstraZeneca teams."
          inputParameters:
            - name: check_id
              in: body
              type: string
              description: "The check_id to look up." 
          call: "okta.get-check_id"
          with:
            check_id: "{{check_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://astrazeneca.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_compliance_check_s
              method: GET

Queries cost and spending data. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Cost Report Query"
  description: "Queries cost and spending data. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - workday
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: get-cost_report_query
          description: "Queries cost and spending data. Used by AstraZeneca teams."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The cost_center to look up." 
          call: "workday.get-cost_center"
          with:
            cost_center: "{{cost_center}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_cost_report_query
              method: GET

Executes a read-only analytics query. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Database Query Runner"
  description: "Executes a read-only analytics query. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: powerbi
      port: 8080
      tools:
        - name: get-database_query_runner
          description: "Executes a read-only analytics query. Used by AstraZeneca teams."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The sql_query to look up." 
          call: "powerbi.get-sql_query"
          with:
            sql_query: "{{sql_query}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_database_query_run
              method: GET

Checks status of a recent deployment. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Deployment Status Check"
  description: "Checks status of a recent deployment. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - github
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: get-deployment_status_check
          description: "Checks status of a recent deployment. Used by AstraZeneca teams."
          inputParameters:
            - name: deployment_id
              in: body
              type: string
              description: "The deployment_id to look up." 
          call: "github.get-deployment_id"
          with:
            deployment_id: "{{deployment_id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_deployment_status_
              method: GET

Retrieves a document from knowledge management. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Document Retrieval"
  description: "Retrieves a document from knowledge management. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: confluence
      port: 8080
      tools:
        - name: get-document_retrieval
          description: "Retrieves a document from knowledge management. Used by AstraZeneca teams."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The document_id to look up." 
          call: "confluence.get-document_id"
          with:
            document_id: "{{document_id}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_document_retrieval
              method: GET

Analyzes adverse event reports, detects safety signals, creates investigation cases, and alerts pharmacovigilance.

naftiko: "0.5"
info:
  label: "Drug Safety Signal Detection Pipeline"
  description: "Analyzes adverse event reports, detects safety signals, creates investigation cases, and alerts pharmacovigilance."
  tags:
    - safety
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: astrazeneca_drug_safety_signal_detection
          description: "Orchestrate drug safety signal detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Drug Safety Signal Detection Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "Employee Onboarding Automation Pipeline"
  description: "Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers."
  tags:
    - hr
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: astrazeneca_employee_onboarding_automati
          description: "Orchestrate employee onboarding automation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Employee Onboarding Automation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries metric values from a monitoring dashboard. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Metric Dashboard Query"
  description: "Queries metric values from a monitoring dashboard. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: get-metric_dashboard_query
          description: "Queries metric values from a monitoring dashboard. Used by AstraZeneca teams."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The metric_name to look up." 
          call: "jira.get-metric_name"
          with:
            metric_name: "{{metric_name}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_jira_metric_dashbo
              method: GET

Schedules equipment calibration, tracks completion, validates results, and creates maintenance records.

naftiko: "0.5"
info:
  label: "Lab Equipment Calibration Pipeline"
  description: "Schedules equipment calibration, tracks completion, validates results, and creates maintenance records."
  tags:
    - quality
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: astrazeneca_lab_equipment_calibration_pi
          description: "Orchestrate lab equipment calibration pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Lab Equipment Calibration Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Searches application logs for matching patterns. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Log Search Query"
  description: "Searches application logs for matching patterns. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: get-log_search_query
          description: "Searches application logs for matching patterns. Used by AstraZeneca teams."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "servicenow.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_log_search_query
              method: GET

Queries metric values from a monitoring dashboard. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Metric Dashboard Query"
  description: "Queries metric values from a monitoring dashboard. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: get-metric_dashboard_query
          description: "Queries metric values from a monitoring dashboard. Used by AstraZeneca teams."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The metric_name to look up." 
          call: "jira.get-metric_name"
          with:
            metric_name: "{{metric_name}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_metric_dashboard_q
              method: GET

Analyzes recruitment metrics, optimizes site selection, adjusts outreach, and reports to study teams.

naftiko: "0.5"
info:
  label: "Patient Recruitment Optimization Pipeline"
  description: "Analyzes recruitment metrics, optimizes site selection, adjusts outreach, and reports to study teams."
  tags:
    - clinical
    - snowflake
    - salesforce
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: clinical
      port: 8080
      tools:
        - name: astrazeneca_patient_recruitment_optimiza
          description: "Orchestrate patient recruitment optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Patient Recruitment Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Checks the current status of a project. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Project Status Check"
  description: "Checks the current status of a project. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: datadog
      port: 8080
      tools:
        - name: get-project_status_check
          description: "Checks the current status of a project. Used by AstraZeneca teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The project_key to look up." 
          call: "datadog.get-project_key"
          with:
            project_key: "{{project_key}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_project_status_che
              method: GET

Tracks regulatory submission milestones, monitors agency responses, and notifies regulatory affairs.

naftiko: "0.5"
info:
  label: "Regulatory Submission Tracker Pipeline"
  description: "Tracks regulatory submission milestones, monitors agency responses, and notifies regulatory affairs."
  tags:
    - regulatory
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: regulatory
      port: 8080
      tools:
        - name: astrazeneca_regulatory_submission_tracke
          description: "Orchestrate regulatory submission tracker pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-jira.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Regulatory Submission Tracker Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves code repository information. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Repository Info Lookup"
  description: "Retrieves code repository information. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: pagerduty
      port: 8080
      tools:
        - name: get-repository_info_lookup
          description: "Retrieves code repository information. Used by AstraZeneca teams."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The repo_name to look up." 
          call: "pagerduty.get-repo_name"
          with:
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_repository_info_lo
              method: GET

Checks the health status of a monitored service. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Service Health Check"
  description: "Checks the health status of a monitored service. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-service_health_check
          description: "Checks the health status of a monitored service. Used by AstraZeneca teams."
          inputParameters:
            - name: health_target
              in: body
              type: string
              description: "The health_target to look up." 
          call: "salesforce.get-health_target"
          with:
            health_target: "{{health_target}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_salesforce_service
              method: GET

Detects security incidents, enriches with context, creates response tickets, and notifies the SOC.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "Detects security incidents, enriches with context, creates response tickets, and notifies the SOC."
  tags:
    - security
    - splunk
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: astrazeneca_security_incident_response_p
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-splunk
              type: call
              call: "splunk.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-splunk.result}}"
            - name: create-pagerduty
              type: call
              call: "pagerduty.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Security Incident Response Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://astrazeneca-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST

Retrieves vulnerability scan results. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Security Scan Results"
  description: "Retrieves vulnerability scan results. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack
      port: 8080
      tools:
        - name: get-security_scan_results
          description: "Retrieves vulnerability scan results. Used by AstraZeneca teams."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The scan_id to look up." 
          call: "slack.get-scan_id"
          with:
            scan_id: "{{scan_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_security_scan_resu
              method: GET

Checks the health status of a monitored service. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Service Health Check"
  description: "Checks the health status of a monitored service. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: get-service_health_check
          description: "Checks the health status of a monitored service. Used by AstraZeneca teams."
          inputParameters:
            - name: health_target
              in: body
              type: string
              description: "The health_target to look up." 
          call: "salesforce.get-health_target"
          with:
            health_target: "{{health_target}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_service_health_che
              method: GET

Searches application logs for matching patterns. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Log Search Query"
  description: "Searches application logs for matching patterns. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: servicenow
      port: 8080
      tools:
        - name: get-log_search_query
          description: "Searches application logs for matching patterns. Used by AstraZeneca teams."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "servicenow.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_servicenow_log_sea
              method: GET

Retrieves the details of a support ticket. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca Ticket Details Lookup"
  description: "Retrieves the details of a support ticket. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: splunk
      port: 8080
      tools:
        - name: get-ticket_details_lookup
          description: "Retrieves the details of a support ticket. Used by AstraZeneca teams."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The ticket_id to look up." 
          call: "splunk.get-ticket_id"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://astrazeneca-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_ticket_details_loo
              method: GET

Retrieves user account details from the directory. Used by AstraZeneca teams.

naftiko: "0.5"
info:
  label: "AstraZeneca User Account Lookup"
  description: "Retrieves user account details from the directory. Used by AstraZeneca teams."
  tags:
    - pharmaceutical
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: get-user_account_lookup
          description: "Retrieves user account details from the directory. Used by AstraZeneca teams."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The user_id to look up." 
          call: "snowflake.get-user_id"
          with:
            user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: astrazeneca_user_account_looku
              method: GET

Checks the status of a deployment on Azure Kubernetes Service, returning replica count, available replicas, pod health, and image version for DevOps teams.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Deployment Status"
  description: "Checks the status of a deployment on Azure Kubernetes Service, returning replica count, available replicas, pod health, and image version for DevOps teams."
  tags:
    - devops
    - infrastructure
    - azure-kubernetes-service
capability:
  exposes:
    - type: mcp
      namespace: k8s-deployments
      port: 8080
      tools:
        - name: get-deployment-status
          description: "Check an AKS deployment status, log health metrics in Datadog, and notify the platform engineering team via Slack if replicas are degraded."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The AKS cluster name."
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace."
            - name: deployment_name
              in: body
              type: string
              description: "The deployment name."
          steps:
            - name: fetch-deployment
              type: call
              call: "aks.get-deployment"
              with:
                cluster_name: "{{cluster_name}}"
                namespace: "{{namespace}}"
                deployment_name: "{{deployment_name}}"
            - name: log-health
              type: call
              call: "datadog.post-event"
              with:
                title: "AKS Deployment Check: {{deployment_name}}"
                text: "Cluster: {{cluster_name}}, Namespace: {{namespace}}. Replicas: {{fetch-deployment.status.availableReplicas}}/{{fetch-deployment.spec.replicas}}. Image: {{fetch-deployment.spec.template.spec.containers[0].image}}"
                tags: "cluster:{{cluster_name}},namespace:{{namespace}}"
            - name: notify-platform-eng
              type: call
              call: "slack.post-message"
              with:
                channel: "platform-engineering"
                text: "Deployment {{deployment_name}} on {{cluster_name}}/{{namespace}}: {{fetch-deployment.status.availableReplicas}}/{{fetch-deployment.spec.replicas}} replicas. Image: {{fetch-deployment.spec.template.spec.containers[0].image}}"
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/rg-astrazeneca-aks/providers/Microsoft.ContainerService/managedClusters/{{cluster_name}}"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: deployments
          path: "/apis/apps/v1/namespaces/{{namespace}}/deployments/{{deployment_name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment_name
              in: path
          operations:
            - name: get-deployment
              method: GET

Ingests biomarker assay results from a lab information system, validates against expected ranges, stores in the Snowflake biomarker warehouse, logs anomalies in Jira, and notifies the translational science team via Slack.

naftiko: "0.5"
info:
  label: "Biomarker Data Ingestion Pipeline"
  description: "Ingests biomarker assay results from a lab information system, validates against expected ranges, stores in the Snowflake biomarker warehouse, logs anomalies in Jira, and notifies the translational science team via Slack."
  tags:
    - research
    - biomarkers
    - translational-science
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: biomarker-ingestion
      port: 8080
      tools:
        - name: ingest-biomarker-data
          description: "Ingest and validate biomarker assay results, store in warehouse, and flag anomalies."
          inputParameters:
            - name: assay_run_id
              in: body
              type: string
              description: "The lab assay run identifier."
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: biomarker_panel
              in: body
              type: string
              description: "The biomarker panel name."
          steps:
            - name: get-assay-results
              type: call
              call: "lims.get-assay-run"
              with:
                run_id: "{{assay_run_id}}"
            - name: store-results
              type: call
              call: "snowflake.insert-record"
              with:
                database: "BIOMARKERS"
                schema: "ASSAY_DATA"
                table: "RESULTS"
                data:
                  assay_run_id: "{{assay_run_id}}"
                  study_id: "{{study_id}}"
                  panel: "{{biomarker_panel}}"
                  sample_count: "{{get-assay-results.sample_count}}"
                  pass_rate: "{{get-assay-results.pass_rate}}"
            - name: flag-anomalies
              type: call
              call: "jira.create-issue"
              with:
                project_key: "BIOM"
                summary: "Biomarker QC Review: {{biomarker_panel}} run {{assay_run_id}} ({{get-assay-results.pass_rate}}% pass rate)"
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "translational-science"
                text: "Biomarker data ingested: {{biomarker_panel}} for study {{study_id}}. Run {{assay_run_id}}: {{get-assay-results.sample_count}} samples, {{get-assay-results.pass_rate}}% pass rate. Review: {{flag-anomalies.key}}"
  consumes:
    - type: http
      namespace: lims
      baseUri: "https://lims.astrazeneca.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.lims_token"
      resources:
        - name: assay-runs
          path: "/assay-runs/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-assay-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.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: 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 a clinical document from Box by file ID, returning file name, size, shared link, last modified date, and parent folder path.

naftiko: "0.5"
info:
  label: "Box Clinical Document Retrieval"
  description: "Retrieves a clinical document from Box by file ID, returning file name, size, shared link, last modified date, and parent folder path."
  tags:
    - document-management
    - clinical-trials
    - box
capability:
  exposes:
    - type: mcp
      namespace: clinical-docs-box
      port: 8080
      tools:
        - name: get-box-file
          description: "Look up a Box file by ID. Returns file name, size, shared link, modified date, and folder path."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
          call: "box.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: string
              mapping: "$.size"
            - name: shared_link
              type: string
              mapping: "$.shared_link.url"
            - name: modified_at
              type: string
              mapping: "$.modified_at"
            - name: folder_path
              type: string
              mapping: "$.path_collection.entries"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Analyzes resource utilization trends, forecasts capacity needs, creates procurement requests, and reports.

naftiko: "0.5"
info:
  label: "Capacity Planning Forecast Pipeline"
  description: "Analyzes resource utilization trends, forecasts capacity needs, creates procurement requests, and reports."
  tags:
    - infrastructure
    - grafana
    - snowflake
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: infrastructure
      port: 8080
      tools:
        - name: capacity_planning_forecast_pipeline
          description: "Orchestrate capacity planning forecast pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-grafana
              type: call
              call: "grafana.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-grafana.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Capacity Planning Forecast Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://astrazeneca-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Validates change requests, routes for approval, schedules implementation, and notifies stakeholders.

naftiko: "0.5"
info:
  label: "Change Management Approval Pipeline"
  description: "Validates change requests, routes for approval, schedules implementation, and notifies stakeholders."
  tags:
    - itsm
    - servicenow
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: change_management_approval_pipeline
          description: "Orchestrate change management approval pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Change Management Approval Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a data query is raised in Oracle Clinical, creates a Jira ticket for the clinical data manager, attaches the query details, and sends a Slack notification to the data management channel.

naftiko: "0.5"
info:
  label: "Clinical Data Query Resolution"
  description: "When a data query is raised in Oracle Clinical, creates a Jira ticket for the clinical data manager, attaches the query details, and sends a Slack notification to the data management channel."
  tags:
    - clinical-trials
    - data-management
    - oracle
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-queries
      port: 8080
      tools:
        - name: escalate-data-query
          description: "Escalate an Oracle Clinical data query to Jira for resolution tracking and notify the data management team via Slack."
          inputParameters:
            - name: query_id
              in: body
              type: string
              description: "The Oracle Clinical data query identifier."
            - name: study_id
              in: body
              type: string
              description: "The study protocol number."
            - name: site_number
              in: body
              type: string
              description: "The investigator site number."
          steps:
            - name: get-query-details
              type: call
              call: "oracle-clinical.get-data-query"
              with:
                query_id: "{{query_id}}"
            - name: create-jira-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CDM"
                summary: "Data Query {{query_id}} - Site {{site_number}} - {{get-query-details.field_name}}"
                issue_type: "Task"
                description: "Query raised on {{get-query-details.field_name}} for subject {{get-query-details.subject_id}} at site {{site_number}}. Details: {{get-query-details.query_text}}"
            - name: notify-data-managers
              type: call
              call: "slack.post-message"
              with:
                channel: "clinical-data-mgmt"
                text: "Data query escalated for study {{study_id}}, site {{site_number}}: {{get-query-details.query_text}}. Jira: {{create-jira-ticket.key}}"
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://astrazeneca-clinical.oracle.com/ocs/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_clinical_token"
      resources:
        - name: data-queries
          path: "/queries/{{query_id}}"
          inputParameters:
            - name: query_id
              in: path
          operations:
            - name: get-data-query
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.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: 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

Generates an Individual Case Safety Report (ICSR) by pulling adverse event data from the safety database, formatting it as an E2B R3 XML, uploading to the health authority gateway, and logging completion in ServiceNow.

naftiko: "0.5"
info:
  label: "Clinical Safety Report Generation"
  description: "Generates an Individual Case Safety Report (ICSR) by pulling adverse event data from the safety database, formatting it as an E2B R3 XML, uploading to the health authority gateway, and logging completion in ServiceNow."
  tags:
    - pharmacovigilance
    - drug-safety
    - regulatory
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: pv-reporting
      port: 8080
      tools:
        - name: generate-icsr
          description: "Generate and submit an ICSR (E2B R3) to the health authority gateway with audit logging."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The safety database case number."
            - name: target_authority
              in: body
              type: string
              description: "Target health authority (e.g., FDA, EMA)."
          steps:
            - name: get-case-data
              type: call
              call: "safety-db.get-case"
              with:
                case_number: "{{case_number}}"
            - name: generate-e2b
              type: call
              call: "safety-db.export-e2b"
              with:
                case_number: "{{case_number}}"
                format: "E2B_R3"
            - name: submit-to-gateway
              type: call
              call: "ectd-gateway.submit-icsr"
              with:
                e2b_xml_url: "{{generate-e2b.download_url}}"
                authority: "{{target_authority}}"
            - name: log-submission
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_icsr_submissions"
                case_number: "{{case_number}}"
                authority: "{{target_authority}}"
                gateway_ack: "{{submit-to-gateway.acknowledgment_id}}"
                status: "submitted"
  consumes:
    - type: http
      namespace: safety-db
      baseUri: "https://astrazeneca-safety.oracle.com/argus/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argus_token"
      resources:
        - name: cases
          path: "/cases/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET
        - name: exports
          path: "/cases/{{case_number}}/export"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: export-e2b
              method: POST
    - type: http
      namespace: ectd-gateway
      baseUri: "https://gateway.astrazeneca.com/regulatory/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ectd_gateway_token"
      resources:
        - name: icsr-submissions
          path: "/icsr"
          operations:
            - name: submit-icsr
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Orchestrates clinical site activation by verifying site readiness in Oracle Clinical, creating a SharePoint site binder, provisioning site access in Azure Active Directory, and notifying the clinical operations team.

naftiko: "0.5"
info:
  label: "Clinical Site Activation Orchestrator"
  description: "Orchestrates clinical site activation by verifying site readiness in Oracle Clinical, creating a SharePoint site binder, provisioning site access in Azure Active Directory, and notifying the clinical operations team."
  tags:
    - clinical-trials
    - site-management
    - oracle
    - sharepoint
    - azure-active-directory
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-site-activation
      port: 8080
      tools:
        - name: activate-site
          description: "Orchestrate site activation: verify readiness, create document binder, provision access, and notify operations."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The clinical site identifier."
            - name: study_id
              in: body
              type: string
              description: "The study protocol number."
            - name: principal_investigator
              in: body
              type: string
              description: "Name of the principal investigator."
          steps:
            - name: check-readiness
              type: call
              call: "oracle-clinical.get-site-status"
              with:
                site_id: "{{site_id}}"
                study_id: "{{study_id}}"
            - name: create-site-binder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "clinical_site_binders"
                folder_path: "{{study_id}}/Site_{{site_id}}_{{principal_investigator}}"
            - name: provision-site-access
              type: call
              call: "azure-ad.create-group"
              with:
                display_name: "CLIN-{{study_id}}-SITE-{{site_id}}"
                description: "Access group for site {{site_id}} on study {{study_id}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical_operations"
                text: "Site {{site_id}} activated for study {{study_id}} (PI: {{principal_investigator}}). Readiness: {{check-readiness.status}}. Binder: {{create-site-binder.url}}. AD Group: {{provision-site-access.group_id}}"
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://astrazeneca-clinical.oracle.com/ocs/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_clinical_token"
      resources:
        - name: sites
          path: "/studies/{{study_id}}/sites/{{site_id}}"
          inputParameters:
            - name: study_id
              in: path
            - name: site_id
              in: path
          operations:
            - name: get-site-status
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: create-group
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Ingests clinical trial data, validates against protocol, loads into analytics platform, and notifies researchers.

naftiko: "0.5"
info:
  label: "Clinical Trial Data Pipeline"
  description: "Ingests clinical trial data, validates against protocol, loads into analytics platform, and notifies researchers."
  tags:
    - clinical
    - snowflake
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: clinical
      port: 8080
      tools:
        - name: clinical_trial_data_pipeline
          description: "Orchestrate clinical trial data pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Clinical Trial Data Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

On new clinical trial protocol creation in Oracle Clinical, provisions a SharePoint document library for trial master file storage, creates a Jira epic for study milestones, and notifies the study team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Protocol Orchestrator"
  description: "On new clinical trial protocol creation in Oracle Clinical, provisions a SharePoint document library for trial master file storage, creates a Jira epic for study milestones, and notifies the study team via Microsoft Teams."
  tags:
    - clinical-trials
    - protocol-management
    - oracle
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-trial-setup
      port: 8080
      tools:
        - name: provision-trial
          description: "Given an Oracle Clinical protocol ID, orchestrate trial document provisioning, milestone tracking setup, and team notification."
          inputParameters:
            - name: protocol_id
              in: body
              type: string
              description: "The Oracle Clinical protocol identifier."
            - name: study_title
              in: body
              type: string
              description: "The human-readable study title."
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area (e.g., oncology, cardiovascular)."
          steps:
            - name: get-protocol
              type: call
              call: "oracle-clinical.get-protocol"
              with:
                protocol_id: "{{protocol_id}}"
            - name: create-tmf-library
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "clinical_tmf_site"
                folder_path: "TMF/{{study_title}}_{{protocol_id}}"
            - name: create-study-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CLIN"
                summary: "Study Milestones: {{study_title}}"
                issue_type: "Epic"
                description: "Tracking milestones for {{study_title}} in {{therapeutic_area}}."
            - name: notify-study-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{therapeutic_area}}_trials"
                text: "New trial provisioned: {{study_title}} ({{protocol_id}}). TMF at {{create-tmf-library.url}}. Track milestones at {{create-study-epic.key}}."
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://astrazeneca-clinical.oracle.com/ocs/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_clinical_token"
      resources:
        - name: protocols
          path: "/protocols/{{protocol_id}}"
          inputParameters:
            - name: protocol_id
              in: path
          operations:
            - name: get-protocol
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Sets up patient randomization for a clinical trial by configuring the randomization schema in Oracle Clinical, creating stratification rules, provisioning an emergency unblinding endpoint, and documenting the setup in Confluence.

naftiko: "0.5"
info:
  label: "Clinical Trial Randomization Setup"
  description: "Sets up patient randomization for a clinical trial by configuring the randomization schema in Oracle Clinical, creating stratification rules, provisioning an emergency unblinding endpoint, and documenting the setup in Confluence."
  tags:
    - clinical-trials
    - randomization
    - oracle
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: trial-randomization
      port: 8080
      tools:
        - name: setup-randomization
          description: "Configure clinical trial randomization schema with stratification rules and emergency unblinding, then document in Confluence."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The study protocol number."
            - name: randomization_ratio
              in: body
              type: string
              description: "Treatment arm ratio (e.g., 1:1, 2:1)."
            - name: stratification_factors
              in: body
              type: string
              description: "Comma-separated stratification factors."
            - name: block_size
              in: body
              type: string
              description: "Randomization block size."
          steps:
            - name: create-schema
              type: call
              call: "oracle-clinical.create-randomization"
              with:
                study_id: "{{study_id}}"
                ratio: "{{randomization_ratio}}"
                strat_factors: "{{stratification_factors}}"
                block_size: "{{block_size}}"
            - name: provision-unblinding
              type: call
              call: "oracle-clinical.create-unblinding-endpoint"
              with:
                study_id: "{{study_id}}"
                schema_id: "{{create-schema.schema_id}}"
            - name: document-setup
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CLIN"
                title: "Randomization Setup - {{study_id}}"
                body: "Study: {{study_id}}\nRatio: {{randomization_ratio}}\nStratification: {{stratification_factors}}\nBlock Size: {{block_size}}\nSchema ID: {{create-schema.schema_id}}\nUnblinding Endpoint: {{provision-unblinding.endpoint_url}}"
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://astrazeneca-clinical.oracle.com/ocs/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_clinical_token"
      resources:
        - name: randomization
          path: "/studies/{{study_id}}/randomization"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: create-randomization
              method: POST
        - name: unblinding
          path: "/studies/{{study_id}}/unblinding"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: create-unblinding-endpoint
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Queries IoT temperature sensor data for a drug shipment, checks for excursions against product thresholds, logs deviations in ServiceNow, and alerts the supply chain quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cold Chain Temperature Monitoring"
  description: "Queries IoT temperature sensor data for a drug shipment, checks for excursions against product thresholds, logs deviations in ServiceNow, and alerts the supply chain quality team via Microsoft Teams."
  tags:
    - supply-chain
    - cold-chain
    - quality
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-chain-monitoring
      port: 8080
      tools:
        - name: check-temperature-excursion
          description: "Check a drug shipment for cold chain temperature excursions and trigger deviation workflow if thresholds exceeded."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The shipment tracking identifier."
            - name: product_sku
              in: body
              type: string
              description: "The drug product SKU."
            - name: temp_threshold_high
              in: body
              type: string
              description: "Maximum acceptable temperature in Celsius."
            - name: temp_threshold_low
              in: body
              type: string
              description: "Minimum acceptable temperature in Celsius."
          steps:
            - name: get-sensor-data
              type: call
              call: "iot-platform.get-readings"
              with:
                device_group: "{{shipment_id}}"
                metric: "temperature"
            - name: log-excursion
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_cold_chain_excursions"
                shipment_id: "{{shipment_id}}"
                product_sku: "{{product_sku}}"
                max_temp_recorded: "{{get-sensor-data.max_value}}"
                min_temp_recorded: "{{get-sensor-data.min_value}}"
                threshold_high: "{{temp_threshold_high}}"
                threshold_low: "{{temp_threshold_low}}"
            - name: alert-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply_chain_quality"
                text: "Cold chain alert for shipment {{shipment_id}} ({{product_sku}}). Temp range: {{get-sensor-data.min_value}}C - {{get-sensor-data.max_value}}C. Thresholds: {{temp_threshold_low}}C - {{temp_threshold_high}}C. Incident: {{log-excursion.sys_id}}"
  consumes:
    - type: http
      namespace: iot-platform
      baseUri: "https://astrazeneca-iot.azure-devices.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_platform_token"
      resources:
        - name: readings
          path: "/device-groups/{{device_group}}/readings?metric={{metric}}"
          inputParameters:
            - name: device_group
              in: path
            - name: metric
              in: query
          operations:
            - name: get-readings
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Collects audit events, validates against policies, generates compliance reports, and notifies auditors.

naftiko: "0.5"
info:
  label: "Compliance Audit Trail Pipeline"
  description: "Collects audit events, validates against policies, generates compliance reports, and notifies auditors."
  tags:
    - compliance
    - elasticsearch
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: compliance_audit_trail_pipeline
          description: "Orchestrate compliance audit trail pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-elasticsearch
              type: call
              call: "elasticsearch.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-elasticsearch.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Compliance Audit Trail Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://astrazeneca-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a new GxP role assignment is made in Workday, looks up required training in the LMS, assigns courses to the employee, creates a compliance tracking record in ServiceNow, and notifies the employee via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Compliance Training Assignment Orchestrator"
  description: "When a new GxP role assignment is made in Workday, looks up required training in the LMS, assigns courses to the employee, creates a compliance tracking record in ServiceNow, and notifies the employee via Microsoft Teams."
  tags:
    - compliance
    - training
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance-training
      port: 8080
      tools:
        - name: assign-gxp-training
          description: "On GxP role change, assign required training, create compliance record, and notify the employee."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_role
              in: body
              type: string
              description: "The new GxP role being assigned."
            - name: effective_date
              in: body
              type: string
              description: "Role effective date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: get-required-training
              type: call
              call: "lms.get-role-curriculum"
              with:
                role: "{{new_role}}"
            - name: assign-courses
              type: call
              call: "lms.assign-curriculum"
              with:
                learner_email: "{{get-employee.work_email}}"
                curriculum_id: "{{get-required-training.curriculum_id}}"
                due_date: "{{effective_date}}"
            - name: create-compliance-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_gxp_training_compliance"
                employee_name: "{{get-employee.full_name}}"
                role: "{{new_role}}"
                curriculum: "{{get-required-training.curriculum_name}}"
                due_date: "{{effective_date}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Hi {{get-employee.first_name}}, you have been assigned GxP training for your new role ({{new_role}}). Please complete {{get-required-training.curriculum_name}} by {{effective_date}}. Tracking: {{create-compliance-record.sys_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      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: lms
      baseUri: "https://astrazeneca-lms.csod.com/services/api/x/v1"
      authentication:
        type: bearer
        token: "$secrets.lms_token"
      resources:
        - name: curricula
          path: "/curricula/by-role/{{role}}"
          inputParameters:
            - name: role
              in: path
          operations:
            - name: get-role-curriculum
              method: GET
        - name: assignments
          path: "/assignments"
          operations:
            - name: assign-curriculum
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Searches Confluence for a knowledge base article by title or keyword, returning the page title, space, last modified date, and content excerpt for R&D knowledge sharing.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Article Retrieval"
  description: "Searches Confluence for a knowledge base article by title or keyword, returning the page title, space, last modified date, and content excerpt for R&D knowledge sharing."
  tags:
    - knowledge-management
    - research
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: search-articles
          description: "Search AstraZeneca Confluence for knowledge base articles by keyword. Returns matching page titles, spaces, and excerpts."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search keyword or phrase."
          call: "confluence.search-content"
          with:
            cql: "type=page AND text~\"{{search_query}}\""
          outputParameters:
            - name: results
              type: string
              mapping: "$.results"
            - name: total_size
              type: string
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search?cql={{cql}}"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET

Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders.

naftiko: "0.5"
info:
  label: "Cost Center Budget Tracking Pipeline"
  description: "Tracks spending against budgets, forecasts overruns, creates alerts, and notifies finance leaders."
  tags:
    - finance
    - snowflake
    - powerbi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finance
      port: 8080
      tools:
        - name: cost_center_budget_tracking
          description: "Orchestrate cost center budget tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-powerbi
              type: call
              call: "powerbi.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Cost Center Budget Tracking Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM.

naftiko: "0.5"
info:
  label: "Customer 360 Data Sync Pipeline"
  description: "Aggregates customer data from multiple sources, deduplicates, enriches profiles, and syncs to CRM."
  tags:
    - data
    - snowflake
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: customer_360_data_sync_pipeline
          description: "Orchestrate customer 360 data sync pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Customer 360 Data Sync Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards.

naftiko: "0.5"
info:
  label: "Data Quality Monitoring Pipeline"
  description: "Runs data quality checks, scores datasets, creates remediation tickets, and publishes scorecards."
  tags:
    - data-quality
    - snowflake
    - jira
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: data_quality_monitoring_pipeline
          description: "Orchestrate data quality monitoring pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-grafana
              type: call
              call: "grafana.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Data Quality Monitoring Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://astrazeneca-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST

Queries the Databricks model registry for a machine learning model by name, returning latest version, stage, metrics, and deployment status for R&D AI/ML pipelines.

naftiko: "0.5"
info:
  label: "Databricks ML Model Registry Lookup"
  description: "Queries the Databricks model registry for a machine learning model by name, returning latest version, stage, metrics, and deployment status for R&D AI/ML pipelines."
  tags:
    - research
    - machine-learning
    - databricks
capability:
  exposes:
    - type: mcp
      namespace: ml-model-registry
      port: 8080
      tools:
        - name: get-model-info
          description: "Look up a registered ML model in Databricks, log the model status in Snowflake for tracking, and notify the data science team via Slack."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The registered model name in Databricks."
            - name: project_code
              in: body
              type: string
              description: "The R&D project code associated with this model."
          steps:
            - name: fetch-model
              type: call
              call: "databricks.get-model"
              with:
                model_name: "{{model_name}}"
            - name: log-model-status
              type: call
              call: "snowflake.insert-record"
              with:
                database: "ML_REGISTRY"
                schema: "MODEL_TRACKING"
                table: "MODEL_STATUS_LOG"
                data:
                  model_name: "{{model_name}}"
                  version: "{{fetch-model.latest_versions[0].version}}"
                  stage: "{{fetch-model.latest_versions[0].current_stage}}"
                  project_code: "{{project_code}}"
            - name: notify-data-science
              type: call
              call: "slack.post-message"
              with:
                channel: "data-science"
                text: "Model {{model_name}} (project {{project_code}}): v{{fetch-model.latest_versions[0].version}}, stage={{fetch-model.latest_versions[0].current_stage}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://astrazeneca.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: models
          path: "/mlflow/registered-models/get?name={{model_name}}"
          inputParameters:
            - name: model_name
              in: query
          operations:
            - name: get-model
              method: GET

Queries Datadog for the health status of a specific host or service, returning CPU, memory, uptime, and active alerts for IT operations monitoring.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Queries Datadog for the health status of a specific host or service, returning CPU, memory, uptime, and active alerts for IT operations monitoring."
  tags:
    - it-operations
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-host-health
          description: "Retrieve host health metrics from Datadog, create a ServiceNow incident if alerts are active, and notify the infrastructure team via Microsoft Teams."
          inputParameters:
            - name: host_name
              in: body
              type: string
              description: "The hostname to check in Datadog."
            - name: alert_threshold
              in: body
              type: string
              description: "Number of active alerts that trigger incident creation."
          steps:
            - name: fetch-health
              type: call
              call: "datadog.get-host-info"
              with:
                host_name: "{{host_name}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Host alert: {{host_name}} - {{fetch-health.active_alerts}} active alerts"
                category: "infrastructure"
                assigned_group: "IT_Infrastructure"
                description: "CPU: {{fetch-health.metrics.cpu}}%, Memory: {{fetch-health.metrics.memory}}%, Active alerts: {{fetch-health.active_alerts}}"
            - name: notify-infra
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "infrastructure_ops"
                text: "Host {{host_name}} health check: CPU={{fetch-health.metrics.cpu}}%, Mem={{fetch-health.metrics.memory}}%. Alerts: {{fetch-health.active_alerts}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: hosts
          path: "/hosts?filter={{host_name}}"
          inputParameters:
            - name: host_name
              in: query
          operations:
            - name: get-host-info
              method: GET

Tests DR procedures, validates backup integrity, generates readiness reports, and notifies leadership.

naftiko: "0.5"
info:
  label: "Disaster Recovery Readiness Pipeline"
  description: "Tests DR procedures, validates backup integrity, generates readiness reports, and notifies leadership."
  tags:
    - disaster-recovery
    - servicenow
    - confluence
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: disaster-recovery
      port: 8080
      tools:
        - name: disaster_recovery_readiness_pipeline
          description: "Orchestrate disaster recovery readiness pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-pagerduty
              type: call
              call: "pagerduty.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Disaster Recovery Readiness Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST

Checks for potential drug-drug interactions by querying an internal drug interaction database, cross-references with the safety database for related adverse events, and alerts the pharmacovigilance team via Microsoft Teams if high-risk interactions are found.

naftiko: "0.5"
info:
  label: "Drug Interaction Check Pipeline"
  description: "Checks for potential drug-drug interactions by querying an internal drug interaction database, cross-references with the safety database for related adverse events, and alerts the pharmacovigilance team via Microsoft Teams if high-risk interactions are found."
  tags:
    - pharmacovigilance
    - drug-safety
    - drug-interactions
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: drug-interaction-check
      port: 8080
      tools:
        - name: check-interactions
          description: "Check drug-drug interactions, cross-reference with safety data, and alert PV team on high-risk findings."
          inputParameters:
            - name: drug_a
              in: body
              type: string
              description: "First drug name or active ingredient."
            - name: drug_b
              in: body
              type: string
              description: "Second drug name or active ingredient."
          steps:
            - name: query-interactions
              type: call
              call: "ddi-db.check-interaction"
              with:
                drug1: "{{drug_a}}"
                drug2: "{{drug_b}}"
            - name: get-safety-cases
              type: call
              call: "safety-db.search-cases"
              with:
                drugs: "{{drug_a}},{{drug_b}}"
                interaction_flag: "true"
            - name: alert-pv-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "pharmacovigilance"
                text: "Drug interaction check: {{drug_a}} + {{drug_b}}. Severity: {{query-interactions.severity}}. Mechanism: {{query-interactions.mechanism}}. Related safety cases: {{get-safety-cases.case_count}}."
  consumes:
    - type: http
      namespace: ddi-db
      baseUri: "https://ddi.astrazeneca.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ddi_db_token"
      resources:
        - name: interactions
          path: "/interactions/check"
          operations:
            - name: check-interaction
              method: POST
    - type: http
      namespace: safety-db
      baseUri: "https://astrazeneca-safety.oracle.com/argus/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argus_token"
      resources:
        - name: cases-search
          path: "/cases/search"
          operations:
            - name: search-cases
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a label update is approved, retrieves the updated labeling document from Veeva Vault, submits the supplement to the regulatory gateway, updates the product master in SAP, and notifies the regulatory and commercial teams via Slack.

naftiko: "0.5"
info:
  label: "Drug Label Update Orchestrator"
  description: "When a label update is approved, retrieves the updated labeling document from Veeva Vault, submits the supplement to the regulatory gateway, updates the product master in SAP, and notifies the regulatory and commercial teams via Slack."
  tags:
    - regulatory
    - labeling
    - veeva
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: label-updates
      port: 8080
      tools:
        - name: process-label-update
          description: "Orchestrate a drug label update: retrieve approved label, submit regulatory supplement, update SAP product master, and notify teams."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Veeva Vault document ID for the approved label."
            - name: product_code
              in: body
              type: string
              description: "The SAP material number for the drug product."
            - name: market
              in: body
              type: string
              description: "The target market (e.g., US, EU, JP)."
          steps:
            - name: get-label-doc
              type: call
              call: "veeva.get-document"
              with:
                document_id: "{{document_id}}"
            - name: submit-supplement
              type: call
              call: "ectd-gateway.submit-package"
              with:
                package_url: "{{get-label-doc.download_url}}"
                authority: "{{market}}"
                submission_type: "labeling-supplement"
            - name: update-product-master
              type: call
              call: "sap.update-material"
              with:
                material_number: "{{product_code}}"
                label_version: "{{get-label-doc.version}}"
                label_effective_date: "{{get-label-doc.effective_date}}"
            - name: notify-teams
              type: call
              call: "slack.post-message"
              with:
                channel: "regulatory-commercial"
                text: "Label update processed for {{product_code}} in {{market}}. Document: {{document_id}} v{{get-label-doc.version}}. Gateway tracking: {{submit-supplement.tracking_id}}. SAP updated."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://astrazeneca.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_session_id"
      resources:
        - name: documents
          path: "/objects/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: ectd-gateway
      baseUri: "https://gateway.astrazeneca.com/regulatory/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ectd_gateway_token"
      resources:
        - name: submissions
          path: "/submissions"
          operations:
            - name: submit-package
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: update-material
              method: PATCH
    - 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

On batch testing completion, retrieves QC results from SAP QM, generates a certificate of analysis in Veeva Vault, updates inventory status in SAP, and notifies the supply chain team via Slack.

naftiko: "0.5"
info:
  label: "Drug Product Batch Release Orchestrator"
  description: "On batch testing completion, retrieves QC results from SAP QM, generates a certificate of analysis in Veeva Vault, updates inventory status in SAP, and notifies the supply chain team via Slack."
  tags:
    - manufacturing
    - quality
    - batch-release
    - sap
    - veeva
    - slack
capability:
  exposes:
    - type: mcp
      namespace: batch-release
      port: 8080
      tools:
        - name: release-batch
          description: "Orchestrate batch release: pull QC results, generate CoA, update inventory, and notify supply chain."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The manufacturing batch number."
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the drug product."
            - name: plant_code
              in: body
              type: string
              description: "The SAP manufacturing plant code."
          steps:
            - name: get-qc-results
              type: call
              call: "sap-qm.get-inspection-results"
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
                plant: "{{plant_code}}"
            - name: create-coa
              type: call
              call: "veeva.create-document"
              with:
                name: "CoA_{{batch_number}}_{{material_number}}"
                type: "Certificate of Analysis"
                lifecycle: "General Lifecycle"
                properties:
                  batch_number: "{{batch_number}}"
                  test_results: "{{get-qc-results.summary}}"
                  release_date: "{{get-qc-results.completion_date}}"
            - name: update-inventory
              type: call
              call: "sap.update-batch-status"
              with:
                batch: "{{batch_number}}"
                material: "{{material_number}}"
                plant: "{{plant_code}}"
                status: "released"
            - name: notify-supply-chain
              type: call
              call: "slack.post-message"
              with:
                channel: "supply-chain-ops"
                text: "Batch {{batch_number}} ({{material_number}}) released at plant {{plant_code}}. CoA: {{create-coa.document_id}}. QC status: {{get-qc-results.overall_status}}."
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-results
          path: "/InspectionResultsSet(Batch='{{batch}}',Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: batch
              in: path
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-inspection-results
              method: GET
    - type: http
      namespace: veeva
      baseUri: "https://astrazeneca.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_session_id"
      resources:
        - name: documents
          path: "/objects/documents"
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/Batch(Batch='{{batch}}',Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: batch
              in: path
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: update-batch-status
              method: PATCH
    - 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

Analyzes adverse event reports, detects safety signals, creates investigation cases, and alerts pharmacovigilance.

naftiko: "0.5"
info:
  label: "Drug Safety Signal Detection Pipeline"
  description: "Analyzes adverse event reports, detects safety signals, creates investigation cases, and alerts pharmacovigilance."
  tags:
    - safety
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: drug_safety_signal_detection_pipeline
          description: "Orchestrate drug safety signal detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Drug Safety Signal Detection Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Queries SAP S/4HANA for a drug product shipment by delivery number, returning origin warehouse, destination site, shipment status, and estimated arrival.

naftiko: "0.5"
info:
  label: "Drug Supply Chain Shipment Tracker"
  description: "Queries SAP S/4HANA for a drug product shipment by delivery number, returning origin warehouse, destination site, shipment status, and estimated arrival."
  tags:
    - supply-chain
    - logistics
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-tracking
      port: 8080
      tools:
        - name: get-shipment-status
          description: "Look up a drug product shipment by SAP delivery number, log the tracking event in Snowflake, and notify the logistics team via Microsoft Teams."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP outbound delivery number."
            - name: requester_email
              in: body
              type: string
              description: "Email of the person requesting the shipment status."
          steps:
            - name: fetch-delivery
              type: call
              call: "sap.get-delivery"
              with:
                delivery_number: "{{delivery_number}}"
            - name: log-tracking
              type: call
              call: "snowflake.insert-record"
              with:
                database: "SUPPLY_CHAIN"
                schema: "LOGISTICS"
                table: "SHIPMENT_TRACKING"
                data:
                  delivery_number: "{{delivery_number}}"
                  status: "{{fetch-delivery.OverallGoodsMovementStatus}}"
                  destination: "{{fetch-delivery.ShipToParty.Name}}"
            - name: notify-logistics
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{requester_email}}"
                text: "Shipment {{delivery_number}} status: {{fetch-delivery.OverallGoodsMovementStatus}}. Destination: {{fetch-delivery.ShipToParty.Name}}. ETA: {{fetch-delivery.PlannedGoodsIssueDate}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_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: "200"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Processes a Data Subject Access Request by searching for personal data in Workday, Salesforce, and ServiceNow, compiling results into a SharePoint package, and tracking the request in ServiceNow.

naftiko: "0.5"
info:
  label: "DSAR Privacy Request Orchestrator"
  description: "Processes a Data Subject Access Request by searching for personal data in Workday, Salesforce, and ServiceNow, compiling results into a SharePoint package, and tracking the request in ServiceNow."
  tags:
    - privacy
    - compliance
    - gdpr
    - workday
    - salesforce
    - servicenow
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: privacy-dsar
      port: 8080
      tools:
        - name: process-dsar
          description: "Process a DSAR: search personal data across systems, compile results, and track completion."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The DSAR request identifier."
            - name: data_subject_email
              in: body
              type: string
              description: "The email address of the data subject."
            - name: data_subject_name
              in: body
              type: string
              description: "The full name of the data subject."
          steps:
            - name: search-workday
              type: call
              call: "workday.search-workers"
              with:
                email: "{{data_subject_email}}"
            - name: search-salesforce
              type: call
              call: "salesforce.search-contacts"
              with:
                email: "{{data_subject_email}}"
            - name: search-servicenow
              type: call
              call: "servicenow.search-records"
              with:
                table: "sys_user"
                email: "{{data_subject_email}}"
            - name: compile-package
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "privacy_dsar_site"
                folder_path: "DSAR/{{request_id}}_{{data_subject_name}}"
            - name: update-tracking
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_dsar_requests"
                request_id: "{{request_id}}"
                subject_name: "{{data_subject_name}}"
                systems_searched: "Workday, Salesforce, ServiceNow"
                package_url: "{{compile-package.url}}"
                status: "data_compiled"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers-search
          path: "/workers?email={{email}}"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-workers
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts-search
          path: "/parameterizedSearch/?q={{email}}&sobject=Contact"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-contacts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-search
          path: "/table/{{table}}?sysparm_query=email={{email}}"
          inputParameters:
            - name: table
              in: path
            - name: email
              in: query
          operations:
            - name: search-records
              method: GET
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST

Searches the Elasticsearch cluster for clinical documents by keyword, returning document titles, types, study IDs, and relevance scores for clinical information retrieval.

naftiko: "0.5"
info:
  label: "Elasticsearch Clinical Document Search"
  description: "Searches the Elasticsearch cluster for clinical documents by keyword, returning document titles, types, study IDs, and relevance scores for clinical information retrieval."
  tags:
    - search
    - clinical-trials
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: clinical-search
      port: 8080
      tools:
        - name: search-clinical-docs
          description: "Search clinical documents in Elasticsearch, log the search for compliance audit in ServiceNow, and share results via Microsoft Teams."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search query string."
            - name: index
              in: body
              type: string
              description: "The Elasticsearch index name (e.g., clinical-protocols, csr-documents)."
            - name: requester_email
              in: body
              type: string
              description: "Email of the person performing the search."
          steps:
            - name: execute-search
              type: call
              call: "elasticsearch.search"
              with:
                index: "{{index}}"
                query: "{{query}}"
            - name: log-search-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_document_search_audit"
                requester: "{{requester_email}}"
                index: "{{index}}"
                query: "{{query}}"
                results_count: "{{execute-search.hits.total.value}}"
            - name: share-results
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{requester_email}}"
                text: "Clinical document search complete: {{execute-search.hits.total.value}} results found for '{{query}}' in {{index}}. Audit ref: {{log-search-audit.sys_id}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://elasticsearch.astrazeneca.com"
      authentication:
        type: basic
        username: "$secrets.es_user"
        password: "$secrets.es_password"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: POST

Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "Employee Onboarding Automation Pipeline"
  description: "Provisions new employee accounts, assigns training, creates IT tickets, and notifies managers."
  tags:
    - hr
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: employee_onboarding_automation
          description: "Orchestrate employee onboarding automation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Employee Onboarding Automation Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for employee documents, assigns compliance training, and sends a Microsoft Teams welcome message.

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

Triggers a genomics data processing pipeline on AWS: uploads raw sequencing data to S3, launches a SageMaker processing job for variant calling, stores results in Snowflake, and notifies the bioinformatics team via Slack.

naftiko: "0.5"
info:
  label: "Genomics Data Processing Pipeline"
  description: "Triggers a genomics data processing pipeline on AWS: uploads raw sequencing data to S3, launches a SageMaker processing job for variant calling, stores results in Snowflake, and notifies the bioinformatics team via Slack."
  tags:
    - research
    - genomics
    - amazon-s3
    - amazon-sagemaker
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: genomics-pipeline
      port: 8080
      tools:
        - name: process-sequencing-data
          description: "Orchestrate genomics data processing: upload to S3, run variant calling on SageMaker, store results, and notify team."
          inputParameters:
            - name: sample_id
              in: body
              type: string
              description: "The sequencing sample identifier."
            - name: study_id
              in: body
              type: string
              description: "The genomics study identifier."
            - name: fastq_path
              in: body
              type: string
              description: "Local path to the FASTQ file for upload."
          steps:
            - name: upload-to-s3
              type: call
              call: "s3.put-object"
              with:
                bucket: "az-genomics-raw"
                key: "{{study_id}}/{{sample_id}}/raw.fastq.gz"
                source: "{{fastq_path}}"
            - name: launch-processing
              type: call
              call: "sagemaker.create-processing-job"
              with:
                job_name: "variant-calling-{{sample_id}}"
                input_s3_uri: "s3://az-genomics-raw/{{study_id}}/{{sample_id}}/raw.fastq.gz"
                output_s3_uri: "s3://az-genomics-results/{{study_id}}/{{sample_id}}/"
                processing_image: "genomics-variant-caller:latest"
            - name: store-metadata
              type: call
              call: "snowflake.insert-record"
              with:
                database: "GENOMICS"
                schema: "PIPELINE_RUNS"
                table: "PROCESSING_JOBS"
                data:
                  sample_id: "{{sample_id}}"
                  study_id: "{{study_id}}"
                  job_name: "{{launch-processing.job_name}}"
                  status: "{{launch-processing.status}}"
            - name: notify-bioinfo
              type: call
              call: "slack.post-message"
              with:
                channel: "bioinformatics"
                text: "Genomics pipeline launched: sample {{sample_id}} (study {{study_id}}). SageMaker job: {{launch-processing.job_name}}. Status: {{launch-processing.status}}"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_session_token"
      resources:
        - name: objects
          path: "/{{bucket}}/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: sagemaker
      baseUri: "https://api.sagemaker.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_session_token"
      resources:
        - name: processing-jobs
          path: "/processing-jobs"
          operations:
            - name: create-processing-job
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              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

Retrieves metadata for a GitHub repository by owner and repo name, returning description, default branch, open issues count, and last push date for R&D engineering teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Status"
  description: "Retrieves metadata for a GitHub repository by owner and repo name, returning description, default branch, open issues count, and last push date for R&D engineering teams."
  tags:
    - engineering
    - development
    - github
capability:
  exposes:
    - type: mcp
      namespace: dev-repos
      port: 8080
      tools:
        - name: get-repo-info
          description: "Look up a GitHub repository. Returns description, default branch, open issues, and last push timestamp."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "The GitHub organization or user."
            - name: repo
              in: body
              type: string
              description: "The repository name."
          call: "github.get-repo"
          with:
            owner: "{{owner}}"
            repo: "{{repo}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.description"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues
              type: string
              mapping: "$.open_issues_count"
            - name: last_push
              type: string
              mapping: "$.pushed_at"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{owner}}/{{repo}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

Retrieves campaign performance metrics from Google Analytics for a specified property and date range, returning sessions, conversions, and bounce rate for marketing analytics.

naftiko: "0.5"
info:
  label: "Google Analytics Campaign Performance"
  description: "Retrieves campaign performance metrics from Google Analytics for a specified property and date range, returning sessions, conversions, and bounce rate for marketing analytics."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Query Google Analytics for campaign performance metrics. Returns sessions, conversions, bounce rate, and average session duration."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
            - name: campaign_name
              in: body
              type: string
              description: "The campaign name to filter by."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          call: "ga.run-report"
          with:
            property_id: "{{property_id}}"
            dimensions: "sessionCampaignName"
            metrics: "sessions,conversions,bounceRate"
            date_range_start: "{{start_date}}"
            date_range_end: "{{end_date}}"
            filter: "{{campaign_name}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: conversions
              type: string
              mapping: "$.rows[0].metricValues[1].value"
            - name: bounce_rate
              type: string
              mapping: "$.rows[0].metricValues[2].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Queries Grafana for active alerts on a specific dashboard, returning alert names, states, and evaluation timestamps for infrastructure and application monitoring.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Alert Summary"
  description: "Queries Grafana for active alerts on a specific dashboard, returning alert names, states, and evaluation timestamps for infrastructure and application monitoring."
  tags:
    - it-operations
    - monitoring
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: dashboard-alerts
      port: 8080
      tools:
        - name: get-dashboard-alerts
          description: "Retrieve active alerts for a Grafana dashboard, create a ServiceNow incident for critical alerts, and notify the SRE team via Microsoft Teams."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
            - name: dashboard_name
              in: body
              type: string
              description: "The human-readable dashboard name for notifications."
          steps:
            - name: fetch-alerts
              type: call
              call: "grafana.get-alerts"
              with:
                dashboard_uid: "{{dashboard_uid}}"
            - name: create-alert-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Grafana alerts: {{dashboard_name}} - {{fetch-alerts.totalCount}} active"
                category: "monitoring"
                assigned_group: "SRE_Team"
                description: "Dashboard {{dashboard_name}} ({{dashboard_uid}}) has {{fetch-alerts.totalCount}} active alerts."
            - name: notify-sre
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sre_alerts"
                text: "Grafana dashboard {{dashboard_name}}: {{fetch-alerts.totalCount}} active alerts. Incident: {{create-alert-incident.number}}."
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.astrazeneca.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: alerts
          path: "/alerts?dashboardId={{dashboard_uid}}"
          inputParameters:
            - name: dashboard_uid
              in: query
          operations:
            - name: get-alerts
              method: GET

On detection of a GxP manufacturing deviation, creates a quality event in SAP QM, opens a CAPA investigation in ServiceNow, uploads supporting evidence to SharePoint, and alerts the quality assurance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GxP Deviation Workflow"
  description: "On detection of a GxP manufacturing deviation, creates a quality event in SAP QM, opens a CAPA investigation in ServiceNow, uploads supporting evidence to SharePoint, and alerts the quality assurance team via Microsoft Teams."
  tags:
    - quality
    - gxp
    - manufacturing
    - sap
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-deviations
      port: 8080
      tools:
        - name: raise-deviation
          description: "Orchestrate a GxP deviation workflow: create quality event, open CAPA, store evidence, and notify QA team."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The manufacturing batch number."
            - name: deviation_description
              in: body
              type: string
              description: "Description of the observed deviation."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant code where deviation occurred."
            - name: severity
              in: body
              type: string
              description: "Deviation severity (critical, major, minor)."
          steps:
            - name: create-quality-notification
              type: call
              call: "sap-qm.create-notification"
              with:
                notification_type: "Q2"
                plant: "{{plant_code}}"
                material_batch: "{{batch_number}}"
                description: "{{deviation_description}}"
            - name: open-capa
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_capa_investigations"
                short_description: "CAPA for batch {{batch_number}} - {{severity}} deviation"
                description: "{{deviation_description}}"
                sap_qm_ref: "{{create-quality-notification.notification_number}}"
            - name: store-evidence
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "quality_management_site"
                folder_path: "Deviations/{{batch_number}}_{{create-quality-notification.notification_number}}"
            - name: alert-qa-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality_assurance"
                text: "GxP Deviation ({{severity}}): Batch {{batch_number}} at plant {{plant_code}}. SAP QM: {{create-quality-notification.notification_number}}. CAPA: {{open-capa.sys_id}}. Evidence folder: {{store-evidence.url}}"
  consumes:
    - type: http
      namespace: sap-qm
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: notifications
          path: "/QualityNotification"
          operations:
            - name: create-notification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops.

naftiko: "0.5"
info:
  label: "Infrastructure Drift Detection Pipeline"
  description: "Compares deployed state against desired config, identifies drift, creates remediation tickets, and alerts ops."
  tags:
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: infrastructure_drift_detection
          description: "Orchestrate infrastructure drift detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-github
              type: call
              call: "github.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-github.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Infrastructure Drift Detection Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Processes clinical investigator payments by pulling visit data from Oracle Clinical, calculating payment amounts, creating payment requests in SAP, and notifying the finance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Investigator Payment Processing"
  description: "Processes clinical investigator payments by pulling visit data from Oracle Clinical, calculating payment amounts, creating payment requests in SAP, and notifying the finance team via Microsoft Teams."
  tags:
    - clinical-trials
    - finance
    - investigator-payments
    - oracle
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: investigator-payments
      port: 8080
      tools:
        - name: process-investigator-payment
          description: "Calculate and process investigator site payment based on completed visits and milestones."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The study protocol number."
            - name: site_id
              in: body
              type: string
              description: "The clinical site identifier."
            - name: payment_period
              in: body
              type: string
              description: "The payment period (e.g., 2026-Q1)."
          steps:
            - name: get-visit-data
              type: call
              call: "oracle-clinical.get-site-visits"
              with:
                study_id: "{{study_id}}"
                site_id: "{{site_id}}"
                period: "{{payment_period}}"
            - name: create-payment-request
              type: call
              call: "sap.create-invoice"
              with:
                vendor_id: "{{get-visit-data.site_vendor_id}}"
                amount: "{{get-visit-data.total_payable}}"
                currency: "{{get-visit-data.currency}}"
                reference: "CLIN-{{study_id}}-{{site_id}}-{{payment_period}}"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical_finance"
                text: "Investigator payment processed: Study {{study_id}}, Site {{site_id}}, Period {{payment_period}}. Amount: {{get-visit-data.total_payable}} {{get-visit-data.currency}}. SAP Invoice: {{create-payment-request.invoice_number}}."
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://astrazeneca-clinical.oracle.com/ocs/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_clinical_token"
      resources:
        - name: site-visits
          path: "/studies/{{study_id}}/sites/{{site_id}}/visits?period={{period}}"
          inputParameters:
            - name: study_id
              in: path
            - name: site_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-site-visits
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://astrazeneca-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: create-invoice
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks asset lifecycle stages, schedules replacements, manages disposal, and updates CMDB.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Pipeline"
  description: "Tracks asset lifecycle stages, schedules replacements, manages disposal, and updates CMDB."
  tags:
    - operations
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: it_asset_lifecycle_pipeline
          description: "Orchestrate it asset lifecycle pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "IT Asset Lifecycle Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves sprint details from a Jira board, returning sprint name, committed story points, completed story points, and velocity for engineering project management.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Retrieves sprint details from a Jira board, returning sprint name, committed story points, completed story points, and velocity for engineering project management."
  tags:
    - engineering
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: eng-project-mgmt
      port: 8080
      tools:
        - name: get-sprint-velocity
          description: "Look up sprint velocity for a Jira board. Returns sprint name, committed points, completed points, and velocity percentage."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID."
            - name: sprint_id
              in: body
              type: string
              description: "The sprint ID."
          call: "jira.get-sprint"
          with:
            board_id: "{{board_id}}"
            sprint_id: "{{sprint_id}}"
          outputParameters:
            - name: sprint_name
              type: string
              mapping: "$.sprint.name"
            - name: start_date
              type: string
              mapping: "$.sprint.startDate"
            - name: end_date
              type: string
              mapping: "$.sprint.endDate"
            - name: state
              type: string
              mapping: "$.sprint.state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint/{{sprint_id}}"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET

Identifies stale articles, assigns review tasks, tracks updates, and publishes freshness reports.

naftiko: "0.5"
info:
  label: "Knowledge Base Freshness Pipeline"
  description: "Identifies stale articles, assigns review tasks, tracks updates, and publishes freshness reports."
  tags:
    - knowledge
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: knowledge_base_freshness_pipeline
          description: "Orchestrate knowledge base freshness pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-confluence
              type: call
              call: "confluence.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-jira
              type: call
              call: "jira.process-resource"
              with:
                data: "{{get-confluence.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Knowledge Base Freshness Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Schedules equipment calibration, tracks completion, validates results, and creates maintenance records.

naftiko: "0.5"
info:
  label: "Lab Equipment Calibration Pipeline"
  description: "Schedules equipment calibration, tracks completion, validates results, and creates maintenance records."
  tags:
    - quality
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: quality
      port: 8080
      tools:
        - name: lab_equipment_calibration_pipeline
          description: "Orchestrate lab equipment calibration pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Lab Equipment Calibration Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a manufacturing batch record from the MES system, including batch status, process parameters, in-process control results, and yield for pharmaceutical production monitoring.

naftiko: "0.5"
info:
  label: "Manufacturing Execution Batch Record"
  description: "Retrieves a manufacturing batch record from the MES system, including batch status, process parameters, in-process control results, and yield for pharmaceutical production monitoring."
  tags:
    - manufacturing
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-execution
      port: 8080
      tools:
        - name: get-batch-record
          description: "Look up a manufacturing batch execution record from SAP MES, store yield data in Snowflake for trending, and alert the production team via Microsoft Teams if yield is below threshold."
          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: yield_threshold
              in: body
              type: string
              description: "Minimum acceptable yield percentage."
          steps:
            - name: fetch-batch
              type: call
              call: "sap-mes.get-batch"
              with:
                batch: "{{batch_number}}"
                plant: "{{plant_code}}"
            - name: store-yield-data
              type: call
              call: "snowflake.insert-record"
              with:
                database: "MANUFACTURING"
                schema: "PRODUCTION"
                table: "BATCH_YIELD_TRENDING"
                data:
                  batch_number: "{{batch_number}}"
                  plant_code: "{{plant_code}}"
                  yield_pct: "{{fetch-batch.yield_percentage}}"
                  ipc_status: "{{fetch-batch.ipc_overall_status}}"
                  status: "{{fetch-batch.status}}"
            - name: alert-production
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "production_operations"
                text: "Batch {{batch_number}} at plant {{plant_code}}: Status={{fetch-batch.status}}, Yield={{fetch-batch.yield_percentage}}% (threshold: {{yield_threshold}}%), IPC={{fetch-batch.ipc_overall_status}}."
  consumes:
    - type: http
      namespace: sap-mes
      baseUri: "https://astrazeneca-mes.sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_mes_token"
      resources:
        - name: batches
          path: "/batches/{{batch}}?plant={{plant}}"
          inputParameters:
            - name: batch
              in: path
            - name: plant
              in: query
          operations:
            - name: get-batch
              method: GET

When a medical information request arrives via Salesforce Service Cloud, retrieves the HCP profile, searches Veeva Vault for approved response documents, creates a case in ServiceNow, and sends the response via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Medical Information Request Orchestrator"
  description: "When a medical information request arrives via Salesforce Service Cloud, retrieves the HCP profile, searches Veeva Vault for approved response documents, creates a case in ServiceNow, and sends the response via Microsoft Outlook."
  tags:
    - medical-affairs
    - medical-information
    - salesforce
    - veeva
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: medical-information
      port: 8080
      tools:
        - name: process-med-info-request
          description: "Process a medical information request end-to-end: retrieve HCP context, find approved response, log case, and send reply."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID."
            - name: product_name
              in: body
              type: string
              description: "The drug product referenced in the inquiry."
            - name: topic
              in: body
              type: string
              description: "The medical topic of the inquiry."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: search-vault-docs
              type: call
              call: "veeva.search-documents"
              with:
                query: "product:{{product_name}} AND topic:{{topic}} AND status:Approved"
            - name: log-mi-case
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_medical_information"
                short_description: "MI Request: {{product_name}} - {{topic}}"
                hcp_name: "{{get-case.contact_name}}"
                document_id: "{{search-vault-docs.documents[0].id}}"
            - name: send-response
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{get-case.contact_email}}"
                subject: "AstraZeneca Medical Information: {{product_name}} - {{topic}}"
                body: "Dear {{get-case.contact_name}}, please find the attached response document regarding {{product_name}}. Reference: {{log-mi-case.sys_id}}"
                attachment_url: "{{search-vault-docs.documents[0].download_url}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: veeva
      baseUri: "https://astrazeneca.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_session_id"
      resources:
        - name: search
          path: "/objects/documents/search"
          operations:
            - name: search-documents
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Checks the health and analytics of a MuleSoft API deployment, returning request volume, error rate, average latency, and policy violations for API governance.

naftiko: "0.5"
info:
  label: "MuleSoft API Gateway Health"
  description: "Checks the health and analytics of a MuleSoft API deployment, returning request volume, error rate, average latency, and policy violations for API governance."
  tags:
    - integration
    - api-management
    - mulesoft
capability:
  exposes:
    - type: mcp
      namespace: api-governance
      port: 8080
      tools:
        - name: get-api-health
          description: "Retrieve MuleSoft API deployment health metrics. Returns request count, error rate, latency, and policy violation count."
          inputParameters:
            - name: api_id
              in: body
              type: string
              description: "The MuleSoft API ID."
            - name: environment
              in: body
              type: string
              description: "The deployment environment (e.g., production, sandbox)."
          call: "mulesoft.get-api-analytics"
          with:
            api_id: "{{api_id}}"
            environment: "{{environment}}"
          outputParameters:
            - name: request_count
              type: string
              mapping: "$.analytics.requestCount"
            - name: error_rate
              type: string
              mapping: "$.analytics.errorRate"
            - name: avg_latency_ms
              type: string
              mapping: "$.analytics.avgLatency"
            - name: policy_violations
              type: string
              mapping: "$.analytics.policyViolations"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/analytics/1.0"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: api-analytics
          path: "/{{environment}}/apis/{{api_id}}/analytics"
          inputParameters:
            - name: api_id
              in: path
            - name: environment
              in: path
          operations:
            - name: get-api-analytics
              method: GET

Launches a clinical trial patient recruitment campaign by creating a Salesforce Marketing Cloud email journey, publishing trial information to the AstraZeneca website via the CMS, and tracking campaign performance in Google Analytics.

naftiko: "0.5"
info:
  label: "Patient Recruitment Campaign Orchestrator"
  description: "Launches a clinical trial patient recruitment campaign by creating a Salesforce Marketing Cloud email journey, publishing trial information to the AstraZeneca website via the CMS, and tracking campaign performance in Google Analytics."
  tags:
    - clinical-trials
    - patient-recruitment
    - salesforce-marketing-cloud
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: patient-recruitment
      port: 8080
      tools:
        - name: launch-recruitment-campaign
          description: "Orchestrate patient recruitment: create email journey, publish trial listing, and configure analytics tracking."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical trial protocol number."
            - name: study_title
              in: body
              type: string
              description: "The public study title."
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area."
            - name: target_audience_list
              in: body
              type: string
              description: "Salesforce Marketing Cloud data extension name for the target audience."
          steps:
            - name: create-email-journey
              type: call
              call: "sfmc.create-journey"
              with:
                name: "Recruitment - {{study_title}}"
                data_extension: "{{target_audience_list}}"
                template: "clinical_trial_recruitment"
                study_id: "{{study_id}}"
            - name: publish-trial-page
              type: call
              call: "cms.create-page"
              with:
                title: "{{study_title}} - Clinical Trial Recruitment"
                category: "clinical-trials/{{therapeutic_area}}"
                study_id: "{{study_id}}"
            - name: configure-analytics
              type: call
              call: "google-analytics.create-custom-dimension"
              with:
                property_id: "$secrets.ga_property_id"
                dimension_name: "study_{{study_id}}_recruitment"
  consumes:
    - type: http
      namespace: sfmc
      baseUri: "https://astrazeneca.rest.marketingcloudapis.com/interaction/v1"
      authentication:
        type: bearer
        token: "$secrets.sfmc_token"
      resources:
        - name: journeys
          path: "/interactions"
          operations:
            - name: create-journey
              method: POST
    - type: http
      namespace: cms
      baseUri: "https://cms.astrazeneca.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.cms_token"
      resources:
        - name: pages
          path: "/pages"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsadmin.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: custom-dimensions
          path: "/properties/{{property_id}}/customDimensions"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: create-custom-dimension
              method: POST

Analyzes recruitment metrics, optimizes site selection, adjusts outreach, and reports to study teams.

naftiko: "0.5"
info:
  label: "Patient Recruitment Optimization Pipeline"
  description: "Analyzes recruitment metrics, optimizes site selection, adjusts outreach, and reports to study teams."
  tags:
    - clinical
    - snowflake
    - salesforce
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: clinical
      port: 8080
      tools:
        - name: patient_recruitment_optimization_pipelin
          description: "Orchestrate patient recruitment optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-snowflake
              type: call
              call: "snowflake.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-salesforce
              type: call
              call: "salesforce.process-resource"
              with:
                data: "{{get-snowflake.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Patient Recruitment Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Initiates review cycles, collects feedback, aggregates scores, and distributes to managers.

naftiko: "0.5"
info:
  label: "Performance Review Cycle Pipeline"
  description: "Initiates review cycles, collects feedback, aggregates scores, and distributes to managers."
  tags:
    - hr
    - workday
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: performance_review_cycle_pipeline
          description: "Orchestrate performance review cycle pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Performance Review Cycle Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Runs a disproportionality analysis query in the safety database, stores results in Snowflake for trending, creates a Jira ticket for signal evaluation, and notifies the safety science team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pharmacovigilance Signal Detection Pipeline"
  description: "Runs a disproportionality analysis query in the safety database, stores results in Snowflake for trending, creates a Jira ticket for signal evaluation, and notifies the safety science team via Microsoft Teams."
  tags:
    - pharmacovigilance
    - signal-detection
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pv-signal-detection
      port: 8080
      tools:
        - name: run-signal-analysis
          description: "Execute a disproportionality analysis for a drug-event combination and orchestrate downstream signal evaluation workflow."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The drug product name."
            - name: meddra_pt
              in: body
              type: string
              description: "The MedDRA preferred term for the adverse event."
            - name: date_range_start
              in: body
              type: string
              description: "Analysis start date in YYYY-MM-DD format."
            - name: date_range_end
              in: body
              type: string
              description: "Analysis end date in YYYY-MM-DD format."
          steps:
            - name: run-dispro-query
              type: call
              call: "safety-db.run-analysis"
              with:
                product: "{{product_name}}"
                event_pt: "{{meddra_pt}}"
                start_date: "{{date_range_start}}"
                end_date: "{{date_range_end}}"
            - name: store-results
              type: call
              call: "snowflake.insert-record"
              with:
                database: "PHARMACOVIGILANCE"
                schema: "SIGNAL_DETECTION"
                table: "DISPRO_RESULTS"
                data:
                  product: "{{product_name}}"
                  event: "{{meddra_pt}}"
                  pro_score: "{{run-dispro-query.pro_score}}"
                  case_count: "{{run-dispro-query.case_count}}"
            - name: create-evaluation-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PVSIG"
                summary: "Signal Evaluation: {{product_name}} / {{meddra_pt}} (PRR={{run-dispro-query.pro_score}})"
                issue_type: "Task"
                priority: "High"
            - name: notify-safety-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety_science"
                text: "New signal detected: {{product_name}} / {{meddra_pt}}. PRR={{run-dispro-query.pro_score}}, cases={{run-dispro-query.case_count}}. Evaluate: {{create-evaluation-ticket.key}}"
  consumes:
    - type: http
      namespace: safety-db
      baseUri: "https://astrazeneca-safety.oracle.com/argus/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argus_token"
      resources:
        - name: analyses
          path: "/analyses/disproportionality"
          operations:
            - name: run-analysis
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Power BI dataset refresh for a specified workspace and dataset, used by analytics teams to ensure dashboards reflect latest clinical or commercial data.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh Trigger"
  description: "Triggers a Power BI dataset refresh for a specified workspace and dataset, used by analytics teams to ensure dashboards reflect latest clinical or commercial data."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: refresh-dashboard
          description: "Trigger a Power BI dataset refresh by workspace and dataset ID. Returns refresh request status."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          call: "powerbi.trigger-refresh"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

When a lab experiment completes, extracts results from the electronic lab notebook, transforms the data via Azure Data Factory, loads it into Snowflake, and notifies the research lead via Slack.

naftiko: "0.5"
info:
  label: "R&D Experiment Results to Data Lake"
  description: "When a lab experiment completes, extracts results from the electronic lab notebook, transforms the data via Azure Data Factory, loads it into Snowflake, and notifies the research lead via Slack."
  tags:
    - research
    - data-pipeline
    - azure-data-factory
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: rd-data-pipeline
      port: 8080
      tools:
        - name: ingest-experiment-results
          description: "Extract experiment results from the ELN, transform and load into Snowflake, and notify the research team."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "The electronic lab notebook experiment identifier."
            - name: project_code
              in: body
              type: string
              description: "The R&D project code."
            - name: researcher_email
              in: body
              type: string
              description: "Email of the lead researcher to notify."
          steps:
            - name: get-experiment
              type: call
              call: "eln.get-experiment"
              with:
                experiment_id: "{{experiment_id}}"
            - name: trigger-etl
              type: call
              call: "adf.trigger-pipeline"
              with:
                pipeline_name: "eln_to_snowflake"
                parameters:
                  experiment_id: "{{experiment_id}}"
                  project_code: "{{project_code}}"
                  source_url: "{{get-experiment.data_export_url}}"
            - name: notify-researcher
              type: call
              call: "slack.post-message"
              with:
                channel: "rd-data-pipelines"
                text: "Experiment {{experiment_id}} (project {{project_code}}) results loaded to Snowflake. Pipeline run: {{trigger-etl.run_id}}. Researcher: {{researcher_email}}"
  consumes:
    - type: http
      namespace: eln
      baseUri: "https://astrazeneca-eln.benchling.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.benchling_token"
      resources:
        - name: experiments
          path: "/experiments/{{experiment_id}}"
          inputParameters:
            - name: experiment_id
              in: path
          operations:
            - name: get-experiment
              method: GET
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/rg-astrazeneca-data/providers/Microsoft.DataFactory/factories/adf-astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipelines
          path: "/pipelines/{{pipeline_name}}/createRun?api-version=2018-06-01"
          inputParameters:
            - name: pipeline_name
              in: path
          operations:
            - name: trigger-pipeline
              method: POST
    - type: http
      namespace: 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

Monitors regulatory intelligence feeds for new guidance documents from FDA, EMA, and other health authorities, stores findings in Snowflake, creates review tasks in Jira, and notifies the regulatory intelligence team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Intelligence Monitor"
  description: "Monitors regulatory intelligence feeds for new guidance documents from FDA, EMA, and other health authorities, stores findings in Snowflake, creates review tasks in Jira, and notifies the regulatory intelligence team via Microsoft Teams."
  tags:
    - regulatory
    - intelligence
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reg-intelligence
      port: 8080
      tools:
        - name: process-reg-update
          description: "Process a new regulatory intelligence update: store in warehouse, create review task, and notify the team."
          inputParameters:
            - name: authority
              in: body
              type: string
              description: "The health authority (e.g., FDA, EMA, MHRA)."
            - name: document_title
              in: body
              type: string
              description: "Title of the new guidance or regulation."
            - name: document_url
              in: body
              type: string
              description: "URL to the published document."
            - name: therapeutic_area
              in: body
              type: string
              description: "Relevant therapeutic area."
          steps:
            - name: store-intelligence
              type: call
              call: "snowflake.insert-record"
              with:
                database: "REGULATORY"
                schema: "INTELLIGENCE"
                table: "GUIDANCE_UPDATES"
                data:
                  authority: "{{authority}}"
                  title: "{{document_title}}"
                  url: "{{document_url}}"
                  therapeutic_area: "{{therapeutic_area}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "REGINTEL"
                summary: "Review: {{authority}} - {{document_title}}"
                issue_type: "Task"
                description: "New guidance from {{authority}}: {{document_title}}. Link: {{document_url}}. Therapeutic area: {{therapeutic_area}}."
            - name: notify-reg-intel
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory_intelligence"
                text: "New regulatory update from {{authority}}: {{document_title}}. TA: {{therapeutic_area}}. Review task: {{create-review-task.key}}. Document: {{document_url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a regulatory submission is finalized in Veeva Vault, uploads the eCTD package to the health authority gateway, logs the submission in ServiceNow, and notifies the regulatory affairs team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Submission Pipeline"
  description: "When a regulatory submission is finalized in Veeva Vault, uploads the eCTD package to the health authority gateway, logs the submission in ServiceNow, and notifies the regulatory affairs team via Microsoft Teams."
  tags:
    - regulatory
    - submissions
    - veeva
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submissions
      port: 8080
      tools:
        - name: submit-ectd-package
          description: "Given a Veeva Vault document ID, orchestrate eCTD submission to the health authority gateway with audit trail and team notification."
          inputParameters:
            - name: vault_document_id
              in: body
              type: string
              description: "The Veeva Vault document ID for the finalized eCTD package."
            - name: health_authority
              in: body
              type: string
              description: "Target health authority (e.g., FDA, EMA, PMDA)."
            - name: submission_type
              in: body
              type: string
              description: "The type of submission (e.g., NDA, BLA, MAA, supplement)."
          steps:
            - name: get-document
              type: call
              call: "veeva.get-document"
              with:
                document_id: "{{vault_document_id}}"
            - name: upload-to-gateway
              type: call
              call: "ectd-gateway.submit-package"
              with:
                package_url: "{{get-document.download_url}}"
                authority: "{{health_authority}}"
                submission_type: "{{submission_type}}"
            - name: log-submission
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_regulatory_submissions"
                short_description: "{{submission_type}} submitted to {{health_authority}}"
                document_id: "{{vault_document_id}}"
                gateway_tracking_id: "{{upload-to-gateway.tracking_id}}"
            - name: notify-reg-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory_affairs"
                text: "Submission complete: {{submission_type}} to {{health_authority}}. Gateway tracking: {{upload-to-gateway.tracking_id}}. ServiceNow: {{log-submission.sys_id}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://astrazeneca.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_session_id"
      resources:
        - name: documents
          path: "/objects/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: ectd-gateway
      baseUri: "https://gateway.astrazeneca.com/regulatory/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ectd_gateway_token"
      resources:
        - name: submissions
          path: "/submissions"
          operations:
            - name: submit-package
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks regulatory submission milestones, monitors agency responses, and notifies regulatory affairs.

naftiko: "0.5"
info:
  label: "Regulatory Submission Tracker Pipeline"
  description: "Tracks regulatory submission milestones, monitors agency responses, and notifies regulatory affairs."
  tags:
    - regulatory
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: regulatory
      port: 8080
      tools:
        - name: regulatory_submission_tracker_pipeline
          description: "Orchestrate regulatory submission tracker pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-jira
              type: call
              call: "jira.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-jira.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Regulatory Submission Tracker Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://astrazeneca.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a healthcare professional account from Salesforce by account ID, returning name, specialty, institution, territory, and engagement tier.

naftiko: "0.5"
info:
  label: "Salesforce HCP Account Lookup"
  description: "Retrieves a healthcare professional account from Salesforce by account ID, returning name, specialty, institution, territory, and engagement tier."
  tags:
    - commercial
    - hcp-engagement
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: commercial-hcp
      port: 8080
      tools:
        - name: get-hcp-account
          description: "Look up a healthcare professional account in Salesforce. Returns name, specialty, affiliated institution, territory, and tier."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the HCP."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: hcp_name
              type: string
              mapping: "$.Name"
            - name: specialty
              type: string
              mapping: "$.Specialty__c"
            - name: institution
              type: string
              mapping: "$.Institution__c"
            - name: territory
              type: string
              mapping: "$.Territory__c"
            - name: engagement_tier
              type: string
              mapping: "$.Engagement_Tier__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://astrazeneca.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves a sourcing event from SAP Ariba by event ID, returning event title, status, supplier count, and award date for procurement visibility.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Status"
  description: "Retrieves a sourcing event from SAP Ariba by event ID, returning event title, status, supplier count, and award date for procurement visibility."
  tags:
    - procurement
    - sourcing
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: procurement-sourcing
      port: 8080
      tools:
        - name: get-sourcing-event
          description: "Look up a SAP Ariba sourcing event. Returns title, status, number of participating suppliers, and award date."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The SAP Ariba sourcing event ID."
          call: "ariba.get-event"
          with:
            event_id: "{{event_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: status
              type: string
              mapping: "$.status"
            - name: supplier_count
              type: string
              mapping: "$.participantCount"
            - name: award_date
              type: string
              mapping: "$.awardDate"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing-projects/v1/prod"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      inputParameters:
        - name: apiKey
          in: header
          value: "$secrets.ariba_api_key"
      resources:
        - name: events
          path: "/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET

When a travel expense report is submitted in SAP Concur, validates against policy thresholds, retrieves approver from Workday, routes for approval, and notifies the submitter via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When a travel expense report is submitted in SAP Concur, validates against policy thresholds, retrieves approver from Workday, routes for approval, and notifies the submitter via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: route-expense-approval
          description: "Validate and route a SAP Concur expense report for manager approval with policy check and notification."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: submitter_worker_id
              in: body
              type: string
              description: "The Workday worker ID of the submitter."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-report"
              with:
                report_id: "{{report_id}}"
            - name: get-submitter
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{submitter_worker_id}}"
            - name: submit-for-approval
              type: call
              call: "concur.submit-report"
              with:
                report_id: "{{report_id}}"
                approver_email: "{{get-submitter.manager_email}}"
            - name: notify-submitter
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-submitter.work_email}}"
                text: "Your expense report {{report_id}} ({{get-expense-report.total_amount}} {{get-expense-report.currency}}) has been routed to {{get-submitter.manager_name}} for approval."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.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
            - name: submit-report
              method: PATCH
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      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: 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

Looks up a SAP S/4HANA purchase order for raw materials or API ingredients by PO number, returning header status, vendor, total value, and delivery schedule.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order for raw materials or API ingredients by PO number, returning header status, vendor, total value, and delivery schedule."
  tags:
    - procurement
    - supply-chain
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: pharma-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (10-digit)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://astrazeneca-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: "200"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Detects security incidents, enriches with context, creates response tickets, and notifies the SOC.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "Detects security incidents, enriches with context, creates response tickets, and notifies the SOC."
  tags:
    - security
    - splunk
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: security_incident_response_pipeline
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-splunk
              type: call
              call: "splunk.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-splunk.result}}"
            - name: create-pagerduty
              type: call
              call: "pagerduty.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Security Incident Response Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://astrazeneca-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST

Retrieves a ServiceNow incident by number, returning short description, priority, assigned group, state, and resolution notes for IT support triage.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning short description, priority, assigned group, state, and resolution notes for IT support triage."
  tags:
    - it-operations
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-incidents
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns short description, priority, assignment group, state, and resolution notes."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: short_description
              type: string
              mapping: "$.result.short_description"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: resolution_notes
              type: string
              mapping: "$.result.close_notes"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.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

Monitors service levels, detects SLA breaches, creates escalation tickets, and reports to management.

naftiko: "0.5"
info:
  label: "SLA Compliance Monitoring Pipeline"
  description: "Monitors service levels, detects SLA breaches, creates escalation tickets, and reports to management."
  tags:
    - operations
    - datadog
    - servicenow
    - powerbi
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: sla_compliance_monitoring_pipeline
          description: "Orchestrate sla compliance monitoring pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-powerbi
              type: call
              call: "powerbi.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "SLA Compliance Monitoring Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST

Executes a SQL query against the Snowflake clinical analytics warehouse and returns results for use in reporting and data science workflows.

naftiko: "0.5"
info:
  label: "Snowflake Clinical Analytics Query"
  description: "Executes a SQL query against the Snowflake clinical analytics warehouse and returns results for use in reporting and data science workflows."
  tags:
    - analytics
    - data-warehouse
    - snowflake
    - clinical-trials
capability:
  exposes:
    - type: mcp
      namespace: clinical-analytics
      port: 8080
      tools:
        - name: run-analytics-query
          description: "Execute a SQL query against the Snowflake clinical data warehouse, log the query execution in ServiceNow for audit, and post results summary to the analytics Slack channel."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL statement to execute."
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse to use (e.g., CLINICAL_WH)."
            - name: database
              in: body
              type: string
              description: "The target Snowflake database."
            - name: requester
              in: body
              type: string
              description: "Name of the analyst running the query."
          steps:
            - name: execute-query
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "{{sql_statement}}"
                warehouse: "{{warehouse}}"
                database: "{{database}}"
            - name: log-query
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_data_query_audit"
                database: "{{database}}"
                warehouse: "{{warehouse}}"
                requester: "{{requester}}"
                row_count: "{{execute-query.resultSetMetaData.numRows}}"
            - name: post-summary
              type: call
              call: "slack.post-message"
              with:
                channel: "clinical-analytics"
                text: "Query executed by {{requester}} on {{database}}: {{execute-query.resultSetMetaData.numRows}} rows returned. Audit: {{log-query.sys_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT.

naftiko: "0.5"
info:
  label: "Software License Optimization Pipeline"
  description: "Audits license usage, identifies underutilized licenses, recommends optimization, and notifies IT."
  tags:
    - operations
    - servicenow
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: software_license_optimization
          description: "Orchestrate software license optimization pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-snowflake
              type: call
              call: "snowflake.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Software License Optimization Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://astrazeneca.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Executes a Splunk search query for security events, returning event count, top source IPs, and severity distribution for the cybersecurity operations team.

naftiko: "0.5"
info:
  label: "Splunk Security Event Query"
  description: "Executes a Splunk search query for security events, returning event count, top source IPs, and severity distribution for the cybersecurity operations team."
  tags:
    - security
    - monitoring
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: security-monitoring
      port: 8080
      tools:
        - name: search-security-events
          description: "Execute a Splunk search for security events, log the search in ServiceNow for SOC tracking, and alert the cybersecurity team via Slack."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk SPL search query."
            - name: time_range
              in: body
              type: string
              description: "Time range (e.g., -24h, -7d)."
            - name: analyst_name
              in: body
              type: string
              description: "Name of the SOC analyst running the search."
          steps:
            - name: execute-search
              type: call
              call: "splunk.create-search"
              with:
                search: "{{search_query}}"
                earliest_time: "{{time_range}}"
            - name: log-search
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_soc_search_log"
                analyst: "{{analyst_name}}"
                search_id: "{{execute-search.sid}}"
                query: "{{search_query}}"
                time_range: "{{time_range}}"
            - name: alert-soc
              type: call
              call: "slack.post-message"
              with:
                channel: "cybersecurity-ops"
                text: "Security search initiated by {{analyst_name}}. Splunk SID: {{execute-search.sid}}. Time range: {{time_range}}. Audit: {{log-search.sys_id}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.astrazeneca.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Retrieves metadata for a Tableau workbook used in clinical trial reporting, including workbook name, owner, views, last refresh time, and data source connections.

naftiko: "0.5"
info:
  label: "Tableau Clinical Dashboard Workbook Info"
  description: "Retrieves metadata for a Tableau workbook used in clinical trial reporting, including workbook name, owner, views, last refresh time, and data source connections."
  tags:
    - analytics
    - clinical-trials
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: clinical-dashboards
      port: 8080
      tools:
        - name: get-workbook-info
          description: "Look up a Tableau workbook by ID, log access in Snowflake for governance tracking, and notify the workbook owner via Slack if stale."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook LUID."
            - name: requester_name
              in: body
              type: string
              description: "Name of the person requesting workbook info."
          steps:
            - name: fetch-workbook
              type: call
              call: "tableau.get-workbook"
              with:
                workbook_id: "{{workbook_id}}"
            - name: log-access
              type: call
              call: "snowflake.insert-record"
              with:
                database: "ANALYTICS_GOVERNANCE"
                schema: "TABLEAU"
                table: "WORKBOOK_ACCESS_LOG"
                data:
                  workbook_id: "{{workbook_id}}"
                  workbook_name: "{{fetch-workbook.workbook.name}}"
                  requester: "{{requester_name}}"
                  owner: "{{fetch-workbook.workbook.owner.name}}"
            - name: notify-owner
              type: call
              call: "slack.post-message"
              with:
                channel: "analytics-governance"
                text: "Workbook {{fetch-workbook.workbook.name}} (owner: {{fetch-workbook.workbook.owner.name}}) accessed by {{requester_name}}. Last updated: {{fetch-workbook.workbook.updatedAt}}."
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.astrazeneca.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/$secrets.tableau_site_id/workbooks/{{workbook_id}}"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: get-workbook
              method: GET

Retrieves the latest Terraform plan output from an Azure DevOps pipeline run for a given infrastructure workspace, returning resource additions, changes, and destructions.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Plan Check"
  description: "Retrieves the latest Terraform plan output from an Azure DevOps pipeline run for a given infrastructure workspace, returning resource additions, changes, and destructions."
  tags:
    - devops
    - infrastructure
    - terraform
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: infra-terraform
      port: 8080
      tools:
        - name: get-terraform-plan
          description: "Retrieve the latest Terraform plan summary from Azure DevOps for a workspace. Returns planned additions, changes, and deletions."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline ID for Terraform."
          call: "azdo.get-latest-run"
          with:
            project: "{{project_name}}"
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.id"
            - name: state
              type: string
              mapping: "$.state"
            - name: result
              type: string
              mapping: "$.result"
            - name: created_date
              type: string
              mapping: "$.createdDate"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/astrazeneca"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdo_pat"
      resources:
        - name: pipeline-runs
          path: "/{{project}}/_apis/pipelines/{{pipeline_id}}/runs?api-version=7.1&$top=1"
          inputParameters:
            - name: project
              in: path
            - name: pipeline_id
              in: path
          operations:
            - name: get-latest-run
              method: GET

Monitors integration endpoints, detects failures, creates support tickets, and notifies integration team.

naftiko: "0.5"
info:
  label: "Third-Party Integration Health Pipeline"
  description: "Monitors integration endpoints, detects failures, creates support tickets, and notifies integration team."
  tags:
    - integrations
    - datadog
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: integrations
      port: 8080
      tools:
        - name: third_party_integration_health_pipeline
          description: "Orchestrate third-party integration health pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-datadog
              type: call
              call: "datadog.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-datadog.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Third-Party Integration Health Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Tracks mandatory training completion, sends reminders, escalates non-compliance, and reports status.

naftiko: "0.5"
info:
  label: "Training Compliance Tracker Pipeline"
  description: "Tracks mandatory training completion, sends reminders, escalates non-compliance, and reports status."
  tags:
    - compliance
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: training_compliance_tracker_pipeline
          description: "Orchestrate training compliance tracker pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-workday
              type: call
              call: "workday.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-servicenow
              type: call
              call: "servicenow.process-resource"
              with:
                data: "{{get-workday.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Training Compliance Tracker Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves a regulatory document from Veeva Vault by document ID, returning document name, version, status, classification, and download link.

naftiko: "0.5"
info:
  label: "Veeva Vault Document Retrieval"
  description: "Retrieves a regulatory document from Veeva Vault by document ID, returning document name, version, status, classification, and download link."
  tags:
    - regulatory
    - document-management
    - veeva
capability:
  exposes:
    - type: mcp
      namespace: regulatory-docs
      port: 8080
      tools:
        - name: get-vault-document
          description: "Look up a Veeva Vault document by ID. Returns document name, version, lifecycle state, document type, and download URL."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Veeva Vault document ID."
          call: "veeva.get-document"
          with:
            document_id: "{{document_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.document.name__v"
            - name: version
              type: string
              mapping: "$.document.major_version_number__v"
            - name: status
              type: string
              mapping: "$.document.status__v"
            - name: document_type
              type: string
              mapping: "$.document.type__v"
            - name: download_url
              type: string
              mapping: "$.document.download_url"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://astrazeneca.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_session_id"
      resources:
        - name: documents
          path: "/objects/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET

Triggers a vendor risk assessment by pulling vendor details from SAP Ariba, running a compliance check via a third-party risk service, logging findings in ServiceNow, and notifying the procurement team via Slack.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Orchestrator"
  description: "Triggers a vendor risk assessment by pulling vendor details from SAP Ariba, running a compliance check via a third-party risk service, logging findings in ServiceNow, and notifying the procurement team via Slack."
  tags:
    - procurement
    - vendor-management
    - compliance
    - sap-ariba
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Run a vendor risk assessment: pull vendor profile, check compliance, log findings, and notify procurement."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: assessment_type
              in: body
              type: string
              description: "Assessment type (e.g., gxp-audit, financial-health, cyber-risk)."
          steps:
            - name: get-vendor-profile
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{vendor_id}}"
            - name: run-compliance-check
              type: call
              call: "risk-service.check-compliance"
              with:
                company_name: "{{get-vendor-profile.company_name}}"
                duns_number: "{{get-vendor-profile.duns}}"
                assessment_type: "{{assessment_type}}"
            - name: log-findings
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_vendor_risk_assessments"
                vendor_name: "{{get-vendor-profile.company_name}}"
                risk_score: "{{run-compliance-check.risk_score}}"
                risk_level: "{{run-compliance-check.risk_level}}"
                findings: "{{run-compliance-check.findings_summary}}"
            - name: notify-procurement
              type: call
              call: "slack.post-message"
              with:
                channel: "procurement-risk"
                text: "Vendor risk assessment complete: {{get-vendor-profile.company_name}}. Type: {{assessment_type}}. Risk score: {{run-compliance-check.risk_score}} ({{run-compliance-check.risk_level}}). ServiceNow: {{log-findings.sys_id}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1/prod"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      inputParameters:
        - name: apiKey
          in: header
          value: "$secrets.ariba_api_key"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: risk-service
      baseUri: "https://risk-platform.astrazeneca.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.risk_platform_token"
      resources:
        - name: compliance
          path: "/compliance/check"
          operations:
            - name: check-compliance
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              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

Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Pipeline"
  description: "Evaluates vendor security posture, scores risk, creates assessment records, and notifies procurement."
  tags:
    - procurement
    - servicenow
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: vendor_risk_assessment_pipeline
          description: "Orchestrate vendor risk assessment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-servicenow
              type: call
              call: "servicenow.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-confluence
              type: call
              call: "confluence.process-resource"
              with:
                data: "{{get-servicenow.result}}"
            - name: create-slack
              type: call
              call: "slack.create-resource"
              with:
                channel: "{{notification_channel}}"
                text: "Vendor Risk Assessment Pipeline step 3 complete."

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://astrazeneca.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://astrazeneca.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Retrieves an AstraZeneca employee record from Workday by worker ID, returning name, department, job title, manager, and location.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves an AstraZeneca employee record from Workday by worker ID, returning name, department, job title, manager, and location."
  tags:
    - hr
    - employee-management
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-employee
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an AstraZeneca employee in Workday by worker ID. Returns full name, department, title, manager name, and office 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.full_name"
            - name: department
              type: string
              mapping: "$.worker.department"
            - name: title
              type: string
              mapping: "$.worker.job_title"
            - name: manager
              type: string
              mapping: "$.worker.manager.full_name"
            - name: location
              type: string
              mapping: "$.worker.location"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/astrazeneca"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Retrieves a Zendesk support ticket by ID, returning subject, status, priority, assignee, and latest comment for IT and commercial support teams.

naftiko: "0.5"
info:
  label: "Zendesk Support Ticket Lookup"
  description: "Retrieves a Zendesk support ticket by ID, returning subject, status, priority, assignee, and latest comment for IT and commercial support teams."
  tags:
    - support
    - customer-service
    - zendesk
capability:
  exposes:
    - type: mcp
      namespace: support-tickets
      port: 8080
      tools:
        - name: get-support-ticket
          description: "Look up a Zendesk ticket by ID. Returns subject, status, priority, assignee name, and latest comment body."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
          outputParameters:
            - name: subject
              type: string
              mapping: "$.ticket.subject"
            - name: status
              type: string
              mapping: "$.ticket.status"
            - name: priority
              type: string
              mapping: "$.ticket.priority"
            - name: assignee
              type: string
              mapping: "$.ticket.assignee.name"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://astrazeneca.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET