GSK Capabilities

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

Sort
Expand

Reviews access at GSK via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at GSK via Okta, IAM, and Jira."
  tags:
    - security
    - access-management
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review
          description: "Review access at GSK."
          inputParameters:
            - name: dept
              in: body
              type: string
              description: "Department."
          steps:
            - name: ent
              type: call
              call: "okta.get-users"
              with:
                dept: "{{dept}}"
            - name: compare
              type: call
              call: "iam.compare"
              with:
                data: "{{ent.data}}"
            - name: flag
              type: call
              call: "iam.flag"
              with:
                violations: "{{compare.violations}}"
            - name: fix
              type: call
              call: "jira.create-issue"
              with:
                project: "IAM"
                summary: "Violations in {{dept}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gsk.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: iam
      baseUri: "https://iam.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iam_token"
      resources:
        - name: reviews
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Detects payroll exceptions from ADP, looks up the employee in Workday, creates a ServiceNow HR case, and notifies the HR partner in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Exception Alert"
  description: "Detects payroll exceptions from ADP, looks up the employee in Workday, creates a ServiceNow HR case, and notifies the HR partner in Microsoft Teams."
  tags:
    - hr
    - payroll
    - adp
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-exceptions
      port: 8080
      tools:
        - name: process-payroll-exception
          description: "Given an ADP exception ID and employee ID, look up the employee, create an HR case, and notify the HR partner."
          inputParameters:
            - name: exception_id
              in: body
              type: string
              description: "The ADP payroll exception identifier."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: exception_type
              in: body
              type: string
              description: "Type of payroll exception (Overpayment, Underpayment, Tax-Withholding, Benefits)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-hr-case
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Payroll Exception: {{exception_type}} — {{get-employee.full_name}}"
                description: "ADP Exception: {{exception_id}}. Employee: {{get-employee.full_name}} ({{employee_id}}). Department: {{get-employee.department}}. Type: {{exception_type}}."
                assigned_group: "HR_Payroll"
                category: "payroll_exception"
            - name: notify-hr
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "hr-payroll"
                text: "Payroll Exception ({{exception_type}}): {{get-employee.full_name}} ({{get-employee.department}}). ADP: {{exception_id}}. Case: {{create-hr-case.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches an adverse event case from the pharmacovigilance safety database by case ID. Returns case status, seriousness, reporter type, and suspect product.

naftiko: "0.5"
info:
  label: "Adverse Event Case Retrieval"
  description: "Fetches an adverse event case from the pharmacovigilance safety database by case ID. Returns case status, seriousness, reporter type, and suspect product."
  tags:
    - pharmacovigilance
    - drug-safety
    - safety-database
capability:
  exposes:
    - type: mcp
      namespace: pharmacovigilance
      port: 8080
      tools:
        - name: get-adverse-event
          description: "Retrieve an adverse event case from the safety database by case number."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The safety database case identifier."
          call: "safetydb.get-case"
          with:
            case_id: "{{case_id}}"
          outputParameters:
            - name: case_status
              type: string
              mapping: "$.caseStatus"
            - name: seriousness
              type: string
              mapping: "$.seriousnessCriteria"
            - name: suspect_product
              type: string
              mapping: "$.suspectProduct.productName"
            - name: reporter_type
              type: string
              mapping: "$.primaryReporter.reporterType"
            - name: receipt_date
              type: string
              mapping: "$.receiptDate"
  consumes:
    - type: http
      namespace: safetydb
      baseUri: "https://gsk-safety.veeva.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_safety_token"
      resources:
        - name: cases
          path: "/objects/adverse_event/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET

Queries Kong API gateway metrics, correlates with Datadog service-level data, and publishes a consolidated API health summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "API Gateway Health Dashboard"
  description: "Queries Kong API gateway metrics, correlates with Datadog service-level data, and publishes a consolidated API health summary to Microsoft Teams."
  tags:
    - infrastructure
    - api-management
    - kong
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-health
      port: 8080
      tools:
        - name: check-api-health
          description: "Given a Kong service name, pull gateway metrics and Datadog SLI data and post a health summary to Teams."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Kong API gateway service name."
          steps:
            - name: get-kong-metrics
              type: call
              call: "kong.get-service-status"
              with:
                service_name: "{{service_name}}"
            - name: get-datadog-metrics
              type: call
              call: "datadog.get-service-metrics"
              with:
                service_name: "{{service_name}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "platform-engineering"
                text: "API Health: {{service_name}}. Kong status: {{get-kong-metrics.status}}. Requests/min: {{get-kong-metrics.request_rate}}. Datadog availability: {{get-datadog-metrics.availability_pct}}%. Active alerts: {{get-datadog-metrics.active_alerts}}."
  consumes:
    - type: http
      namespace: kong
      baseUri: "https://gsk-kong-admin.internal.gsk.com"
      authentication:
        type: bearer
        token: "$secrets.kong_admin_token"
      resources:
        - name: services
          path: "/services/{{service_name}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-status
              method: GET
    - 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: metrics
          path: "/query?query=avg:system.cpu.idle{{service:{{service_name}}}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages API deprecation at GSK via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at GSK via consumer identification, notices, and tracking."
  tags:
    - api-management
    - communications
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-sunset
      port: 8080
      tools:
        - name: notify-sunset
          description: "Manage API sunset at GSK."
          inputParameters:
            - name: api
              in: body
              type: string
              description: "API name."
            - name: date
              in: body
              type: string
              description: "Sunset date."
          steps:
            - name: consumers
              type: call
              call: "api-gw.consumers"
              with:
                api: "{{api}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{consumers.emails}}"
                subject: "{{api}} sunset: {{date}}"
            - name: track
              type: call
              call: "analytics.usage"
              with:
                api: "{{api}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Sunset {{api}} by {{date}}"
  consumes:
    - type: http
      namespace: api-gw
      baseUri: "https://api-gw.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.api_gw_token"
      resources:
        - name: consumers
          path: "/apis/{{api}}/consumers"
          inputParameters:
            - name: api
              in: path
          operations:
            - name: consumers
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: usage
          path: "/api-usage"
          operations:
            - name: usage
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Triggers an Argo workflow for clinical data processing, monitors completion, stores output in Amazon S3, and notifies the data science team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Argo Workflow Clinical Data Processing"
  description: "Triggers an Argo workflow for clinical data processing, monitors completion, stores output in Amazon S3, and notifies the data science team in Microsoft Teams."
  tags:
    - data-pipeline
    - clinical-trials
    - argo
    - amazon-s3
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-pipeline
      port: 8080
      tools:
        - name: run-data-pipeline
          description: "Given a study ID and workflow template, trigger an Argo workflow for clinical data processing and store the output."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: workflow_template
              in: body
              type: string
              description: "The Argo workflow template name."
            - name: output_prefix
              in: body
              type: string
              description: "The S3 output prefix for processed data."
          steps:
            - name: trigger-workflow
              type: call
              call: "argo.submit-workflow"
              with:
                template: "{{workflow_template}}"
                study_id: "{{study_id}}"
            - name: store-output
              type: call
              call: "s3.put-object"
              with:
                bucket: "gsk-clinical-data-processed"
                key: "{{output_prefix}}/{{study_id}}/{{trigger-workflow.workflow_id}}"
            - name: notify-data-science
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-science"
                text: "Clinical data pipeline completed for {{study_id}}. Workflow: {{trigger-workflow.workflow_id}}. Status: {{trigger-workflow.status}}. Output: s3://gsk-clinical-data-processed/{{output_prefix}}/{{study_id}}/{{trigger-workflow.workflow_id}}"
  consumes:
    - type: http
      namespace: argo
      baseUri: "https://gsk-argo.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argo_token"
      resources:
        - name: workflows
          path: "/workflows/gsk-clinical"
          operations:
            - name: submit-workflow
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://gsk-clinical-data-processed.s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks build at GSK.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at GSK."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at GSK."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          call: "azdo.get-build"
          with:
            project: "{{project}}"
            build_id: "{{build_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/gsk.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET

Retrieves the latest build pipeline run status from Azure DevOps for a given pipeline ID. Returns build result, duration, and triggered-by user.

naftiko: "0.5"
info:
  label: "Azure DevOps Pipeline Status"
  description: "Retrieves the latest build pipeline run status from Azure DevOps for a given pipeline ID. Returns build result, duration, and triggered-by user."
  tags:
    - devops
    - ci-cd
    - azure-devops
    - pipeline
capability:
  exposes:
    - type: mcp
      namespace: devops-pipeline
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Get the latest Azure DevOps pipeline run result by pipeline ID."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline definition ID."
          call: "azuredevops.get-latest-run"
          with:
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - name: triggered_by
              type: string
              mapping: "$.value[0].requestedBy.displayName"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/gsk-pharma/GSK-R&D/_apis"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azuredevops_pat"
      resources:
        - name: builds
          path: "/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: get-latest-run
              method: GET

Verifies backups at GSK.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at GSK."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at GSK."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://gsk.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Analyzes budget variance at GSK via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at GSK via Oracle, Workday, and Slack."
  tags:
    - finance
    - budget
    - oracle
    - workday
capability:
  exposes:
    - type: mcp
      namespace: budget-var
      port: 8080
      tools:
        - name: analyze-variance
          description: "Check budget variance at GSK."
          inputParameters:
            - name: cc
              in: body
              type: string
              description: "Cost center."
            - name: period
              in: body
              type: string
              description: "Period."
          steps:
            - name: actuals
              type: call
              call: "oracle.get-actuals"
              with:
                cc: "{{cc}}"
                period: "{{period}}"
            - name: budget
              type: call
              call: "workday.get-budget"
              with:
                cc: "{{cc}}"
            - name: compute
              type: call
              call: "analytics.variance"
              with:
                a: "{{actuals.total}}"
                b: "{{budget.total}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Variance {{cc}}: ${{compute.variance}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/actuals"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/budgets"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

On identification of a corrective/preventive action, creates a CAPA record in ServiceNow, assigns the investigation owner from Workday, sets a due date, and notifies the quality management team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "CAPA Management Orchestrator"
  description: "On identification of a corrective/preventive action, creates a CAPA record in ServiceNow, assigns the investigation owner from Workday, sets a due date, and notifies the quality management team in Microsoft Teams."
  tags:
    - quality
    - capa
    - servicenow
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-capa
      port: 8080
      tools:
        - name: initiate-capa
          description: "Given CAPA details, create a record in ServiceNow, assign an owner from Workday, and notify the quality team."
          inputParameters:
            - name: capa_title
              in: body
              type: string
              description: "Title of the CAPA."
            - name: root_cause
              in: body
              type: string
              description: "Description of the identified root cause."
            - name: investigation_owner_id
              in: body
              type: string
              description: "The Workday ID of the investigation owner."
            - name: due_days
              in: body
              type: number
              description: "Number of days until the CAPA is due."
          steps:
            - name: get-owner
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{investigation_owner_id}}"
            - name: create-capa
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "CAPA: {{capa_title}}"
                description: "Root Cause: {{root_cause}}\nInvestigation Owner: {{get-owner.full_name}}\nDue in: {{due_days}} days"
                assigned_to: "{{get-owner.work_email}}"
                assigned_group: "Quality_CAPA"
                category: "capa"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-capa"
                text: "New CAPA: {{capa_title}}. Owner: {{get-owner.full_name}}. Due: {{due_days}} days. Record: {{create-capa.number}}. Root cause: {{root_cause}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Plans capacity at GSK by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at GSK by collecting utilization and forecasting."
  tags:
    - infrastructure
    - capacity-planning
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: capacity
      port: 8080
      tools:
        - name: plan-capacity
          description: "Plan capacity at GSK."
          inputParameters:
            - name: resource
              in: body
              type: string
              description: "Resource type."
            - name: months
              in: body
              type: number
              description: "Forecast months."
          steps:
            - name: util
              type: call
              call: "monitoring.get-util"
              with:
                resource: "{{resource}}"
            - name: forecast
              type: call
              call: "analytics.forecast"
              with:
                current: "{{util.pct}}"
                months: "{{months}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "capacity"
                resource: "{{resource}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "capacity"
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: util
          path: "/resources/{{resource}}/util"
          inputParameters:
            - name: resource
              in: path
          operations:
            - name: get-util
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: forecast
          path: "/demand"
          operations:
            - name: forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at GSK.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at GSK."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at GSK."
          inputParameters:
            - name: domains
              in: body
              type: string
              description: "Domains to check."
          steps:
            - name: scan
              type: call
              call: "cert-scanner.scan"
              with:
                domains: "{{domains}}"
            - name: filter
              type: call
              call: "analytics.filter-expiring"
              with:
                certs: "{{scan.results}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "{{filter.count}} certs expiring"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Cert alert: {{filter.count}} expiring"
  consumes:
    - type: http
      namespace: cert-scanner
      baseUri: "https://certs.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cert_token"
      resources:
        - name: scans
          path: "/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes changes at GSK through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at GSK through ServiceNow and CAB approval."
  tags:
    - change-management
    - servicenow
    - itil
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: process-change
          description: "Process changes at GSK."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "Change ID."
            - name: date
              in: body
              type: string
              description: "Date."
          steps:
            - name: get
              type: call
              call: "servicenow.get-change"
              with:
                id: "{{change_id}}"
            - name: conflicts
              type: call
              call: "servicenow.check-conflicts"
              with:
                date: "{{date}}"
            - name: submit
              type: call
              call: "servicenow.update"
              with:
                id: "{{change_id}}"
                state: "approval"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "cab@co.com"
                subject: "CAB: {{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Reconciles clinical EDC data between Elasticsearch and the clinical metadata database, flags discrepancies in ServiceNow, and publishes a reconciliation report to Confluence.

naftiko: "0.5"
info:
  label: "Clinical Data Reconciliation Pipeline"
  description: "Reconciles clinical EDC data between Elasticsearch and the clinical metadata database, flags discrepancies in ServiceNow, and publishes a reconciliation report to Confluence."
  tags:
    - clinical-trials
    - data-reconciliation
    - elasticsearch
    - postgresql
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: data-reconciliation
      port: 8080
      tools:
        - name: reconcile-clinical-data
          description: "Given a study ID and visit window, compare EDC data in Elasticsearch against the metadata repository and flag discrepancies."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: visit_window
              in: body
              type: string
              description: "The visit window to reconcile."
          steps:
            - name: search-edc
              type: call
              call: "elasticsearch.search-index"
              with:
                index: "clinical-edc-data"
                query_study: "{{study_id}}"
                query_visit: "{{visit_window}}"
            - name: get-metadata
              type: call
              call: "clinicalmeta.get-study"
              with:
                study_id: "{{study_id}}"
            - name: flag-discrepancies
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Data Reconciliation: {{study_id}} — {{visit_window}}"
                description: "EDC records found: {{search-edc.total_hits}}. Expected enrollment: {{get-metadata.enrollment_target}}. Study: {{get-metadata.study_title}}."
                assigned_group: "Clinical_Data_Management"
                category: "data_reconciliation"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CDM"
                title: "Reconciliation: {{study_id}} — {{visit_window}}"
                body: "Study: {{get-metadata.study_title}}\nVisit: {{visit_window}}\nEDC Records: {{search-edc.total_hits}}\nTarget Enrollment: {{get-metadata.enrollment_target}}\nServiceNow: {{flag-discrepancies.number}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://gsk-clinical-es.aws.gsk.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-index
              method: POST
    - type: http
      namespace: clinicalmeta
      baseUri: "https://gsk-clinical-meta.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.clinical_meta_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: get-study
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a new adverse event is reported, creates a case in the safety database, opens a ServiceNow quality ticket, notifies the medical monitor in Microsoft Teams, and uploads the source document to SharePoint.

naftiko: "0.5"
info:
  label: "Clinical Trial Adverse Event Intake Orchestrator"
  description: "When a new adverse event is reported, creates a case in the safety database, opens a ServiceNow quality ticket, notifies the medical monitor in Microsoft Teams, and uploads the source document to SharePoint."
  tags:
    - pharmacovigilance
    - drug-safety
    - clinical-trials
    - servicenow
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ae-intake
      port: 8080
      tools:
        - name: process-adverse-event
          description: "Given adverse event details from a clinical trial site, create a safety case, open a quality ticket, notify the medical monitor, and archive the source document."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: subject_id
              in: body
              type: string
              description: "The subject/patient identifier."
            - name: event_term
              in: body
              type: string
              description: "The adverse event preferred term (MedDRA)."
            - name: seriousness
              in: body
              type: string
              description: "Seriousness classification (Serious, Non-Serious)."
            - name: reporter_email
              in: body
              type: string
              description: "The email of the site reporter."
          steps:
            - name: create-safety-case
              type: call
              call: "safetydb.create-case"
              with:
                study_id: "{{study_id}}"
                subject_id: "{{subject_id}}"
                event_term: "{{event_term}}"
                seriousness: "{{seriousness}}"
            - name: open-quality-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "AE Report: {{event_term}} — Study {{study_id}} Subject {{subject_id}}"
                category: "pharmacovigilance"
                assigned_group: "PV_Safety_Operations"
                description: "Adverse event {{event_term}} ({{seriousness}}) reported for subject {{subject_id}} in study {{study_id}}. Safety case: {{create-safety-case.case_id}}."
            - name: notify-medical-monitor
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "pv-medical-monitors"
                text: "New {{seriousness}} AE in {{study_id}}: {{event_term}} for subject {{subject_id}}. Safety case {{create-safety-case.case_id}}. ServiceNow ticket: {{open-quality-ticket.number}}."
            - name: archive-source
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "pv_archive_site"
                folder_path: "AE_Reports/{{study_id}}/{{subject_id}}/{{create-safety-case.case_id}}"
  consumes:
    - type: http
      namespace: safetydb
      baseUri: "https://gsk-safety.veeva.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_safety_token"
      resources:
        - name: cases
          path: "/objects/adverse_event"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              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-file
              method: PUT

Reconciles clinical trial budgets by pulling actuals from SAP, comparing to planned costs in the clinical metadata system, flagging overruns in ServiceNow, and notifying finance in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Budget Reconciliation"
  description: "Reconciles clinical trial budgets by pulling actuals from SAP, comparing to planned costs in the clinical metadata system, flagging overruns in ServiceNow, and notifying finance in Microsoft Teams."
  tags:
    - finance
    - clinical-trials
    - budget
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trial-budget
      port: 8080
      tools:
        - name: reconcile-trial-budget
          description: "Given a study ID and fiscal period, compare SAP actuals against planned budget and flag any overruns."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period (e.g. 2026-Q1)."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center for the trial."
          steps:
            - name: get-actuals
              type: call
              call: "sap.get-cost-center-actuals"
              with:
                cost_center: "{{cost_center}}"
                period: "{{fiscal_period}}"
            - name: get-planned
              type: call
              call: "clinicalmeta.get-study"
              with:
                study_id: "{{study_id}}"
            - name: flag-overrun
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Budget Review: {{study_id}} — {{fiscal_period}}"
                description: "Study: {{get-planned.study_title}}\nCost Center: {{cost_center}}\nActuals: {{get-actuals.total_actual}}\nPlanned: {{get-planned.budget_amount}}\nVariance requires review."
                assigned_group: "Clinical_Finance"
                category: "budget_reconciliation"
            - name: notify-finance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical-finance"
                text: "Budget Review: {{study_id}} ({{fiscal_period}}). Actuals: {{get-actuals.total_actual}} vs Planned: {{get-planned.budget_amount}}. Task: {{flag-overrun.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')/to_Actuals(Period='{{period}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: period
              in: path
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: clinicalmeta
      baseUri: "https://gsk-clinical-meta.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.clinical_meta_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: get-study
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches a clinical trial protocol document from SharePoint by study ID and returns the document metadata and download link.

naftiko: "0.5"
info:
  label: "Clinical Trial Protocol Document Retrieval"
  description: "Fetches a clinical trial protocol document from SharePoint by study ID and returns the document metadata and download link."
  tags:
    - clinical-trials
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: clinical-docs
      port: 8080
      tools:
        - name: get-protocol-document
          description: "Retrieve a clinical trial protocol document from SharePoint given a study identifier."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The GSK clinical study identifier (e.g. GSK-213456)."
          call: "sharepoint.get-document"
          with:
            site_id: "clinical_trials_site"
            file_path: "Protocols/{{study_id}}/protocol_latest.pdf"
          outputParameters:
            - name: document_url
              type: string
              mapping: "$.webUrl"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
            - name: modified_by
              type: string
              mapping: "$.lastModifiedBy.user.displayName"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-document
              method: GET

Orchestrates clinical trial site activation by verifying site readiness in Salesforce, creating a SharePoint document package, provisioning site access in Azure Active Directory, and notifying the clinical operations team.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Activation Orchestrator"
  description: "Orchestrates clinical trial site activation by verifying site readiness in Salesforce, creating a SharePoint document package, provisioning site access in Azure Active Directory, and notifying the clinical operations team."
  tags:
    - clinical-trials
    - site-activation
    - salesforce
    - sharepoint
    - azure-active-directory
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: site-activation
      port: 8080
      tools:
        - name: activate-trial-site
          description: "Given a study ID and site ID, verify site readiness, provision document access, create AD accounts, and notify the clinical ops team."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: site_id
              in: body
              type: string
              description: "The clinical trial site identifier."
            - name: pi_email
              in: body
              type: string
              description: "The principal investigator email address."
          steps:
            - name: get-site-record
              type: call
              call: "salesforce.get-site"
              with:
                site_id: "{{site_id}}"
            - name: create-site-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "clinical_trials_site"
                folder_path: "Sites/{{study_id}}/{{site_id}}"
            - name: provision-ad-access
              type: call
              call: "azuread.invite-external"
              with:
                email: "{{pi_email}}"
                group_id: "clinical-site-{{study_id}}"
            - name: notify-clinical-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical-operations"
                text: "Site {{site_id}} activated for {{study_id}}. PI: {{get-site-record.pi_name}} ({{pi_email}}). Documents: {{create-site-folder.url}}. AD access provisioned."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gsk.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: sites
          path: "/sobjects/Clinical_Site__c/{{site_id}}"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-site
              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: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: invitations
          path: "/invitations"
          operations:
            - name: invite-external
              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/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Optimizes cloud costs at GSK via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at GSK via Azure, FinOps, Jira, and Power BI."
  tags:
    - cloud
    - cost-management
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-opt
      port: 8080
      tools:
        - name: optimize
          description: "Optimize cloud costs at GSK."
          inputParameters:
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: range
              in: body
              type: string
              description: "Range."
          steps:
            - name: spend
              type: call
              call: "cloud.get-costs"
              with:
                provider: "{{provider}}"
                range: "{{range}}"
            - name: savings
              type: call
              call: "finops.analyze"
              with:
                data: "{{spend.data}}"
            - name: action
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Save ${{savings.potential}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cloud"
  consumes:
    - type: http
      namespace: cloud
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-costs
              method: POST
    - type: http
      namespace: finops
      baseUri: "https://finops.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finops_token"
      resources:
        - name: analysis
          path: "/savings"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Searches Confluence at GSK.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at GSK."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at GSK."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gsk.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

Retrieves a regulatory standard operating procedure page from Confluence by SOP number. Returns page content, version, and last updated date.

naftiko: "0.5"
info:
  label: "Confluence Regulatory SOP Retrieval"
  description: "Retrieves a regulatory standard operating procedure page from Confluence by SOP number. Returns page content, version, and last updated date."
  tags:
    - regulatory
    - sop
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: regulatory-docs
      port: 8080
      tools:
        - name: get-sop-page
          description: "Retrieve a regulatory SOP from Confluence by SOP number."
          inputParameters:
            - name: sop_number
              in: body
              type: string
              description: "The SOP identifier (e.g. SOP-QA-0042)."
          call: "confluence.get-page"
          with:
            sop_number: "{{sop_number}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: version
              type: string
              mapping: "$.version.number"
            - name: last_updated
              type: string
              mapping: "$.version.when"
            - name: body_html
              type: string
              mapping: "$.body.storage.value"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content?title={{sop_number}}&spaceKey=REG&expand=body.storage,version"
          inputParameters:
            - name: sop_number
              in: path
          operations:
            - name: get-page
              method: GET

Tracks contract renewals at GSK via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at GSK via contracts system, email, Jira, and Salesforce."
  tags:
    - procurement
    - contracts
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renew
      port: 8080
      tools:
        - name: track
          description: "Track renewals at GSK."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
            - name: owner
              in: body
              type: string
              description: "Owner email."
          steps:
            - name: get
              type: call
              call: "contracts.get"
              with:
                id: "{{contract_id}}"
            - name: remind
              type: call
              call: "email.send"
              with:
                to: "{{owner}}"
                subject: "Renewal: {{contract_id}}"
            - name: task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Renew {{contract_id}}"
            - name: crm
              type: call
              call: "salesforce.update"
              with:
                id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: contracts
      baseUri: "https://contracts.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.contracts_token"
      resources:
        - name: contracts
          path: "/contracts/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gsk.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Reallocates costs at GSK.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at GSK."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at GSK."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors data pipelines at GSK via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at GSK via Databricks, Snowflake, Slack, and ServiceNow."
  tags:
    - data-engineering
    - databricks
    - monitoring
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pipeline-mon
      port: 8080
      tools:
        - name: monitor
          description: "Monitor pipelines at GSK."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          steps:
            - name: status
              type: call
              call: "databricks.get-run"
              with:
                id: "{{pipeline_id}}"
            - name: quality
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#data"
                text: "Pipeline {{pipeline_id}}: {{status.state}}"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "Pipeline {{pipeline_id}} issue"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://gsk.com.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://gsk.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Tracks ML model deployment on Azure Databricks by checking the model registry, running validation, creating a ServiceNow release record, and notifying the data science team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Tracker"
  description: "Tracks ML model deployment on Azure Databricks by checking the model registry, running validation, creating a ServiceNow release record, and notifying the data science team in Microsoft Teams."
  tags:
    - data-science
    - machine-learning
    - azure-databricks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ml-deployment
      port: 8080
      tools:
        - name: track-model-deployment
          description: "Given a Databricks model name and version, check registry status, create a release record, and notify the team."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The MLflow registered model name."
            - name: model_version
              in: body
              type: string
              description: "The model version to deploy."
            - name: target_stage
              in: body
              type: string
              description: "The target stage (Staging, Production)."
          steps:
            - name: get-model-info
              type: call
              call: "databricks.get-model-version"
              with:
                model_name: "{{model_name}}"
                version: "{{model_version}}"
            - name: create-release
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "ML Model Release: {{model_name}} v{{model_version}} to {{target_stage}}"
                description: "Model: {{model_name}} v{{model_version}}. Stage: {{target_stage}}. Status: {{get-model-info.status}}. Run ID: {{get-model-info.run_id}}."
                assigned_group: "Data_Science"
                category: "ml_deployment"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "data-science"
                text: "ML Model Deployment: {{model_name}} v{{model_version}} to {{target_stage}}. Status: {{get-model-info.status}}. Release: {{create-release.number}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://gsk-databricks.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: models
          path: "/mlflow/model-versions/get?name={{model_name}}&version={{version}}"
          inputParameters:
            - name: model_name
              in: path
            - name: version
              in: path
          operations:
            - name: get-model-version
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for current health metrics of a GxP-validated system by service name. Returns availability percentage, error rate, and active alert count.

naftiko: "0.5"
info:
  label: "Datadog GxP System Health Check"
  description: "Queries Datadog for current health metrics of a GxP-validated system by service name. Returns availability percentage, error rate, and active alert count."
  tags:
    - monitoring
    - gxp
    - datadog
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: system-health
      port: 8080
      tools:
        - name: get-system-health
          description: "Retrieve Datadog health metrics for a GxP-validated system service."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name (e.g. gsk-lims-prod)."
          call: "datadog.get-service-metrics"
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: availability_pct
              type: number
              mapping: "$.series[0].pointlist[-1][1]"
            - name: error_rate
              type: number
              mapping: "$.series[1].pointlist[-1][1]"
            - name: active_alerts
              type: number
              mapping: "$.alerts.total"
  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: metrics
          path: "/query?query=avg:system.cpu.idle{{service:{{service_name}}}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-metrics
              method: GET

Checks Datadog monitor at GSK.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at GSK."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at GSK."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Tests disaster recovery at GSK via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at GSK via failover, health checks, and reporting."
  tags:
    - disaster-recovery
    - business-continuity
    - testing
capability:
  exposes:
    - type: mcp
      namespace: dr-test
      port: 8080
      tools:
        - name: test-dr
          description: "Test DR at GSK."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Plan ID."
            - name: type
              in: body
              type: string
              description: "Test type."
          steps:
            - name: failover
              type: call
              call: "dr.failover"
              with:
                plan: "{{plan_id}}"
                type: "{{type}}"
            - name: validate
              type: call
              call: "monitoring.check"
              with:
                scope: "critical"
            - name: measure
              type: call
              call: "dr.metrics"
              with:
                id: "{{failover.id}}"
            - name: report
              type: call
              call: "confluence.create-page"
              with:
                title: "DR - {{plan_id}}"
                body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
  consumes:
    - type: http
      namespace: dr
      baseUri: "https://dr.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dr_token"
      resources:
        - name: failovers
          path: "/failovers"
          operations:
            - name: failover
              method: POST
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: health
          path: "/checks"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Detects infrastructure drift at GSK via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at GSK via Terraform, Slack, and Jira."
  tags:
    - infrastructure
    - terraform
    - drift-detection
    - devops
capability:
  exposes:
    - type: mcp
      namespace: drift-det
      port: 8080
      tools:
        - name: detect
          description: "Detect drift at GSK."
          inputParameters:
            - name: ws_id
              in: body
              type: string
              description: "Workspace ID."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: plan
              type: call
              call: "terraform.run"
              with:
                ws: "{{ws_id}}"
            - name: check
              type: call
              call: "terraform.get-plan"
              with:
                run: "{{plan.id}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra"
                text: "Drift {{env}}: {{check.changes}} changes"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Drift in {{env}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Monitors drug product stability data by pulling time-point results from the lab database, checking against specification limits, flagging OOT trends in ServiceNow, and notifying the stability lead in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Drug Product Stability Study Monitor"
  description: "Monitors drug product stability data by pulling time-point results from the lab database, checking against specification limits, flagging OOT trends in ServiceNow, and notifying the stability lead in Microsoft Teams."
  tags:
    - quality
    - stability
    - manufacturing
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: stability-monitor
      port: 8080
      tools:
        - name: check-stability-data
          description: "Given a product code and stability protocol, pull the latest time-point results, check for out-of-trend conditions, and notify if needed."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "The drug product code."
            - name: stability_protocol_id
              in: body
              type: string
              description: "The stability study protocol identifier."
            - name: time_point
              in: body
              type: string
              description: "The stability time point (e.g. 6M, 12M, 24M)."
          steps:
            - name: get-results
              type: call
              call: "labdb.get-stability-results"
              with:
                product_code: "{{product_code}}"
                protocol_id: "{{stability_protocol_id}}"
                time_point: "{{time_point}}"
            - name: flag-oot
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Stability Review: {{product_code}} — {{time_point}}"
                description: "Protocol: {{stability_protocol_id}}. Time point: {{time_point}}. Assay: {{get-results.assay_value}}%. Impurity: {{get-results.impurity_value}}%. Review for OOT."
                assigned_group: "Stability_Quality"
                category: "stability_monitoring"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "stability-monitoring"
                text: "Stability Data: {{product_code}} at {{time_point}}. Assay: {{get-results.assay_value}}%. Impurity: {{get-results.impurity_value}}%. Task: {{flag-oot.number}}."
  consumes:
    - type: http
      namespace: labdb
      baseUri: "https://gsk-lab-api.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.lab_db_token"
      resources:
        - name: stability
          path: "/stability/{{product_code}}/{{protocol_id}}/{{time_point}}"
          inputParameters:
            - name: product_code
              in: path
            - name: protocol_id
              in: path
            - name: time_point
              in: path
          operations:
            - name: get-stability-results
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches the safety database for adverse events matching a signal query, aggregates the results in Elasticsearch, creates a signal evaluation record in ServiceNow, and publishes a preliminary assessment to Confluence.

naftiko: "0.5"
info:
  label: "Drug Safety Signal Detection Pipeline"
  description: "Searches the safety database for adverse events matching a signal query, aggregates the results in Elasticsearch, creates a signal evaluation record in ServiceNow, and publishes a preliminary assessment to Confluence."
  tags:
    - pharmacovigilance
    - signal-detection
    - drug-safety
    - elasticsearch
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: signal-detection
      port: 8080
      tools:
        - name: evaluate-safety-signal
          description: "Given a product name and adverse event term, search the safety database, aggregate cases, create an evaluation record, and publish assessment to Confluence."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The GSK product or active ingredient name."
            - name: event_term
              in: body
              type: string
              description: "The MedDRA preferred term to investigate."
            - name: date_range_start
              in: body
              type: string
              description: "Start date for the search window (YYYY-MM-DD)."
            - name: date_range_end
              in: body
              type: string
              description: "End date for the search window (YYYY-MM-DD)."
          steps:
            - name: search-cases
              type: call
              call: "elasticsearch.search-safety"
              with:
                index: "safety-cases"
                product: "{{product_name}}"
                event: "{{event_term}}"
                from_date: "{{date_range_start}}"
                to_date: "{{date_range_end}}"
            - name: create-signal-record
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety Signal Evaluation: {{product_name}} — {{event_term}}"
                category: "safety_signal"
                assigned_group: "PV_Signal_Management"
                description: "Signal detected: {{event_term}} for {{product_name}}. Case count: {{search-cases.total_hits}}. Period: {{date_range_start}} to {{date_range_end}}."
            - name: publish-assessment
              type: call
              call: "confluence.create-page"
              with:
                space_key: "PV"
                title: "Signal Evaluation: {{product_name}} — {{event_term}} ({{date_range_start}})"
                body: "Product: {{product_name}}\nEvent: {{event_term}}\nCase Count: {{search-cases.total_hits}}\nPeriod: {{date_range_start}} to {{date_range_end}}\nServiceNow: {{create-signal-record.number}}\nStatus: Preliminary — Awaiting Medical Review"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://gsk-clinical-es.aws.gsk.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-safety
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.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: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Searches the clinical data lake in Elasticsearch for patient records matching a study ID and visit window. Returns aggregated result counts and matching document IDs.

naftiko: "0.5"
info:
  label: "Elasticsearch Clinical Data Search"
  description: "Searches the clinical data lake in Elasticsearch for patient records matching a study ID and visit window. Returns aggregated result counts and matching document IDs."
  tags:
    - clinical-trials
    - data
    - elasticsearch
    - search
capability:
  exposes:
    - type: mcp
      namespace: clinical-search
      port: 8080
      tools:
        - name: search-clinical-data
          description: "Search Elasticsearch clinical data index by study ID and optional visit window."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: visit_window
              in: body
              type: string
              description: "The visit window label (e.g. Week-12, Screening)."
          call: "elasticsearch.search-index"
          with:
            index: "clinical-edc-data"
            query_study: "{{study_id}}"
            query_visit: "{{visit_window}}"
          outputParameters:
            - name: total_hits
              type: number
              mapping: "$.hits.total.value"
            - name: documents
              type: array
              mapping: "$.hits.hits[*]._id"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://gsk-clinical-es.aws.gsk.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-index
              method: POST

Checks ES index at GSK.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at GSK."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at GSK."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.gsk.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Offboards employees at GSK via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at GSK via Okta, Slack, ServiceNow, and storage."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: offboard
          description: "Offboard employees at GSK."
          inputParameters:
            - name: emp_id
              in: body
              type: string
              description: "Employee ID."
            - name: last_day
              in: body
              type: string
              description: "Last day."
          steps:
            - name: disable
              type: call
              call: "okta.deactivate"
              with:
                user: "{{emp_id}}"
            - name: revoke
              type: call
              call: "slack.remove"
              with:
                user: "{{emp_id}}"
            - name: return
              type: call
              call: "servicenow.create-request"
              with:
                type: "return"
                emp: "{{emp_id}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                user: "{{emp_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gsk.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user}}/lifecycle/deactivate"
          inputParameters:
            - name: user
              in: path
          operations:
            - name: deactivate
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.remove"
          operations:
            - name: remove
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: storage
      baseUri: "https://storage.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

On new hire creation in Workday, provisions a ServiceNow onboarding ticket, creates a SharePoint folder for lab documentation, sends a Microsoft Teams welcome message, and grants GitLab access to research repositories.

naftiko: "0.5"
info:
  label: "Employee Onboarding for R&D Scientists"
  description: "On new hire creation in Workday, provisions a ServiceNow onboarding ticket, creates a SharePoint folder for lab documentation, sends a Microsoft Teams welcome message, and grants GitLab access to research repositories."
  tags:
    - hr
    - onboarding
    - r-and-d
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
    - gitlab
capability:
  exposes:
    - type: mcp
      namespace: rd-onboarding
      port: 8080
      tools:
        - name: onboard-rd-scientist
          description: "Given a Workday employee ID and start date, orchestrate R&D scientist onboarding across ServiceNow, SharePoint, Teams, and GitLab."
          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: lab_group
              in: body
              type: string
              description: "The R&D lab group the scientist 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: "R&D Onboarding: {{get-employee.full_name}} — {{lab_group}}"
                category: "rd_onboarding"
                assigned_group: "IT_RD_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{lab_group}}. Lab access, ELN provisioning, and instrument training required."
            - name: create-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "rd_lab_docs_site"
                folder_path: "Scientists/{{get-employee.full_name}}_{{start_date}}"
            - name: grant-gitlab
              type: call
              call: "gitlab.add-group-member"
              with:
                group_id: "{{lab_group}}"
                user_email: "{{get-employee.work_email}}"
                access_level: "30"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to GSK R&D, {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}. Lab docs: {{create-folder.url}}. GitLab access to {{lab_group}} has been provisioned."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.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: gitlab
      baseUri: "https://gitlab.gsk.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.gitlab_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              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

Handles a cleanroom environmental monitoring excursion by pulling sensor data, checking the affected batch in SAP, opening a ServiceNow investigation, and notifying quality and manufacturing teams in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Environmental Monitoring Excursion Handler"
  description: "Handles a cleanroom environmental monitoring excursion by pulling sensor data, checking the affected batch in SAP, opening a ServiceNow investigation, and notifying quality and manufacturing teams in Microsoft Teams."
  tags:
    - manufacturing
    - environmental-monitoring
    - gmp
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: em-excursion
      port: 8080
      tools:
        - name: handle-em-excursion
          description: "Given a cleanroom ID and excursion details, check the affected batch, open an investigation, and notify both quality and manufacturing."
          inputParameters:
            - name: cleanroom_id
              in: body
              type: string
              description: "The cleanroom identifier."
            - name: parameter_name
              in: body
              type: string
              description: "The EM parameter exceeded (Viable, Non-Viable, Temperature, Humidity, Differential-Pressure)."
            - name: measured_value
              in: body
              type: string
              description: "The measured excursion value."
            - name: batch_number
              in: body
              type: string
              description: "The batch being manufactured in the affected room."
          steps:
            - name: get-batch
              type: call
              call: "sap.get-batch"
              with:
                batch_number: "{{batch_number}}"
            - name: open-investigation
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "EM Excursion: {{cleanroom_id}} — {{parameter_name}}"
                category: "environmental_monitoring"
                priority: "2"
                assigned_group: "Quality_EM"
                description: "Cleanroom: {{cleanroom_id}}. Parameter: {{parameter_name}}. Value: {{measured_value}}. Active batch: {{batch_number}} ({{get-batch.material}}). Status: {{get-batch.status}}."
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-em-alerts"
                text: "EM Excursion in {{cleanroom_id}}: {{parameter_name}} = {{measured_value}}. Batch {{batch_number}} ({{get-batch.material}}). Incident: {{open-investigation.number}}."
            - name: notify-manufacturing
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "manufacturing-floor"
                text: "EM ALERT: {{cleanroom_id}} {{parameter_name}} excursion ({{measured_value}}). Batch {{batch_number}} may be impacted. Incident: {{open-investigation.number}}. Await QA guidance."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Audits expenses at GSK via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at GSK via Concur, compliance checks, and email."
  tags:
    - finance
    - travel
    - sap-concur
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit
          description: "Audit expenses at GSK."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Report ID."
          steps:
            - name: get
              type: call
              call: "concur.get-report"
              with:
                id: "{{report_id}}"
            - name: check
              type: call
              call: "compliance.check"
              with:
                expenses: "{{get.entries}}"
            - name: flag
              type: call
              call: "workflow.flag"
              with:
                id: "{{report_id}}"
                violations: "{{check.violations}}"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "{{get.approver}}"
                subject: "Expense {{report_id}} violations"
  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/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: policies
          path: "/check"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: reviews
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Analyzes feedback at GSK via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at GSK via surveys, AI sentiment, and Power BI."
  tags:
    - customer-experience
    - analytics
    - sentiment-analysis
capability:
  exposes:
    - type: mcp
      namespace: feedback
      port: 8080
      tools:
        - name: analyze
          description: "Analyze feedback at GSK."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "Survey ID."
          steps:
            - name: collect
              type: call
              call: "survey.get"
              with:
                id: "{{survey_id}}"
            - name: sentiment
              type: call
              call: "ai.analyze"
              with:
                text: "{{collect.responses}}"
            - name: themes
              type: call
              call: "ai.themes"
              with:
                data: "{{collect.responses}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cx"
  consumes:
    - type: http
      namespace: survey
      baseUri: "https://surveys.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Checks GitHub repo at GSK.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at GSK."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at GSK."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo."
            - name: branch
              in: body
              type: string
              description: "Branch."
          call: "github.get-branch"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
          outputParameters:
            - name: sha
              type: string
              mapping: "$.commit.sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/org/{{repo}}/branches/{{branch}}"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch
              method: GET

When a manufacturing deviation is detected, creates a ServiceNow deviation record, notifies the quality team in Microsoft Teams, looks up the affected batch in SAP, and logs the deviation in the Confluence quality log.

naftiko: "0.5"
info:
  label: "GMP Deviation Workflow"
  description: "When a manufacturing deviation is detected, creates a ServiceNow deviation record, notifies the quality team in Microsoft Teams, looks up the affected batch in SAP, and logs the deviation in the Confluence quality log."
  tags:
    - manufacturing
    - quality
    - gmp
    - servicenow
    - microsoft-teams
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: gmp-deviation
      port: 8080
      tools:
        - name: process-deviation
          description: "Given deviation details from the manufacturing floor, create a quality record, notify the quality team, retrieve the affected batch, and log to Confluence."
          inputParameters:
            - name: deviation_description
              in: body
              type: string
              description: "Description of the manufacturing deviation."
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number affected."
            - name: equipment_tag
              in: body
              type: string
              description: "The equipment tag where the deviation occurred."
            - name: severity
              in: body
              type: string
              description: "Deviation severity (Critical, Major, Minor)."
          steps:
            - name: get-batch
              type: call
              call: "sap.get-batch"
              with:
                batch_number: "{{batch_number}}"
            - name: create-deviation-record
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "GMP Deviation: {{equipment_tag}} — Batch {{batch_number}}"
                category: "gmp_deviation"
                priority: "{{severity}}"
                assigned_group: "Quality_Assurance"
                description: "{{deviation_description}}\nBatch: {{batch_number}} (Material: {{get-batch.material}}, Status: {{get-batch.status}})\nEquipment: {{equipment_tag}}\nSeverity: {{severity}}"
            - name: notify-quality
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "quality-deviations"
                text: "GMP Deviation ({{severity}}): {{equipment_tag}}, Batch {{batch_number}} ({{get-batch.material}}). ServiceNow: {{create-deviation-record.number}}. {{deviation_description}}"
            - name: log-to-confluence
              type: call
              call: "confluence.create-page"
              with:
                space_key: "QA"
                title: "Deviation {{create-deviation-record.number}} — {{batch_number}}"
                body: "Deviation: {{deviation_description}}\nSeverity: {{severity}}\nBatch: {{batch_number}}\nMaterial: {{get-batch.material}}\nEquipment: {{equipment_tag}}\nServiceNow: {{create-deviation-record.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Pulls vaccine campaign web analytics from Google Analytics, enriches with Salesforce campaign data, and publishes a performance summary to Confluence and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Analytics Vaccine Campaign Tracker"
  description: "Pulls vaccine campaign web analytics from Google Analytics, enriches with Salesforce campaign data, and publishes a performance summary to Confluence and Microsoft Teams."
  tags:
    - commercial
    - marketing
    - vaccines
    - google-analytics
    - salesforce
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vaccine-campaign
      port: 8080
      tools:
        - name: track-vaccine-campaign
          description: "Given a Google Analytics property ID and Salesforce campaign ID, pull web metrics, enrich with CRM data, and publish a summary."
          inputParameters:
            - name: ga_property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID."
            - name: date_range
              in: body
              type: string
              description: "Date range for analytics (e.g. last7days, last30days)."
          steps:
            - name: get-ga-metrics
              type: call
              call: "googleanalytics.get-report"
              with:
                property_id: "{{ga_property_id}}"
                date_range: "{{date_range}}"
            - name: get-campaign
              type: call
              call: "salesforce.get-campaign"
              with:
                campaign_id: "{{campaign_id}}"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "MKT"
                title: "Campaign Report: {{get-campaign.name}} — {{date_range}}"
                body: "Campaign: {{get-campaign.name}}\nSessions: {{get-ga-metrics.sessions}}\nConversions: {{get-ga-metrics.conversions}}\nBounce Rate: {{get-ga-metrics.bounce_rate}}%\nSalesforce Leads: {{get-campaign.number_of_leads}}"
            - name: notify-marketing
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "vaccine-marketing"
                text: "Campaign Update: {{get-campaign.name}}. Sessions: {{get-ga-metrics.sessions}}. Conversions: {{get-ga-metrics.conversions}}. Leads: {{get-campaign.number_of_leads}}."
  consumes:
    - type: http
      namespace: googleanalytics
      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: get-report
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gsk.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              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/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a regulatory guidance document from Google Drive by file ID. Returns file name, MIME type, download link, and last modified date for regulatory affairs reference.

naftiko: "0.5"
info:
  label: "Google Drive Regulatory Document Retrieval"
  description: "Retrieves a regulatory guidance document from Google Drive by file ID. Returns file name, MIME type, download link, and last modified date for regulatory affairs reference."
  tags:
    - regulatory
    - document-management
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: reg-docs-gdrive
      port: 8080
      tools:
        - name: get-regulatory-document
          description: "Retrieve a regulatory guidance document from Google Drive by file ID."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file ID."
          call: "gdrive.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: mime_type
              type: string
              mapping: "$.mimeType"
            - name: download_link
              type: string
              mapping: "$.webContentLink"
            - name: modified_time
              type: string
              mapping: "$.modifiedTime"
  consumes:
    - type: http
      namespace: gdrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files/{{file_id}}?fields=name,mimeType,webContentLink,modifiedTime"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Checks Grafana dashboard at GSK.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at GSK."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at GSK."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.gsk.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

Exports an audit trail from the GxP system for a specified date range, stores the export in Amazon S3, creates a ServiceNow tracking record, and notifies the compliance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GxP Audit Trail Export"
  description: "Exports an audit trail from the GxP system for a specified date range, stores the export in Amazon S3, creates a ServiceNow tracking record, and notifies the compliance team in Microsoft Teams."
  tags:
    - compliance
    - gxp
    - audit-trail
    - amazon-s3
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: audit-trail
      port: 8080
      tools:
        - name: export-audit-trail
          description: "Given a system name and date range, export the audit trail, store in S3, create a tracking record, and notify compliance."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "The GxP system name."
            - name: date_from
              in: body
              type: string
              description: "Start date (YYYY-MM-DD)."
            - name: date_to
              in: body
              type: string
              description: "End date (YYYY-MM-DD)."
          steps:
            - name: upload-to-s3
              type: call
              call: "s3.put-object"
              with:
                bucket: "gsk-gxp-audit-trails"
                key: "{{system_name}}/{{date_from}}_to_{{date_to}}.json"
            - name: create-tracking
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Audit Trail Export: {{system_name}} ({{date_from}} to {{date_to}})"
                description: "Audit trail exported for {{system_name}}. Period: {{date_from}} to {{date_to}}. S3 location: s3://gsk-gxp-audit-trails/{{system_name}}/{{date_from}}_to_{{date_to}}.json"
                assigned_group: "GxP_Compliance"
                category: "audit_trail"
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gxp-compliance"
                text: "Audit Trail Export: {{system_name}} ({{date_from}} to {{date_to}}). Stored in S3. Tracking: {{create-tracking.number}}."
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://gsk-gxp-audit-trails.s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a change control request is submitted, creates a ServiceNow change record, retrieves the impacted system owner from Workday, notifies the quality review board in Microsoft Teams, and archives the change request in SharePoint.

naftiko: "0.5"
info:
  label: "GxP Change Control Workflow"
  description: "When a change control request is submitted, creates a ServiceNow change record, retrieves the impacted system owner from Workday, notifies the quality review board in Microsoft Teams, and archives the change request in SharePoint."
  tags:
    - quality
    - gxp
    - change-control
    - servicenow
    - workday
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: change-control
      port: 8080
      tools:
        - name: submit-change-control
          description: "Given change control details, create a record, identify the system owner, notify the review board, and archive documentation."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "Title of the change control request."
            - name: change_description
              in: body
              type: string
              description: "Detailed description of the proposed change."
            - name: impacted_system
              in: body
              type: string
              description: "The name of the GxP system impacted."
            - name: system_owner_id
              in: body
              type: string
              description: "The Workday ID of the system owner."
            - name: risk_level
              in: body
              type: string
              description: "Risk level (High, Medium, Low)."
          steps:
            - name: get-system-owner
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{system_owner_id}}"
            - name: create-change-record
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{change_title}}"
                description: "{{change_description}}\nImpacted System: {{impacted_system}}\nSystem Owner: {{get-system-owner.full_name}}\nRisk Level: {{risk_level}}"
                assigned_group: "GxP_Change_Board"
                category: "gxp_change_control"
                risk: "{{risk_level}}"
            - name: notify-review-board
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gxp-change-review"
                text: "New Change Control: {{change_title}} ({{risk_level}} risk). System: {{impacted_system}}. Owner: {{get-system-owner.full_name}}. Record: {{create-change-record.number}}."
            - name: archive-request
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "quality_change_control_site"
                folder_path: "ChangeControls/{{create-change-record.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              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-file
              method: PUT

Executes a GxP system validation by triggering Azure DevOps test pipelines, collecting results, creating a validation summary in ServiceNow, and archiving evidence in SharePoint.

naftiko: "0.5"
info:
  label: "GxP Validation Protocol Executor"
  description: "Executes a GxP system validation by triggering Azure DevOps test pipelines, collecting results, creating a validation summary in ServiceNow, and archiving evidence in SharePoint."
  tags:
    - quality
    - gxp
    - validation
    - azure-devops
    - servicenow
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: gxp-validation
      port: 8080
      tools:
        - name: execute-validation
          description: "Given a validation protocol ID and system name, trigger test execution, collect results, and archive evidence."
          inputParameters:
            - name: protocol_id
              in: body
              type: string
              description: "The validation protocol identifier."
            - name: system_name
              in: body
              type: string
              description: "The GxP system under validation."
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps test pipeline definition ID."
          steps:
            - name: trigger-tests
              type: call
              call: "azuredevops.get-latest-run"
              with:
                pipeline_id: "{{pipeline_id}}"
            - name: create-validation-record
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "GxP Validation: {{system_name}} — {{protocol_id}}"
                description: "Test pipeline: {{pipeline_id}}. Result: {{trigger-tests.result}}. Started: {{trigger-tests.start_time}}. Triggered by: {{trigger-tests.triggered_by}}."
                assigned_group: "GxP_Validation"
                category: "system_validation"
            - name: archive-evidence
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "gxp_validation_site"
                folder_path: "Validations/{{system_name}}/{{protocol_id}}"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/gsk-pharma/GSK-R&D/_apis"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azuredevops_pat"
      resources:
        - name: builds
          path: "/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: get-latest-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - 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-file
              method: PUT

When a healthcare professional submits a medical information request, logs it in Salesforce, retrieves the relevant product monograph from SharePoint, creates a ServiceNow case for medical affairs review, and responds via Microsoft Teams.

naftiko: "0.5"
info:
  label: "HCP Medical Information Request Orchestrator"
  description: "When a healthcare professional submits a medical information request, logs it in Salesforce, retrieves the relevant product monograph from SharePoint, creates a ServiceNow case for medical affairs review, and responds via Microsoft Teams."
  tags:
    - medical-affairs
    - hcp-engagement
    - salesforce
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: medinfo-request
      port: 8080
      tools:
        - name: process-medinfo-request
          description: "Given an HCP ID and product/question details, log the request, pull the product monograph, create a review case, and notify the medical affairs team."
          inputParameters:
            - name: hcp_id
              in: body
              type: string
              description: "The Salesforce HCP contact ID."
            - name: product_name
              in: body
              type: string
              description: "The GSK product name."
            - name: question
              in: body
              type: string
              description: "The medical information question."
          steps:
            - name: get-hcp
              type: call
              call: "salesforce.get-contact"
              with:
                hcp_id: "{{hcp_id}}"
            - name: get-monograph
              type: call
              call: "sharepoint.get-document"
              with:
                site_id: "medical_affairs_site"
                file_path: "ProductMonographs/{{product_name}}/monograph_current.pdf"
            - name: create-review-case
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "MedInfo Request: {{product_name}} — {{get-hcp.name}}"
                description: "HCP: {{get-hcp.name}} ({{get-hcp.specialty}})\nProduct: {{product_name}}\nQuestion: {{question}}\nMonograph: {{get-monograph.document_url}}"
                assigned_group: "Medical_Affairs"
                category: "medical_information"
            - name: notify-medaffairs
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "medical-information"
                text: "New MedInfo Request from {{get-hcp.name}} ({{get-hcp.specialty}}) re: {{product_name}}. Case: {{create-review-case.number}}. Question: {{question}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gsk.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{hcp_id}}"
          inputParameters:
            - name: hcp_id
              in: path
          operations:
            - name: get-contact
              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:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Escalates IT incidents at GSK via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at GSK via ServiceNow, PagerDuty, and Slack."
  tags:
    - incident-management
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate incidents at GSK."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: page
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{get-incident.description}}"
                urgency: "{{severity}}"
            - name: channel
              type: call
              call: "slack.create-channel"
              with:
                name: "inc-{{incident_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#inc-{{incident_id}}"
                text: "P{{severity}}: {{get-incident.description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Retrieves sprint progress at GSK.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at GSK."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at GSK."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Project key."
          call: "jira.get-sprints"
          with:
            project: "{{project_key}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/1/sprint"
          operations:
            - name: get-sprints
              method: GET

Maintains KB at GSK by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at GSK by finding stale articles and notifying owners."
  tags:
    - knowledge-management
    - confluence
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: kb-maint
      port: 8080
      tools:
        - name: maintain-kb
          description: "Maintain KB at GSK."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "Confluence space."
            - name: stale_days
              in: body
              type: number
              description: "Days threshold."
          steps:
            - name: find
              type: call
              call: "confluence.search-stale"
              with:
                space: "{{space}}"
                days: "{{stale_days}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{find.owners}}"
                subject: "KB review needed"
            - name: flag
              type: call
              call: "confluence.add-label"
              with:
                pages: "{{find.ids}}"
                label: "needs-review"
            - name: report
              type: call
              call: "slack.post-message"
              with:
                channel: "#kb"
                text: "KB: {{find.count}} stale articles"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gsk.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search-stale
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Provisions clinical trial portal access for an external investigator by creating a Keycloak user, assigning study-specific roles, and notifying the clinical operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Keycloak Clinical Portal Access Provisioning"
  description: "Provisions clinical trial portal access for an external investigator by creating a Keycloak user, assigning study-specific roles, and notifying the clinical operations team in Microsoft Teams."
  tags:
    - identity
    - clinical-trials
    - keycloak
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-access
      port: 8080
      tools:
        - name: provision-portal-access
          description: "Given an investigator email and study ID, create a Keycloak account with the appropriate role and notify clinical ops."
          inputParameters:
            - name: investigator_email
              in: body
              type: string
              description: "The investigator email address."
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: role
              in: body
              type: string
              description: "The portal role (Investigator, Sub-Investigator, Study-Coordinator)."
          steps:
            - name: create-user
              type: call
              call: "keycloak.create-user"
              with:
                realm: "clinical-portal"
                email: "{{investigator_email}}"
                role: "{{study_id}}-{{role}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical-operations"
                text: "Portal access provisioned: {{investigator_email}} as {{role}} for study {{study_id}}. Keycloak user: {{create-user.user_id}}."
  consumes:
    - type: http
      namespace: keycloak
      baseUri: "https://gsk-auth.internal.gsk.com/auth/admin/realms"
      authentication:
        type: bearer
        token: "$secrets.keycloak_admin_token"
      resources:
        - name: users
          path: "/{{realm}}/users"
          inputParameters:
            - name: realm
              in: path
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates KPI digest at GSK from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at GSK from Snowflake, Oracle, Power BI, and email."
  tags:
    - reporting
    - kpi
    - snowflake
    - executive
capability:
  exposes:
    - type: mcp
      namespace: kpi-digest
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate KPI digest at GSK."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Week ending."
            - name: dist
              in: body
              type: string
              description: "Distribution list."
          steps:
            - name: ops
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM kpis WHERE w='{{week}}'"
            - name: fin
              type: call
              call: "oracle.get-summary"
              with:
                period: "{{week}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "exec_kpis"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "{{dist}}"
                subject: "KPIs - {{week}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://gsk.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/summary"
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks K8s pod health at GSK.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at GSK."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at GSK."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

Checks license compliance at GSK via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at GSK via scanning, entitlements, and procurement."
  tags:
    - compliance
    - licensing
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: license-comp
      port: 8080
      tools:
        - name: check-licenses
          description: "Check license compliance at GSK."
          inputParameters:
            - name: software
              in: body
              type: string
              description: "Software."
            - name: vendor
              in: body
              type: string
              description: "Vendor."
          steps:
            - name: scan
              type: call
              call: "assets.installations"
              with:
                sw: "{{software}}"
            - name: entitlements
              type: call
              call: "licenses.get"
              with:
                sw: "{{software}}"
            - name: flag
              type: call
              call: "compliance.flag"
              with:
                installed: "{{scan.count}}"
                entitled: "{{entitlements.count}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "license"
                sw: "{{software}}"
  consumes:
    - type: http
      namespace: assets
      baseUri: "https://assets.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: installations
          path: "/installations"
          operations:
            - name: installations
              method: GET
    - type: http
      namespace: licenses
      baseUri: "https://licenses.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.license_token"
      resources:
        - name: ent
          path: "/entitlements"
          operations:
            - name: get
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: overages
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Queries SAP for upcoming preventive maintenance schedules, checks Datadog for current equipment health, opens a ServiceNow work order, and notifies the maintenance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Manufacturing Equipment Maintenance Scheduler"
  description: "Queries SAP for upcoming preventive maintenance schedules, checks Datadog for current equipment health, opens a ServiceNow work order, and notifies the maintenance team in Microsoft Teams."
  tags:
    - manufacturing
    - maintenance
    - sap
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: equipment-maintenance
      port: 8080
      tools:
        - name: schedule-maintenance
          description: "Given an equipment tag and maintenance type, check current health, create a work order, and notify the maintenance team."
          inputParameters:
            - name: equipment_tag
              in: body
              type: string
              description: "The equipment tag identifier."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance (Preventive, Corrective, Calibration)."
            - name: scheduled_date
              in: body
              type: string
              description: "The scheduled maintenance date (YYYY-MM-DD)."
          steps:
            - name: get-equipment-health
              type: call
              call: "datadog.get-service-metrics"
              with:
                service_name: "{{equipment_tag}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "{{maintenance_type}} Maintenance: {{equipment_tag}}"
                description: "Scheduled: {{scheduled_date}}. Current availability: {{get-equipment-health.availability_pct}}%. Active alerts: {{get-equipment-health.active_alerts}}."
                assigned_group: "Manufacturing_Maintenance"
                category: "equipment_maintenance"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "mfg-maintenance"
                text: "{{maintenance_type}} maintenance scheduled for {{equipment_tag}} on {{scheduled_date}}. Health: {{get-equipment-health.availability_pct}}%. Work order: {{create-work-order.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: metrics
          path: "/query?query=avg:system.cpu.idle{{service:{{service_name}}}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks GMP training compliance by querying the training system, identifying overdue employees in Workday, creating a ServiceNow compliance case, and sending reminder notifications in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Microsoft Power Automate GMP Training Compliance"
  description: "Checks GMP training compliance by querying the training system, identifying overdue employees in Workday, creating a ServiceNow compliance case, and sending reminder notifications in Microsoft Teams."
  tags:
    - compliance
    - training
    - gmp
    - microsoft-power-automate
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given a training course ID and department, identify employees overdue on GMP training and trigger compliance actions."
          inputParameters:
            - name: course_id
              in: body
              type: string
              description: "The GMP training course identifier."
            - name: department
              in: body
              type: string
              description: "The department to check."
            - name: due_date_threshold
              in: body
              type: string
              description: "The due date threshold (YYYY-MM-DD)."
          steps:
            - name: get-overdue-list
              type: call
              call: "trainingdb.get-overdue"
              with:
                course_id: "{{course_id}}"
                department: "{{department}}"
                threshold: "{{due_date_threshold}}"
            - name: create-compliance-case
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "GMP Training Overdue: {{course_id}} — {{department}}"
                description: "Course: {{course_id}}. Department: {{department}}. Overdue count: {{get-overdue-list.overdue_count}}. Threshold: {{due_date_threshold}}."
                assigned_group: "Quality_Training"
                category: "training_compliance"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gmp-training"
                text: "GMP Training Alert: {{get-overdue-list.overdue_count}} employees in {{department}} are overdue on course {{course_id}}. Compliance case: {{create-compliance-case.number}}. Deadline: {{due_date_threshold}}."
  consumes:
    - type: http
      namespace: trainingdb
      baseUri: "https://gsk-training.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.training_db_token"
      resources:
        - name: overdue
          path: "/courses/{{course_id}}/overdue?department={{department}}&threshold={{threshold}}"
          inputParameters:
            - name: course_id
              in: path
            - name: department
              in: path
            - name: threshold
              in: path
          operations:
            - name: get-overdue
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates monthly security reports at GSK from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at GSK from Splunk and Qualys."
  tags:
    - security
    - reporting
    - splunk
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-report
      port: 8080
      tools:
        - name: gen-sec-report
          description: "Generate security report at GSK."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "Month."
          steps:
            - name: splunk
              type: call
              call: "splunk.search"
              with:
                query: "index=security earliest=-30d"
            - name: scans
              type: call
              call: "qualys.results"
              with:
                month: "{{month}}"
            - name: compile
              type: call
              call: "analytics.compile-security"
              with:
                events: "{{splunk.count}}"
                vulns: "{{scans.critical}}"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "ciso@co.com"
                subject: "Security - {{month}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.gsk.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: results
          path: "/fo/scan/results"
          operations:
            - name: results
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: security
          path: "/compile"
          operations:
            - name: compile-security
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Onboards employees at GSK with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at GSK with Okta, ServiceNow, Slack, and calendar."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Onboard employees at GSK."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Name."
            - name: dept
              in: body
              type: string
              description: "Department."
            - name: start
              in: body
              type: string
              description: "Start date."
          steps:
            - name: okta
              type: call
              call: "okta.create-user"
              with:
                name: "{{name}}"
                department: "{{dept}}"
            - name: equip
              type: call
              call: "servicenow.create-request"
              with:
                type: "new_hire"
                for: "{{name}}"
            - name: slack
              type: call
              call: "slack.invite"
              with:
                email: "{{okta.email}}"
            - name: orient
              type: call
              call: "calendar.create-event"
              with:
                title: "Orientation - {{name}}"
                date: "{{start}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gsk.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.invite"
          operations:
            - name: invite
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/hr/events"
          operations:
            - name: create-event
              method: POST

Checks New Relic APM at GSK.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at GSK."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at GSK."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Checks Okta user at GSK.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at GSK."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at GSK."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gsk.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Queries Oracle Cloud inventory for current on-hand quantity of a pharmaceutical material at a specified warehouse location.

naftiko: "0.5"
info:
  label: "Oracle Cloud Inventory Level Check"
  description: "Queries Oracle Cloud inventory for current on-hand quantity of a pharmaceutical material at a specified warehouse location."
  tags:
    - supply-chain
    - inventory
    - oracle-cloud
    - warehouse
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-inventory-level
          description: "Check on-hand inventory for a material at a given warehouse in Oracle Cloud."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material or item number."
            - name: warehouse_code
              in: body
              type: string
              description: "The warehouse or plant code."
          call: "oracle.get-onhand"
          with:
            material_number: "{{material_number}}"
            warehouse_code: "{{warehouse_code}}"
          outputParameters:
            - name: on_hand_qty
              type: number
              mapping: "$.items[0].OnhandQuantity"
            - name: uom
              type: string
              mapping: "$.items[0].UOMCode"
            - name: lot_number
              type: string
              mapping: "$.items[0].LotNumber"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://gsk-cloud.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: inventory
          path: "/inventoryOnhandBalances?q=ItemNumber={{material_number}};Subinventory={{warehouse_code}}"
          inputParameters:
            - name: material_number
              in: path
            - name: warehouse_code
              in: path
          operations:
            - name: get-onhand
              method: GET

Checks on-call at GSK.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at GSK."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at GSK."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Processes an Individual Case Safety Report by creating the case in the safety database, submitting to the regulatory gateway, notifying the PV team in Microsoft Teams, and logging the submission in ServiceNow.

naftiko: "0.5"
info:
  label: "Pharmacovigilance ICSR Expedited Reporting"
  description: "Processes an Individual Case Safety Report by creating the case in the safety database, submitting to the regulatory gateway, notifying the PV team in Microsoft Teams, and logging the submission in ServiceNow."
  tags:
    - pharmacovigilance
    - icsr
    - regulatory
    - drug-safety
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: icsr-reporting
      port: 8080
      tools:
        - name: submit-expedited-icsr
          description: "Given ICSR details, create a safety case, submit to the regulatory gateway, notify the PV team, and log the submission."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The safety database case ID."
            - name: regulatory_authority
              in: body
              type: string
              description: "Target regulatory authority (FDA, EMA, MHRA)."
            - name: report_type
              in: body
              type: string
              description: "Report type (Initial, Follow-Up, Final)."
            - name: due_date
              in: body
              type: string
              description: "Regulatory reporting due date (YYYY-MM-DD)."
          steps:
            - name: get-case
              type: call
              call: "safetydb.get-case"
              with:
                case_id: "{{case_id}}"
            - name: submit-to-gateway
              type: call
              call: "reggateway.submit-icsr"
              with:
                case_id: "{{case_id}}"
                authority: "{{regulatory_authority}}"
                report_type: "{{report_type}}"
            - name: log-submission
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "ICSR Submitted: {{case_id}} to {{regulatory_authority}}"
                description: "Case: {{case_id}}. Product: {{get-case.suspect_product}}. Seriousness: {{get-case.seriousness}}. Report type: {{report_type}}. Due: {{due_date}}. Gateway ID: {{submit-to-gateway.submission_id}}."
                assigned_group: "PV_Regulatory_Reporting"
                category: "icsr_submission"
            - name: notify-pv
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "pv-expedited-reports"
                text: "ICSR Submitted: Case {{case_id}} ({{get-case.suspect_product}}, {{get-case.seriousness}}) — {{report_type}} to {{regulatory_authority}}. Gateway: {{submit-to-gateway.submission_id}}. Due: {{due_date}}."
  consumes:
    - type: http
      namespace: safetydb
      baseUri: "https://gsk-safety.veeva.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_safety_token"
      resources:
        - name: cases
          path: "/objects/adverse_event/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: reggateway
      baseUri: "https://gsk-regulatory-gateway.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reg_gateway_token"
      resources:
        - name: submissions
          path: "/icsr/submit"
          operations:
            - name: submit-icsr
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks Pluralsight skills assessment completion for GxP-required competencies, cross-references with the employee record in Workday, flags non-compliant staff in ServiceNow, and notifies department managers in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight GxP Skills Compliance Orchestrator"
  description: "Checks Pluralsight skills assessment completion for GxP-required competencies, cross-references with the employee record in Workday, flags non-compliant staff in ServiceNow, and notifies department managers in Microsoft Teams."
  tags:
    - compliance
    - training
    - gxp
    - pluralsight
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: skills-compliance
      port: 8080
      tools:
        - name: check-skills-compliance
          description: "Given a Pluralsight channel ID and department, check skill assessment completion for GxP roles and flag non-compliant staff."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The Pluralsight channel ID for the GxP skill path."
            - name: department
              in: body
              type: string
              description: "The department to audit."
            - name: minimum_score
              in: body
              type: number
              description: "The minimum passing score percentage."
          steps:
            - name: get-channel-analytics
              type: call
              call: "pluralsight.get-channel-analytics"
              with:
                channel_id: "{{channel_id}}"
                department: "{{department}}"
            - name: create-compliance-case
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "GxP Skills Audit: {{department}} — Pluralsight Channel {{channel_id}}"
                description: "Department: {{department}}. Enrolled: {{get-channel-analytics.enrolled_count}}. Completed: {{get-channel-analytics.completed_count}}. Below minimum ({{minimum_score}}%): {{get-channel-analytics.below_threshold_count}}."
                assigned_group: "Quality_Training"
                category: "skills_compliance"
            - name: notify-managers
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gxp-training"
                text: "GxP Skills Audit: {{department}}. Enrolled: {{get-channel-analytics.enrolled_count}}. Completed: {{get-channel-analytics.completed_count}}. Non-compliant: {{get-channel-analytics.below_threshold_count}}. Case: {{create-compliance-case.number}}."
  consumes:
    - type: http
      namespace: pluralsight
      baseUri: "https://app.pluralsight.com/plans/api/reports/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: channels
          path: "/channels/{{channel_id}}/analytics?department={{department}}"
          inputParameters:
            - name: channel_id
              in: path
            - name: department
              in: path
          operations:
            - name: get-channel-analytics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries the clinical metadata repository in PostgreSQL for study configuration details including endpoints, arms, and visit schedule.

naftiko: "0.5"
info:
  label: "PostgreSQL Clinical Metadata Query"
  description: "Queries the clinical metadata repository in PostgreSQL for study configuration details including endpoints, arms, and visit schedule."
  tags:
    - clinical-trials
    - data
    - postgresql
    - metadata
capability:
  exposes:
    - type: mcp
      namespace: clinical-metadata
      port: 8080
      tools:
        - name: get-study-metadata
          description: "Retrieve clinical study metadata from the PostgreSQL metadata repository."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
          call: "clinicalmeta.get-study"
          with:
            study_id: "{{study_id}}"
          outputParameters:
            - name: study_title
              type: string
              mapping: "$.study_title"
            - name: phase
              type: string
              mapping: "$.phase"
            - name: primary_endpoint
              type: string
              mapping: "$.primary_endpoint"
            - name: enrollment_target
              type: number
              mapping: "$.target_enrollment"
  consumes:
    - type: http
      namespace: clinicalmeta
      baseUri: "https://gsk-clinical-meta.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.clinical_meta_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: get-study
              method: GET

Creates postmortems at GSK.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at GSK."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at GSK."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gsk.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Checks Power BI refresh at GSK.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at GSK."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at GSK."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Queries Prometheus for active alerts on GMP manufacturing equipment by equipment tag. Returns alert names, severity, and duration.

naftiko: "0.5"
info:
  label: "Prometheus GMP Equipment Alert Query"
  description: "Queries Prometheus for active alerts on GMP manufacturing equipment by equipment tag. Returns alert names, severity, and duration."
  tags:
    - manufacturing
    - monitoring
    - prometheus
    - equipment
capability:
  exposes:
    - type: mcp
      namespace: mfg-alerts
      port: 8080
      tools:
        - name: get-equipment-alerts
          description: "Retrieve active Prometheus alerts for a specific manufacturing equipment tag."
          inputParameters:
            - name: equipment_tag
              in: body
              type: string
              description: "The equipment tag identifier (e.g. BIOREACTOR-01)."
          call: "prometheus.get-alerts"
          with:
            equipment_tag: "{{equipment_tag}}"
          outputParameters:
            - name: alert_count
              type: number
              mapping: "$.data.alerts.length"
            - name: alerts
              type: array
              mapping: "$.data.alerts[*].labels.alertname"
  consumes:
    - type: http
      namespace: prometheus
      baseUri: "https://gsk-prometheus.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: alerts
          path: "/alerts?filter=equipment={{equipment_tag}}"
          inputParameters:
            - name: equipment_tag
              in: path
          operations:
            - name: get-alerts
              method: GET

Triggers a Qlik Sense report reload for clinical trial analytics, retrieves the output, and publishes the report link to Confluence and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Qlik Sense Clinical Analytics Report Generation"
  description: "Triggers a Qlik Sense report reload for clinical trial analytics, retrieves the output, and publishes the report link to Confluence and Microsoft Teams."
  tags:
    - analytics
    - clinical-trials
    - qlik-sense
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-analytics
      port: 8080
      tools:
        - name: generate-clinical-report
          description: "Given a Qlik Sense app ID and study ID, trigger a report reload and publish the results."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik Sense application ID."
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier for filtering."
          steps:
            - name: reload-app
              type: call
              call: "qliksense.reload-app"
              with:
                app_id: "{{app_id}}"
            - name: publish-to-confluence
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CDM"
                title: "Clinical Analytics: {{study_id}} — Refreshed"
                body: "Qlik Sense report for study {{study_id}} has been refreshed.\nApp ID: {{app_id}}\nReload status: {{reload-app.status}}\nLast reload: {{reload-app.end_time}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "clinical-analytics"
                text: "Clinical analytics report refreshed for {{study_id}}. Qlik app: {{app_id}}. Status: {{reload-app.status}}."
  consumes:
    - type: http
      namespace: qliksense
      baseUri: "https://gsk-qlik.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qliksense_token"
      resources:
        - name: apps
          path: "/apps/{{app_id}}/reloads"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: reload-app
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              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/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates compliance reports at GSK from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at GSK from Snowflake, Power BI, and email."
  tags:
    - compliance
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: compliance-rpt
      port: 8080
      tools:
        - name: gen-report
          description: "Generate compliance reports at GSK."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: type
              in: body
              type: string
              description: "Type."
          steps:
            - name: data
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
            - name: metrics
              type: call
              call: "analytics.compute"
              with:
                data: "{{data.results}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "compliance"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "compliance@co.com"
                subject: "{{type}} - {{quarter}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://gsk.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: metrics
          path: "/compute"
          operations:
            - name: compute
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Ingests experiment results from the lab data system via Apache NiFi, validates data quality with SonarQube scanning rules, stores processed results in PostgreSQL, and notifies the research lead in Microsoft Teams.

naftiko: "0.5"
info:
  label: "R&D Experiment Data Pipeline"
  description: "Ingests experiment results from the lab data system via Apache NiFi, validates data quality with SonarQube scanning rules, stores processed results in PostgreSQL, and notifies the research lead in Microsoft Teams."
  tags:
    - r-and-d
    - data-pipeline
    - apache-nifi
    - sonarqube
    - postgresql
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rd-data-pipeline
      port: 8080
      tools:
        - name: ingest-experiment-data
          description: "Given an experiment ID and data source, trigger the NiFi ingestion flow, validate data, store results, and notify the research lead."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "The unique experiment identifier."
            - name: data_source_uri
              in: body
              type: string
              description: "The URI of the raw experiment data file."
            - name: research_lead_email
              in: body
              type: string
              description: "The email of the research lead to notify."
          steps:
            - name: trigger-ingestion
              type: call
              call: "nifi.trigger-flow"
              with:
                processor_group_id: "experiment-ingestion"
                experiment_id: "{{experiment_id}}"
                source_uri: "{{data_source_uri}}"
            - name: store-results
              type: call
              call: "labdb.insert-results"
              with:
                experiment_id: "{{experiment_id}}"
                flow_id: "{{trigger-ingestion.flow_file_id}}"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{research_lead_email}}"
                text: "Experiment {{experiment_id}} data ingested successfully. Records stored: {{store-results.row_count}}. Flow: {{trigger-ingestion.flow_file_id}}."
  consumes:
    - type: http
      namespace: nifi
      baseUri: "https://gsk-nifi.internal.gsk.com/nifi-api"
      authentication:
        type: bearer
        token: "$secrets.nifi_token"
      resources:
        - name: process-groups
          path: "/process-groups/{{processor_group_id}}/process-groups"
          inputParameters:
            - name: processor_group_id
              in: path
          operations:
            - name: trigger-flow
              method: POST
    - type: http
      namespace: labdb
      baseUri: "https://gsk-lab-api.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.lab_db_token"
      resources:
        - name: results
          path: "/experiments/{{experiment_id}}/results"
          inputParameters:
            - name: experiment_id
              in: path
          operations:
            - name: insert-results
              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

Checks Redis at GSK.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at GSK."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at GSK."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

Tracks an IND amendment by pulling submission details from the regulatory database, notifying the regulatory affairs team in Microsoft Teams, creating a tracking entry in ServiceNow, and updating the Confluence regulatory timeline.

naftiko: "0.5"
info:
  label: "Regulatory IND Amendment Tracker"
  description: "Tracks an IND amendment by pulling submission details from the regulatory database, notifying the regulatory affairs team in Microsoft Teams, creating a tracking entry in ServiceNow, and updating the Confluence regulatory timeline."
  tags:
    - regulatory
    - ind
    - amendments
    - servicenow
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ind
      port: 8080
      tools:
        - name: track-ind-amendment
          description: "Given an IND number and amendment details, create tracking records and notify the regulatory team."
          inputParameters:
            - name: ind_number
              in: body
              type: string
              description: "The IND application number."
            - name: amendment_type
              in: body
              type: string
              description: "The type of amendment (Protocol, Safety Report, CMC)."
            - name: amendment_description
              in: body
              type: string
              description: "Description of the amendment content."
            - name: target_submission_date
              in: body
              type: string
              description: "Target submission date (YYYY-MM-DD)."
          steps:
            - name: create-tracking
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "IND Amendment: {{ind_number}} — {{amendment_type}}"
                description: "{{amendment_description}}\nTarget submission: {{target_submission_date}}"
                assigned_group: "Regulatory_Affairs"
                category: "regulatory_amendment"
            - name: notify-reg-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory-affairs"
                text: "IND Amendment: {{ind_number}} ({{amendment_type}}). Target: {{target_submission_date}}. Tracking: {{create-tracking.number}}. {{amendment_description}}"
            - name: update-timeline
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REG"
                title: "IND {{ind_number}} Amendment — {{amendment_type}} ({{target_submission_date}})"
                body: "IND: {{ind_number}}\nAmendment Type: {{amendment_type}}\nDescription: {{amendment_description}}\nTarget Date: {{target_submission_date}}\nTracking: {{create-tracking.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Assembles a regulatory submission package by pulling the latest protocol from SharePoint, the study metadata from the clinical metadata repository, and publishing a summary to Confluence for reviewer sign-off.

naftiko: "0.5"
info:
  label: "Regulatory Submission Document Assembly"
  description: "Assembles a regulatory submission package by pulling the latest protocol from SharePoint, the study metadata from the clinical metadata repository, and publishing a summary to Confluence for reviewer sign-off."
  tags:
    - regulatory
    - submission
    - sharepoint
    - confluence
    - clinical-trials
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submission
      port: 8080
      tools:
        - name: assemble-submission-package
          description: "Given a study ID and submission type, gather protocol, study metadata, and publish a regulatory submission summary to Confluence."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier."
            - name: submission_type
              in: body
              type: string
              description: "The type of regulatory submission (IND, NDA, BLA, sNDA)."
          steps:
            - name: get-protocol
              type: call
              call: "sharepoint.get-document"
              with:
                site_id: "clinical_trials_site"
                file_path: "Protocols/{{study_id}}/protocol_latest.pdf"
            - name: get-study-meta
              type: call
              call: "clinicalmeta.get-study"
              with:
                study_id: "{{study_id}}"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REG"
                title: "{{submission_type}} Submission Summary — {{study_id}}"
                body: "Study: {{get-study-meta.study_title}}\nPhase: {{get-study-meta.phase}}\nPrimary Endpoint: {{get-study-meta.primary_endpoint}}\nProtocol: {{get-protocol.document_url}}\nTarget Enrollment: {{get-study-meta.enrollment_target}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: clinicalmeta
      baseUri: "https://gsk-clinical-meta.internal.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.clinical_meta_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: get-study
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Checks release readiness at GSK.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at GSK."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at GSK."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/gsk.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.gsk.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gsk.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves a healthcare professional contact record from Salesforce CRM including engagement history, territory, and last interaction date.

naftiko: "0.5"
info:
  label: "Salesforce HCP Engagement Lookup"
  description: "Retrieves a healthcare professional contact record from Salesforce CRM including engagement history, territory, and last interaction date."
  tags:
    - commercial
    - hcp-engagement
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: hcp-crm
      port: 8080
      tools:
        - name: get-hcp-record
          description: "Look up a healthcare professional record in Salesforce by HCP ID."
          inputParameters:
            - name: hcp_id
              in: body
              type: string
              description: "The Salesforce HCP contact ID."
          call: "salesforce.get-contact"
          with:
            hcp_id: "{{hcp_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: specialty
              type: string
              mapping: "$.Specialty__c"
            - name: territory
              type: string
              mapping: "$.Territory__c"
            - name: last_interaction
              type: string
              mapping: "$.Last_Interaction_Date__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gsk.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{hcp_id}}"
          inputParameters:
            - name: hcp_id
              in: path
          operations:
            - name: get-contact
              method: GET

Retrieves a manufacturing batch record from SAP S/4HANA by batch number. Returns batch status, production date, material, and quantity for GMP compliance checks.

naftiko: "0.5"
info:
  label: "SAP Batch Record Lookup"
  description: "Retrieves a manufacturing batch record from SAP S/4HANA by batch number. Returns batch status, production date, material, and quantity for GMP compliance checks."
  tags:
    - manufacturing
    - gmp
    - sap
    - batch-record
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-batch
      port: 8080
      tools:
        - name: get-batch-record
          description: "Look up a manufacturing batch record by batch number in SAP. Returns status, material, production date, and quantity."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number (10-digit)."
          call: "sap.get-batch"
          with:
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.BatchStatus"
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: production_date
              type: string
              mapping: "$.d.ProductionDate"
            - name: quantity
              type: string
              mapping: "$.d.TotalQuantity"
            - name: uom
              type: string
              mapping: "$.d.UnitOfMeasure"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET

Checks SAP PO at GSK.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at GSK."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at GSK."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.order.vendor"
            - name: status
              type: string
              mapping: "$.order.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for supply chain visibility.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for supply chain visibility."
  tags:
    - supply-chain
    - procurement
    - sap
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-po
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns status, vendor, value, 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://gsk-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Remediates vulnerabilities at GSK via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at GSK via scanning, Jira, and Slack."
  tags:
    - security
    - vulnerability-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-fix
      port: 8080
      tools:
        - name: remediate
          description: "Fix vulnerabilities at GSK."
          inputParameters:
            - name: target
              in: body
              type: string
              description: "Target."
            - name: policy
              in: body
              type: string
              description: "Policy."
          steps:
            - name: scan
              type: call
              call: "qualys.scan"
              with:
                target: "{{target}}"
                policy: "{{policy}}"
            - name: prioritize
              type: call
              call: "security.prioritize"
              with:
                scan: "{{scan.id}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Vulns: {{prioritize.critical}} critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Scan: {{prioritize.critical}} critical"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: scans
          path: "/fo/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: security
      baseUri: "https://security.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: vulns
          path: "/prioritize"
          operations:
            - name: prioritize
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gsk.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a GxP-classified incident from ServiceNow by incident number. Returns priority, assignment group, state, and GxP impact assessment.

naftiko: "0.5"
info:
  label: "ServiceNow GxP Incident Lookup"
  description: "Retrieves a GxP-classified incident from ServiceNow by incident number. Returns priority, assignment group, state, and GxP impact assessment."
  tags:
    - quality
    - gxp
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: quality-incidents
      port: 8080
      tools:
        - name: get-gxp-incident
          description: "Look up a GxP incident in ServiceNow by incident number."
          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: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
            - name: gxp_impact
              type: string
              mapping: "$.result.u_gxp_impact"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.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: path
          operations:
            - name: get-incident
              method: GET

Checks IT incident in ServiceNow for GSK.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for GSK."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at GSK."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Retrieves SharePoint metadata at GSK.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at GSK."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at GSK."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at GSK via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at GSK via Datadog and Slack."
  tags:
    - operations
    - sla
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sla-monitor
      port: 8080
      tools:
        - name: check-sla
          description: "Monitor SLAs at GSK."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: target
              in: body
              type: number
              description: "SLA target %."
          steps:
            - name: metrics
              type: call
              call: "datadog.get-sla"
              with:
                service: "{{service}}"
            - name: check
              type: call
              call: "analytics.check-sla"
              with:
                uptime: "{{metrics.uptime}}"
                target: "{{target}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#ops"
                text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
            - name: log
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "SLA breach: {{service}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/metrics"
          operations:
            - name: get-sla
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks SonarQube code quality gate status for a GxP application, creates a ServiceNow compliance record if the gate fails, and notifies the development team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SonarQube GxP Code Quality Gate"
  description: "Checks SonarQube code quality gate status for a GxP application, creates a ServiceNow compliance record if the gate fails, and notifies the development team in Microsoft Teams."
  tags:
    - devops
    - code-quality
    - gxp
    - sonarqube
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: check-quality-gate
          description: "Given a SonarQube project key, check the quality gate status, and if failed, create a compliance record and notify the team."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
            - name: application_name
              in: body
              type: string
              description: "The GxP application name."
          steps:
            - name: get-gate-status
              type: call
              call: "sonarqube.get-quality-gate"
              with:
                project_key: "{{project_key}}"
            - name: create-compliance-record
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Code Quality Gate: {{application_name}} — {{get-gate-status.status}}"
                description: "SonarQube project: {{project_key}}. Gate status: {{get-gate-status.status}}. Bugs: {{get-gate-status.bugs}}. Vulnerabilities: {{get-gate-status.vulnerabilities}}. Code smells: {{get-gate-status.code_smells}}."
                assigned_group: "GxP_Development"
                category: "code_quality"
            - name: notify-devs
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "gxp-development"
                text: "Quality Gate {{get-gate-status.status}}: {{application_name}} ({{project_key}}). Bugs: {{get-gate-status.bugs}}, Vulns: {{get-gate-status.vulnerabilities}}. Task: {{create-compliance-record.number}}."
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://gsk-sonar.internal.gsk.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches Splunk at GSK.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at GSK."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at GSK."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL query."
          call: "splunk.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.results.count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.gsk.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Extracts demand forecast data from SAP BW, validates against Oracle Cloud inventory levels, and publishes a forecast vs. inventory dashboard summary to Microsoft Teams and a Confluence supply chain report.

naftiko: "0.5"
info:
  label: "Supply Chain Demand Forecast Sync"
  description: "Extracts demand forecast data from SAP BW, validates against Oracle Cloud inventory levels, and publishes a forecast vs. inventory dashboard summary to Microsoft Teams and a Confluence supply chain report."
  tags:
    - supply-chain
    - forecasting
    - sap-bw
    - oracle-cloud
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: demand-forecast
      port: 8080
      tools:
        - name: sync-demand-forecast
          description: "Given a material number and planning horizon, pull the SAP BW forecast, check Oracle inventory, and publish a summary to Teams and Confluence."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material number to forecast."
            - name: planning_months
              in: body
              type: number
              description: "Number of months for the planning horizon."
            - name: warehouse_code
              in: body
              type: string
              description: "The primary warehouse code."
          steps:
            - name: get-forecast
              type: call
              call: "sapbw.get-forecast"
              with:
                material: "{{material_number}}"
                months: "{{planning_months}}"
            - name: get-inventory
              type: call
              call: "oracle.get-onhand"
              with:
                material_number: "{{material_number}}"
                warehouse_code: "{{warehouse_code}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply-chain-planning"
                text: "Demand Forecast Sync: {{material_number}}. Forecast ({{planning_months}}mo): {{get-forecast.total_demand}} units. Current inventory: {{get-inventory.on_hand_qty}} {{get-inventory.uom}} at {{warehouse_code}}."
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "SC"
                title: "Forecast Report: {{material_number}} — {{planning_months}}mo"
                body: "Material: {{material_number}}\nForecast Demand: {{get-forecast.total_demand}}\nCurrent Inventory: {{get-inventory.on_hand_qty}} {{get-inventory.uom}}\nWarehouse: {{warehouse_code}}\nCoverage: {{get-forecast.coverage_months}} months"
  consumes:
    - type: http
      namespace: sapbw
      baseUri: "https://gsk-bw.sap.com/sap/opu/odata/sap/ZDEMAND_FORECAST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: forecasts
          path: "/ForecastSet(Material='{{material}}',Months={{months}})"
          inputParameters:
            - name: material
              in: path
            - name: months
              in: path
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://gsk-cloud.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: inventory
          path: "/inventoryOnhandBalances?q=ItemNumber={{material_number}};Subinventory={{warehouse_code}}"
          inputParameters:
            - name: material_number
              in: path
            - name: warehouse_code
              in: path
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves Teams activity at GSK.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at GSK."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at GSK."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Tracks a Terraform infrastructure deployment by querying Azure DevOps for the pipeline run, checking Datadog for post-deploy health, and notifying the platform team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning Tracker"
  description: "Tracks a Terraform infrastructure deployment by querying Azure DevOps for the pipeline run, checking Datadog for post-deploy health, and notifying the platform team in Microsoft Teams."
  tags:
    - infrastructure
    - devops
    - terraform
    - azure-devops
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-deploy
      port: 8080
      tools:
        - name: track-deployment
          description: "Given a deployment pipeline ID and target environment, check deploy status, validate health, and notify the platform team."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps Terraform pipeline ID."
            - name: environment
              in: body
              type: string
              description: "The target environment (dev, staging, prod)."
            - name: service_name
              in: body
              type: string
              description: "The service being deployed."
          steps:
            - name: check-deploy
              type: call
              call: "azuredevops.get-latest-run"
              with:
                pipeline_id: "{{pipeline_id}}"
            - name: check-health
              type: call
              call: "datadog.get-service-metrics"
              with:
                service_name: "{{service_name}}-{{environment}}"
            - name: notify-platform
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "platform-deployments"
                text: "Terraform Deploy: {{service_name}} to {{environment}}. Pipeline result: {{check-deploy.result}}. Post-deploy availability: {{check-health.availability_pct}}%. Alerts: {{check-health.active_alerts}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/gsk-pharma/GSK-Platform/_apis"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azuredevops_pat"
      resources:
        - name: builds
          path: "/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: path
          operations:
            - name: get-latest-run
              method: GET
    - 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: metrics
          path: "/query?query=avg:system.cpu.idle{{service:{{service_name}}}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks Terraform workspace at GSK.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at GSK."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at GSK."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-ws"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.attributes.name"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-ws
              method: GET

On a temperature excursion alert, queries the IoT sensor data, looks up the affected vaccine lot in SAP, quarantines the lot, opens a ServiceNow incident, and notifies the supply chain team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vaccine Cold Chain Temperature Breach Orchestrator"
  description: "On a temperature excursion alert, queries the IoT sensor data, looks up the affected vaccine lot in SAP, quarantines the lot, opens a ServiceNow incident, and notifies the supply chain team in Microsoft Teams."
  tags:
    - supply-chain
    - cold-chain
    - vaccines
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cold-chain
      port: 8080
      tools:
        - name: handle-temperature-breach
          description: "Given an IoT sensor alert for a temperature excursion, orchestrate the cold chain breach response including lot quarantine and notification."
          inputParameters:
            - name: sensor_id
              in: body
              type: string
              description: "The IoT sensor identifier that triggered the alert."
            - name: lot_number
              in: body
              type: string
              description: "The vaccine lot number in the affected storage."
            - name: recorded_temp
              in: body
              type: number
              description: "The recorded temperature in Celsius."
            - name: threshold_temp
              in: body
              type: number
              description: "The acceptable threshold temperature in Celsius."
          steps:
            - name: get-lot-details
              type: call
              call: "sap.get-batch"
              with:
                batch_number: "{{lot_number}}"
            - name: quarantine-lot
              type: call
              call: "sap.update-batch-status"
              with:
                batch_number: "{{lot_number}}"
                status: "QUARANTINED"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Cold Chain Breach: Lot {{lot_number}} — Sensor {{sensor_id}}"
                category: "cold_chain_excursion"
                priority: "1"
                assigned_group: "Supply_Chain_Quality"
                description: "Temperature excursion detected. Sensor: {{sensor_id}}. Recorded: {{recorded_temp}}C (threshold: {{threshold_temp}}C). Lot: {{lot_number}} ({{get-lot-details.material}}). Lot quarantined. Quantity affected: {{get-lot-details.quantity}} {{get-lot-details.uom}}."
            - name: notify-supply-chain
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "supply-chain-alerts"
                text: "COLD CHAIN BREACH: Sensor {{sensor_id}} recorded {{recorded_temp}}C (limit {{threshold_temp}}C). Lot {{lot_number}} ({{get-lot-details.material}}) QUARANTINED. Incident: {{open-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
            - name: update-batch-status
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes a vaccine distribution order by validating inventory in Oracle Cloud, creating a SAP delivery order, generating shipping documentation in SharePoint, and notifying the logistics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vaccine Distribution Order Orchestrator"
  description: "Processes a vaccine distribution order by validating inventory in Oracle Cloud, creating a SAP delivery order, generating shipping documentation in SharePoint, and notifying the logistics team in Microsoft Teams."
  tags:
    - supply-chain
    - vaccines
    - distribution
    - oracle-cloud
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vaccine-distribution
      port: 8080
      tools:
        - name: process-distribution-order
          description: "Given a vaccine material, destination, and quantity, validate inventory, create a delivery order, generate shipping docs, and notify logistics."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The vaccine material number."
            - name: destination_code
              in: body
              type: string
              description: "The destination warehouse or distribution center code."
            - name: quantity
              in: body
              type: number
              description: "The requested quantity in doses."
            - name: ship_date
              in: body
              type: string
              description: "Requested ship date (YYYY-MM-DD)."
          steps:
            - name: check-inventory
              type: call
              call: "oracle.get-onhand"
              with:
                material_number: "{{material_number}}"
                warehouse_code: "PRIMARY"
            - name: create-delivery
              type: call
              call: "sap.create-delivery-order"
              with:
                material: "{{material_number}}"
                destination: "{{destination_code}}"
                quantity: "{{quantity}}"
                ship_date: "{{ship_date}}"
            - name: generate-shipping-docs
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "logistics_site"
                folder_path: "ShippingDocs/{{create-delivery.delivery_number}}"
            - name: notify-logistics
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "vaccine-logistics"
                text: "Distribution Order: {{material_number}} x {{quantity}} doses to {{destination_code}}. Ship date: {{ship_date}}. Delivery: {{create-delivery.delivery_number}}. Available inventory: {{check-inventory.on_hand_qty}} {{check-inventory.uom}}. Docs: {{generate-shipping-docs.url}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://gsk-cloud.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: inventory
          path: "/inventoryOnhandBalances?q=ItemNumber={{material_number}};Subinventory={{warehouse_code}}"
          inputParameters:
            - name: material_number
              in: path
            - name: warehouse_code
              in: path
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://gsk-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: "100"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader"
          operations:
            - name: create-delivery-order
              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-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates vaccine lot release by pulling batch test results from SAP, checking quality hold status in ServiceNow, generating the lot release certificate in SharePoint, and notifying the QP (Qualified Person) in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vaccine Lot Release Orchestrator"
  description: "Orchestrates vaccine lot release by pulling batch test results from SAP, checking quality hold status in ServiceNow, generating the lot release certificate in SharePoint, and notifying the QP (Qualified Person) in Microsoft Teams."
  tags:
    - manufacturing
    - vaccines
    - lot-release
    - sap
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lot-release
      port: 8080
      tools:
        - name: release-vaccine-lot
          description: "Given a batch number and QP ID, verify test results, check for quality holds, generate release certificate, and notify the QP."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The vaccine batch/lot number."
            - name: qp_worker_id
              in: body
              type: string
              description: "The Workday ID of the Qualified Person."
          steps:
            - name: get-batch-results
              type: call
              call: "sap.get-batch"
              with:
                batch_number: "{{batch_number}}"
            - name: check-quality-holds
              type: call
              call: "servicenow.get-incidents"
              with:
                query: "category=quality_hold^u_batch_number={{batch_number}}^state!=7"
            - name: get-qp
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{qp_worker_id}}"
            - name: generate-certificate
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "lot_release_site"
                folder_path: "Certificates/{{batch_number}}_release"
            - name: notify-qp
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-qp.work_email}}"
                text: "Lot Release Review: Batch {{batch_number}} ({{get-batch-results.material}}). Status: {{get-batch-results.status}}. Open holds: {{check-quality-holds.result_count}}. Certificate: {{generate-certificate.url}}. Please review and approve."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query={{query}}"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: get-incidents
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: 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-file
              method: PUT
    - 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

Checks Vault secret at GSK.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at GSK."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at GSK."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.gsk.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

Processes invoices at GSK via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at GSK via OCR, SAP matching, approval, and Oracle recording."
  tags:
    - finance
    - accounts-payable
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: invoice-proc
      port: 8080
      tools:
        - name: process-invoice
          description: "Process invoices at GSK."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
          steps:
            - name: extract
              type: call
              call: "ocr.extract"
              with:
                doc: "{{invoice_id}}"
            - name: match
              type: call
              call: "sap.match-po"
              with:
                vendor: "{{vendor_id}}"
                amount: "{{extract.total}}"
            - name: approve
              type: call
              call: "workflow.submit"
              with:
                invoice: "{{invoice_id}}"
            - name: record
              type: call
              call: "oracle.create-payment"
              with:
                invoice: "{{invoice_id}}"
  consumes:
    - type: http
      namespace: ocr
      baseUri: "https://ocr.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ocr_token"
      resources:
        - name: invoices
          path: "/extract"
          operations:
            - name: extract
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: pos
          path: "/match"
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: approvals
          path: "/submit"
          operations:
            - name: submit
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Initiates a vendor qualification by pulling vendor data from SAP, checking compliance status in ServiceNow, notifying the procurement quality team in Microsoft Teams, and logging the assessment in Confluence.

naftiko: "0.5"
info:
  label: "Vendor Qualification Assessment"
  description: "Initiates a vendor qualification by pulling vendor data from SAP, checking compliance status in ServiceNow, notifying the procurement quality team in Microsoft Teams, and logging the assessment in Confluence."
  tags:
    - procurement
    - vendor-qualification
    - sap
    - servicenow
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: vendor-qualification
      port: 8080
      tools:
        - name: assess-vendor
          description: "Given a vendor number and qualification type, pull vendor data, check compliance, notify procurement, and log the assessment."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
            - name: qualification_type
              in: body
              type: string
              description: "Type of qualification (Initial, Re-qualification, For-Cause)."
            - name: material_category
              in: body
              type: string
              description: "The material category the vendor supplies."
          steps:
            - name: get-vendor
              type: call
              call: "sap.get-vendor"
              with:
                vendor_number: "{{vendor_number}}"
            - name: check-compliance
              type: call
              call: "servicenow.get-incidents"
              with:
                query: "category=vendor_nonconformance^u_vendor_number={{vendor_number}}"
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "procurement-quality"
                text: "Vendor Qualification ({{qualification_type}}): {{get-vendor.vendor_name}} ({{vendor_number}}). Category: {{material_category}}. Open nonconformances: {{check-compliance.result_count}}."
            - name: log-assessment
              type: call
              call: "confluence.create-page"
              with:
                space_key: "PROC"
                title: "Vendor Assessment: {{get-vendor.vendor_name}} — {{qualification_type}}"
                body: "Vendor: {{get-vendor.vendor_name}} ({{vendor_number}})\nType: {{qualification_type}}\nCategory: {{material_category}}\nOpen Issues: {{check-compliance.result_count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gsk-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gsk.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query={{query}}"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: get-incidents
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/gsk-pharma/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gsk-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Reviews vendors at GSK.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at GSK."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at GSK."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

Retrieves an employee record from Workday by worker ID. Returns name, department, cost center, manager, and job title for HR and compliance workflows.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves an employee record from Workday by worker ID. Returns name, department, cost center, manager, and job title for HR and compliance workflows."
  tags:
    - hr
    - employee-data
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-employee
      port: 8080
      tools:
        - name: get-employee
          description: "Look up a GSK employee in Workday by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.fullName"
            - name: department
              type: string
              mapping: "$.department"
            - name: cost_center
              type: string
              mapping: "$.costCenter"
            - name: job_title
              type: string
              mapping: "$.jobTitle"
            - name: manager_id
              type: string
              mapping: "$.managerId"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Retrieves employee profile from Workday for GSK.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for GSK."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up GSK employee in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.worker.name"
            - name: title
              type: string
              mapping: "$.worker.title"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5.gsk.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET