GSK Capabilities
Naftiko 0.5 capability definitions for GSK - 100 capabilities showing integration workflows and service orchestrations.
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