Gilead Sciences Capabilities
Naftiko 0.5 capability definitions for Gilead Sciences - 100 capabilities showing integration workflows and service orchestrations.
When a serious adverse event is reported, logs it in the safety database, notifies pharmacovigilance, and creates a regulatory filing task.
naftiko: "0.5"
info:
label: "Adverse Event Reporting Orchestration"
description: "When a serious adverse event is reported, logs it in the safety database, notifies pharmacovigilance, and creates a regulatory filing task."
tags:
- clinical
- regulatory
- safety
- oracle
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: drug-safety
port: 8080
tools:
- name: report-adverse-event
description: "Given study ID, patient ID, event description, and severity, log event, alert PV, and create filing task. Use when sites report SAEs."
inputParameters:
- name: study_id
in: body
type: string
description: "Study identifier."
- name: patient_id
in: body
type: string
description: "Patient identifier."
- name: event_description
in: body
type: string
description: "Event description."
- name: severity
in: body
type: string
description: "Severity level."
steps:
- name: log-event
type: call
call: oracle-argus.create-case
with:
study_id: "{{study_id}}"
subject_id: "{{patient_id}}"
description: "{{event_description}}"
seriousness: "{{severity}}"
- name: notify-pv
type: call
call: msteams.send-message
with:
channel_id: "pharmacovigilance"
text: "SAE: Study {{study_id}}, Patient {{patient_id}}: {{event_description}} ({{severity}}). Case: {{log-event.case_number}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "SAE report - {{log-event.case_number}}"
category: "regulatory_filing"
priority: "1"
assigned_group: "Drug_Safety"
consumes:
- type: http
namespace: oracle-argus
baseUri: "https://gilead-argus.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_argus_token"
resources:
- name: cases
path: "/cases"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves metadata for archived clinical data files in Amazon S3.
naftiko: "0.5"
info:
label: "Amazon S3 Clinical Data Archive"
description: "Retrieves metadata for archived clinical data files in Amazon S3."
tags:
- data
- cloud
- amazon-s3
capability:
exposes:
- type: mcp
namespace: data-archive
port: 8080
tools:
- name: get-archive-metadata
description: "Given S3 bucket and prefix, return matching object metadata. Use for archived data lookup."
inputParameters:
- name: bucket
in: body
type: string
description: "S3 bucket."
- name: prefix
in: body
type: string
description: "Key prefix."
call: s3.list-objects
with:
bucket: "{{bucket}}"
prefix: "{{prefix}}"
outputParameters:
- name: object_count
type: integer
mapping: "$.KeyCount"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.aws_s3_auth"
placement: header
resources:
- name: objects
path: "/{{bucket}}?list-type=2&prefix={{prefix}}"
inputParameters:
- name: bucket
in: path
- name: prefix
in: query
operations:
- name: list-objects
method: GET
Manages formulation changes for antiviral products by creating change controls, checking BOM, and notifying stakeholders.
naftiko: "0.5"
info:
label: "Antiviral Formulation Change Control Orchestration"
description: "Manages formulation changes for antiviral products by creating change controls, checking BOM, and notifying stakeholders."
tags:
- manufacturing
- quality
- regulatory
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: formulation-change
port: 8080
tools:
- name: initiate-formulation-change
description: "Given product code and change description, create change control, check BOM, and notify. Use for antiviral formulation changes."
inputParameters:
- name: product_code
in: body
type: string
description: "Product code."
- name: change_description
in: body
type: string
description: "Change description."
steps:
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "Formulation change: {{product_code}} - {{change_description}}"
category: "manufacturing"
- name: check-bom
type: call
call: sap-erp.get-bom
with:
material: "{{product_code}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "formulation-quality"
text: "Formulation change for {{product_code}}: {{change_description}}. Change: {{create-change.number}}. BOM components: {{check-bom.component_count}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.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: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_BOM_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: bom
path: "/A_BillOfMaterial('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-bom
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Azure AD group memberships for a user.
naftiko: "0.5"
info:
label: "Azure AD Group Membership Lookup"
description: "Retrieves Azure AD group memberships for a user."
tags:
- security
- identity
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: ad-groups
port: 8080
tools:
- name: get-user-groups
description: "Given UPN, return group memberships. Use for access auditing."
inputParameters:
- name: user_upn
in: body
type: string
description: "User principal name."
call: azure-ad.get-member-of
with:
upn: "{{user_upn}}"
outputParameters:
- name: group_count
type: integer
mapping: "$.value.length"
consumes:
- type: http
namespace: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.azure_ad_token"
resources:
- name: users
path: "/users/{{upn}}/memberOf"
inputParameters:
- name: upn
in: path
operations:
- name: get-member-of
method: GET
Queries Azure Cost Management for resource group spend.
naftiko: "0.5"
info:
label: "Azure Resource Cost Lookup"
description: "Queries Azure Cost Management for resource group spend."
tags:
- it
- cloud
- microsoft-azure
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: get-resource-cost
description: "Given resource group, return current month spend. Use for FinOps visibility."
inputParameters:
- name: resource_group
in: body
type: string
description: "Azure resource group."
call: azure.get-cost-summary
with:
rg_name: "{{resource_group}}"
outputParameters:
- name: current_spend
type: number
mapping: "$.properties.rows[0].cost"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: cost
path: "/subscriptions/{{sub}}/resourceGroups/{{rg_name}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: rg_name
in: path
operations:
- name: get-cost-summary
method: POST
Uploads a regulatory document to a Box folder.
naftiko: "0.5"
info:
label: "Box Regulatory File Upload"
description: "Uploads a regulatory document to a Box folder."
tags:
- regulatory
- documentation
- box
capability:
exposes:
- type: mcp
namespace: file-storage
port: 8080
tools:
- name: upload-to-box
description: "Given folder ID and file name, upload to Box. Use for document storage."
inputParameters:
- name: folder_id
in: body
type: string
description: "Box folder ID."
- name: file_name
in: body
type: string
description: "File name."
call: box.upload-file
with:
folder_id: "{{folder_id}}"
name: "{{file_name}}"
outputParameters:
- name: file_id
type: string
mapping: "$.entries[0].id"
consumes:
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Orchestrates database lock by running quality checks, locking the study, and notifying biostatistics.
naftiko: "0.5"
info:
label: "Clinical Data Lock Orchestration"
description: "Orchestrates database lock by running quality checks, locking the study, and notifying biostatistics."
tags:
- clinical
- rd
- snowflake
- oracle
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-lock
port: 8080
tools:
- name: execute-database-lock
description: "Given study ID and lock date, run checks, lock database, and notify biostat. Use for study database locks."
inputParameters:
- name: study_id
in: body
type: string
description: "Study identifier."
- name: lock_date
in: body
type: string
description: "Lock date YYYY-MM-DD."
steps:
- name: run-checks
type: call
call: snowflake.execute-query
with:
query_name: "data_quality_check"
params: "{{study_id}}"
- name: lock-db
type: call
call: oracle-clinical.lock-study
with:
study_id: "{{study_id}}"
lock_date: "{{lock_date}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "biostatistics"
text: "Study {{study_id}} locked as of {{lock_date}}. Open queries: {{run-checks.open_query_count}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: oracle-clinical
baseUri: "https://gilead-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: studies
path: "/studies/{{study_id}}/lock"
inputParameters:
- name: study_id
in: path
operations:
- name: lock-study
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Activates a clinical trial site by verifying IRB, provisioning access, scheduling visit, and notifying ops.
naftiko: "0.5"
info:
label: "Clinical Site Activation Orchestration"
description: "Activates a clinical trial site by verifying IRB, provisioning access, scheduling visit, and notifying ops."
tags:
- clinical
- rd
- oracle
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: site-activation
port: 8080
tools:
- name: activate-clinical-site
description: "Given study and site IDs, verify IRB, provision access, schedule visit, and notify. Use when clinical ops activates a trial site."
inputParameters:
- name: study_id
in: body
type: string
description: "Study identifier."
- name: site_id
in: body
type: string
description: "Site identifier."
steps:
- name: verify-irb
type: call
call: oracle-clinical.get-irb-status
with:
study_id: "{{study_id}}"
site_id: "{{site_id}}"
- name: provision-access
type: call
call: okta.assign-group
with:
group_name: "study-{{study_id}}-site-{{site_id}}"
- name: schedule-visit
type: call
call: oracle-clinical.create-visit
with:
study_id: "{{study_id}}"
site_id: "{{site_id}}"
visit_type: "site_initiation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "clinical-ops"
text: "Site {{site_id}} activated for study {{study_id}}. IRB: {{verify-irb.status}}. Visit: {{schedule-visit.visit_date}}"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://gilead-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: irb
path: "/studies/{{study_id}}/sites/{{site_id}}/irb"
inputParameters:
- name: study_id
in: path
- name: site_id
in: path
operations:
- name: get-irb-status
method: GET
- name: visits
path: "/studies/{{study_id}}/sites/{{site_id}}/visits"
inputParameters:
- name: study_id
in: path
- name: site_id
in: path
operations:
- name: create-visit
method: POST
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: groups
path: "/groups"
operations:
- name: assign-group
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries CTMS for patient enrollment counts and projected completion for an HIV or oncology study.
naftiko: "0.5"
info:
label: "Clinical Trial Patient Enrollment Tracker"
description: "Queries CTMS for patient enrollment counts and projected completion for an HIV or oncology study."
tags:
- clinical
- rd
- oracle
capability:
exposes:
- type: mcp
namespace: clinical-enrollment
port: 8080
tools:
- name: get-enrollment-status
description: "Given a study ID, return enrollment count, target, and projected completion. Use when clinical ops needs enrollment visibility."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
call: oracle-clinical.get-study-enrollment
with:
study_id: "{{study_id}}"
outputParameters:
- name: enrolled_count
type: integer
mapping: "$.data.enrolled"
- name: target_count
type: integer
mapping: "$.data.target"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://gilead-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: studies
path: "/studies/{{study_id}}/enrollment"
inputParameters:
- name: study_id
in: path
operations:
- name: get-study-enrollment
method: GET
Randomizes a patient into a clinical trial arm by verifying eligibility, executing randomization, and notifying the site.
naftiko: "0.5"
info:
label: "Clinical Trial Randomization Orchestration"
description: "Randomizes a patient into a clinical trial arm by verifying eligibility, executing randomization, and notifying the site."
tags:
- clinical
- rd
- oracle
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: randomization
port: 8080
tools:
- name: randomize-patient
description: "Given study, site, and patient ID, verify eligibility, randomize, and notify. Use for patient randomization."
inputParameters:
- name: study_id
in: body
type: string
description: "Study ID."
- name: site_id
in: body
type: string
description: "Site ID."
- name: patient_id
in: body
type: string
description: "Patient ID."
steps:
- name: verify
type: call
call: oracle-clinical.check-eligibility
with:
study_id: "{{study_id}}"
patient_id: "{{patient_id}}"
- name: randomize
type: call
call: oracle-clinical.randomize
with:
study_id: "{{study_id}}"
site_id: "{{site_id}}"
patient_id: "{{patient_id}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "clinical-sites"
text: "Patient {{patient_id}} randomized in {{study_id}} at {{site_id}}. Arm: {{randomize.treatment_arm}}"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://gilead-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: eligibility
path: "/studies/{{study_id}}/patients/{{patient_id}}/eligibility"
inputParameters:
- name: study_id
in: path
- name: patient_id
in: path
operations:
- name: check-eligibility
method: GET
- name: randomization
path: "/studies/{{study_id}}/randomize"
inputParameters:
- name: study_id
in: path
operations:
- name: randomize
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current enrollment and activation status of a clinical trial site from Veeva Vault and posts a summary to Microsoft Teams.
naftiko: "0.5"
info:
label: "Clinical Trial Site Status Lookup"
description: "Retrieves the current enrollment and activation status of a clinical trial site from Veeva Vault and posts a summary to Microsoft Teams."
tags:
- clinical-trials
- veeva
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: get-trial-site-status
description: "Given a clinical trial ID and site ID, retrieve enrollment status from Veeva Vault and post a summary to a Teams channel."
inputParameters:
- name: trial_id
in: body
type: string
description: "The Veeva Vault clinical trial identifier, e.g. CTRIAL-2025-001."
- name: site_id
in: body
type: string
description: "The clinical site identifier."
- name: teams_channel_id
in: body
type: string
description: "The Microsoft Teams channel ID to post the status summary to."
steps:
- name: get-site-status
type: call
call: veeva.get-site-enrollment
with:
trial_id: "{{trial_id}}"
site_id: "{{site_id}}"
- name: post-summary
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Trial {{trial_id}} Site {{site_id}}: Status={{get-site-status.status}}, Enrolled={{get-site-status.enrolled}}, Target={{get-site-status.target}}"
consumes:
- type: http
namespace: veeva
baseUri: "https://gilead.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: site-enrollment
path: "/objects/site__v/{{site_id}}"
inputParameters:
- name: site_id
in: path
operations:
- name: get-site-enrollment
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/{{channel_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Handles cold chain temperature breach by creating deviation, quarantining batch, and notifying quality.
naftiko: "0.5"
info:
label: "Cold Chain Temperature Excursion Orchestration"
description: "Handles cold chain temperature breach by creating deviation, quarantining batch, and notifying quality."
tags:
- supply-chain
- quality
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cold-chain
port: 8080
tools:
- name: handle-temp-excursion
description: "Given shipment ID, batch, and temperature, create deviation, quarantine, and notify. Use for cold chain breaches."
inputParameters:
- name: shipment_id
in: body
type: string
description: "Shipment ID."
- name: batch_number
in: body
type: string
description: "Batch number."
- name: temperature
in: body
type: string
description: "Temperature reading."
steps:
- name: deviation
type: call
call: servicenow.create-deviation
with:
description: "Cold chain: Shipment {{shipment_id}}, Batch {{batch_number}}, Temp {{temperature}}"
priority: "1"
- name: quarantine
type: call
call: sap-erp.update-batch-status
with:
batch: "{{batch_number}}"
status: "quarantine"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "quality-supply-chain"
text: "COLD CHAIN: Shipment {{shipment_id}}, Batch {{batch_number}} quarantined. Temp: {{temperature}}. Deviation: {{deviation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: deviations
path: "/table/u_deviation"
operations:
- name: create-deviation
method: POST
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_Batch('{{batch}}')"
inputParameters:
- name: batch
in: path
operations:
- name: update-batch-status
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Initiates compliance document review by creating tasks and notifying reviewers.
naftiko: "0.5"
info:
label: "Compliance Document Review Orchestration"
description: "Initiates compliance document review by creating tasks and notifying reviewers."
tags:
- compliance
- quality
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance-review
port: 8080
tools:
- name: initiate-review
description: "Given document ID and deadline, create tasks and notify. Use for document reviews."
inputParameters:
- name: document_id
in: body
type: string
description: "Veeva document ID."
- name: review_deadline
in: body
type: string
description: "Deadline YYYY-MM-DD."
steps:
- name: get-doc
type: call
call: veeva-vault.get-document
with:
doc_id: "{{document_id}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Review: {{get-doc.title}}"
due_date: "{{review_deadline}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "compliance"
text: "Review requested: {{get-doc.title}}. Due: {{review_deadline}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://gilead-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/objects/documents/{{doc_id}}"
inputParameters:
- name: doc_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves submitted expense reports from SAP Concur, flags policy violations using Anthropic, and creates ServiceNow audit tasks for out-of-policy items.
naftiko: "0.5"
info:
label: "Concur Expense Report Audit"
description: "Retrieves submitted expense reports from SAP Concur, flags policy violations using Anthropic, and creates ServiceNow audit tasks for out-of-policy items."
tags:
- finance
- expense-management
- sap-concur
- anthropic
- servicenow
- audit
capability:
exposes:
- type: mcp
namespace: expense-audit
port: 8080
tools:
- name: audit-expense-reports
description: "Given a date range, retrieve expense reports from SAP Concur, use Anthropic to flag policy violations, and create ServiceNow audit tasks for non-compliant items."
inputParameters:
- name: start_date
in: body
type: string
description: "Start date for expense report query in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "End date for expense report query in YYYY-MM-DD format."
steps:
- name: get-expense-reports
type: call
call: concur.list-expense-reports
with:
startDate: "{{start_date}}"
endDate: "{{end_date}}"
- name: flag-violations
type: call
call: anthropic.analyze-expenses
with:
model: claude-opus-4-5
prompt: "Review these expense reports and identify policy violations: {{get-expense-reports.reports}}"
- name: create-audit-task
type: call
call: servicenow.create-audit-task
with:
short_description: "Expense audit violations: {{start_date}} to {{end_date}}"
description: "{{flag-violations.violations_summary}}"
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reportdigests"
operations:
- name: list-expense-reports
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: analyze-expenses
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/u_audit_task"
operations:
- name: create-audit-task
method: POST
Retrieves an SOP document from Confluence.
naftiko: "0.5"
info:
label: "Confluence SOP Retrieval"
description: "Retrieves an SOP document from Confluence."
tags:
- quality
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: sop-library
port: 8080
tools:
- name: get-sop
description: "Given page ID, return title and version. Use to reference SOPs."
inputParameters:
- name: page_id
in: body
type: string
description: "Confluence page ID."
call: confluence.get-page
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: version
type: integer
mapping: "$.version.number"
consumes:
- type: http
namespace: confluence
baseUri: "https://gilead.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content/{{page_id}}?expand=version"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
Queries CrowdStrike for endpoint threat detections.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Lookup"
description: "Queries CrowdStrike for endpoint threat detections."
tags:
- security
- endpoint
- crowdstrike
capability:
exposes:
- type: mcp
namespace: endpoint-security
port: 8080
tools:
- name: get-endpoint-threats
description: "Given hostname, return detection count. Use for security investigation."
inputParameters:
- name: hostname
in: body
type: string
description: "Hostname."
call: crowdstrike.get-detections
with:
filter: "device.hostname:'{{hostname}}'"
outputParameters:
- name: detection_count
type: integer
mapping: "$.meta.pagination.total"
consumes:
- type: http
namespace: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: detections
path: "/detects/queries/detects/v1"
operations:
- name: get-detections
method: GET
Deploys an ML model from Databricks to production with change management and notifications.
naftiko: "0.5"
info:
label: "Databricks ML Model Deployment Orchestration"
description: "Deploys an ML model from Databricks to production with change management and notifications."
tags:
- rd
- ai
- databricks
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ml-deployment
port: 8080
tools:
- name: deploy-model
description: "Given model name and version, register, create change request, and notify. Use for model deployments."
inputParameters:
- name: model_name
in: body
type: string
description: "Model name."
- name: model_version
in: body
type: string
description: "Version."
steps:
- name: register
type: call
call: databricks.register-model-version
with:
name: "{{model_name}}"
version: "{{model_version}}"
stage: "Production"
- name: change
type: call
call: servicenow.create-change
with:
short_description: "ML model: {{model_name}} v{{model_version}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "data-science"
text: "Model {{model_name}} v{{model_version}} deployed. Change: {{change.number}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://gilead.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: models
path: "/mlflow/model-versions/transition-stage"
operations:
- name: register-model-version
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Datadog for application health including uptime and error rate.
naftiko: "0.5"
info:
label: "Datadog Application Health Check"
description: "Queries Datadog for application health including uptime and error rate."
tags:
- it
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: app-monitoring
port: 8080
tools:
- name: get-app-health
description: "Given service name, return uptime and error rate. Use when SRE checks application health."
inputParameters:
- name: service_name
in: body
type: string
description: "Datadog service name."
call: datadog.get-service-summary
with:
service: "{{service_name}}"
outputParameters:
- name: uptime_percent
type: number
mapping: "$.data.uptime"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: services
path: "/service_summary?service={{service}}"
inputParameters:
- name: service
in: query
operations:
- name: get-service-summary
method: GET
Detects infrastructure cost anomalies via Datadog metrics, creates a ServiceNow change request for remediation, and posts findings to Microsoft Teams.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Cost Anomaly Responder"
description: "Detects infrastructure cost anomalies via Datadog metrics, creates a ServiceNow change request for remediation, and posts findings to Microsoft Teams."
tags:
- cloud
- observability
- datadog
- servicenow
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: respond-to-cost-anomaly
description: "Given a Datadog monitor ID with a cost anomaly alert, fetch the metric details, open a ServiceNow change request, and post remediation steps to Teams."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID that detected the cost anomaly."
- name: resource_type
in: body
type: string
description: "The type of cloud resource with the anomaly, e.g. EC2, RDS, GCS."
steps:
- name: get-monitor
type: call
call: datadog.get-monitor
with:
monitor_id: "{{monitor_id}}"
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "Cost anomaly: {{resource_type}} — {{get-monitor.name}}"
category: "cloud_cost"
priority: "2"
- name: notify-team
type: call
call: msteams.post-cost-alert
with:
channel: "cloud-finops"
text: "Cost anomaly detected on {{resource_type}}. Monitor: {{get-monitor.name}}. Change: {{create-change.number}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.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: messages
path: "/teams/finops/channels/general/messages"
operations:
- name: post-cost-alert
method: POST
Retrieves SLO compliance status from Datadog for all production services and posts a weekly compliance digest to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Datadog SLO Compliance Report"
description: "Retrieves SLO compliance status from Datadog for all production services and posts a weekly compliance digest to the engineering Teams channel."
tags:
- observability
- datadog
- microsoft-teams
- slo
- reporting
capability:
exposes:
- type: mcp
namespace: slo-reporting
port: 8080
tools:
- name: digest-slo-compliance
description: "Retrieve all SLO statuses from Datadog and post a weekly compliance report to the engineering Teams channel highlighting any breaches."
inputParameters:
- name: timeframe
in: body
type: string
description: "SLO evaluation timeframe: 7d, 30d, or 90d."
steps:
- name: get-slos
type: call
call: datadog.list-slos
with:
timeframe: "{{timeframe}}"
- name: post-report
type: call
call: msteams.post-slo-report
with:
channel: "engineering-slo"
text: "SLO Compliance Report ({{timeframe}}): {{get-slos.compliant}} compliant, {{get-slos.breached}} breached."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo"
operations:
- name: list-slos
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/engineering/channels/slo/messages"
operations:
- name: post-slo-report
method: POST
Sends contract for signature via DocuSign, updates Salesforce, and notifies legal.
naftiko: "0.5"
info:
label: "DocuSign Contract Execution Orchestration"
description: "Sends contract for signature via DocuSign, updates Salesforce, and notifies legal."
tags:
- legal
- sales
- docusign
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-execution
port: 8080
tools:
- name: send-contract
description: "Given opportunity ID and template, send contract, update CRM, and notify. Use for contract execution."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
- name: template_id
in: body
type: string
description: "DocuSign template."
steps:
- name: get-opp
type: call
call: salesforce.get-opportunity
with:
opp_id: "{{opportunity_id}}"
- name: send-envelope
type: call
call: docusign.create-envelope
with:
template_id: "{{template_id}}"
signer_email: "{{get-opp.contact_email}}"
- name: update-crm
type: call
call: salesforce.update-opportunity
with:
opp_id: "{{opportunity_id}}"
status: "Sent for Signature"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "legal"
text: "Contract sent for {{get-opp.account_name}}. Envelope: {{send-envelope.envelope_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opp_id}}"
inputParameters:
- name: opp_id
in: path
operations:
- name: get-opportunity
method: GET
- name: update-opportunity
method: PATCH
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages drug product lot release by verifying QC, releasing batch, creating CoA task, and notifying distribution.
naftiko: "0.5"
info:
label: "Drug Product Lot Release Orchestration"
description: "Manages drug product lot release by verifying QC, releasing batch, creating CoA task, and notifying distribution."
tags:
- quality
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lot-release
port: 8080
tools:
- name: release-drug-lot
description: "Given batch and product code, verify QC, release, create CoA, and notify. Use when QA releases a lot."
inputParameters:
- name: batch_number
in: body
type: string
description: "Batch number."
- name: product_code
in: body
type: string
description: "Product code."
steps:
- name: get-qc
type: call
call: sap-erp.get-inspection
with:
batch: "{{batch_number}}"
- name: release
type: call
call: sap-erp.release-batch
with:
batch: "{{batch_number}}"
status: "released"
- name: create-coa
type: call
call: servicenow.create-task
with:
short_description: "CoA: {{batch_number}} - {{product_code}}"
category: "quality_release"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "distribution"
text: "Lot {{batch_number}} ({{product_code}}) released. QC: {{get-qc.result}}. CoA: {{create-coa.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspections
path: "/A_InspectionResult"
operations:
- name: get-inspection
method: GET
- name: batches
path: "/A_BatchRelease"
operations:
- name: release-batch
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Given a new adverse event report, extracts key clinical data via Anthropic, cross-references with Veeva Vault safety database, and creates a Jira triage task.
naftiko: "0.5"
info:
label: "Drug Safety Signal Triage with AI"
description: "Given a new adverse event report, extracts key clinical data via Anthropic, cross-references with Veeva Vault safety database, and creates a Jira triage task."
tags:
- pharmacovigilance
- safety
- anthropic
- veeva
- jira
- ai
capability:
exposes:
- type: mcp
namespace: safety-ops
port: 8080
tools:
- name: triage-adverse-event
description: "Given an adverse event report text, use Anthropic to extract structured clinical signals, cross-reference with Veeva safety data, and create a Jira triage task for the pharmacovigilance team."
inputParameters:
- name: report_text
in: body
type: string
description: "The raw text of the adverse event report to triage."
- name: product_name
in: body
type: string
description: "The Gilead product name referenced in the report."
steps:
- name: extract-signals
type: call
call: anthropic.extract-safety-signals
with:
model: claude-opus-4-5
prompt: "Extract adverse event signals from this pharmacovigilance report for {{product_name}}: {{report_text}}"
- name: search-safety-db
type: call
call: veeva.search-safety-cases
with:
product_name: "{{product_name}}"
signal: "{{extract-signals.primary_signal}}"
- name: create-triage-task
type: call
call: jira.create-triage-issue
with:
project_key: "PVGT"
summary: "AE Triage: {{product_name}} — {{extract-signals.primary_signal}}"
description: "Signal: {{extract-signals.primary_signal}}\nSeverity: {{extract-signals.severity}}\nRelated cases: {{search-safety-db.case_count}}"
consumes:
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: extract-safety-signals
method: POST
- type: http
namespace: veeva
baseUri: "https://gilead.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: safety-cases
path: "/objects/safety_case__v"
operations:
- name: search-safety-cases
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-triage-issue
method: POST
When an employee departure is recorded in Workday, deactivates their Okta account, revokes Salesforce access, and closes all open ServiceNow tickets assigned to them.
naftiko: "0.5"
info:
label: "Employee Offboarding Automation"
description: "When an employee departure is recorded in Workday, deactivates their Okta account, revokes Salesforce access, and closes all open ServiceNow tickets assigned to them."
tags:
- hr
- offboarding
- workday
- okta
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a departing employee's Workday ID, deactivate their Okta account, remove Salesforce access, and close open ServiceNow tickets."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID of the departing employee."
- name: okta_user_id
in: body
type: string
description: "The Okta user ID to deactivate, e.g. 00u1abc2defGHI3jk."
steps:
- name: deactivate-okta
type: call
call: okta.deactivate-user
with:
user_id: "{{okta_user_id}}"
- name: revoke-salesforce
type: call
call: salesforce.freeze-user
with:
workday_id: "{{workday_employee_id}}"
- name: close-tickets
type: call
call: servicenow.close-user-tickets
with:
assigned_to: "{{workday_employee_id}}"
consumes:
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users/{{user_id}}/lifecycle/deactivate"
inputParameters:
- name: user_id
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{workday_id}}"
inputParameters:
- name: workday_id
in: path
operations:
- name: freeze-user
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: close-user-tickets
method: PATCH
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions an Okta account, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions an Okta account, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: create a ServiceNow ticket, provision an Okta account, and send a Teams welcome message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire, e.g. W-00123456."
- name: start_date
in: body
type: string
description: "The employee's first day in ISO 8601 format, e.g. 2026-04-01."
steps:
- name: get-employee
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: open-ticket
type: call
call: servicenow.create-incident
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: hr_onboarding
assigned_to: IT_Onboarding
- name: provision-okta
type: call
call: okta.create-user
with:
firstName: "{{get-employee.first_name}}"
lastName: "{{get-employee.last_name}}"
email: "{{get-employee.work_email}}"
login: "{{get-employee.work_email}}"
- name: send-welcome
type: call
call: msteams.send-message
with:
recipient: "{{get-employee.work_email}}"
text: "Welcome to Gilead Sciences, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.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: "/gilead-sciences/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.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: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users"
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: messages
path: "/users/{{recipient}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-message
method: POST
Processes employee transfers by updating Workday, re-provisioning Okta, transferring assets, and notifying.
naftiko: "0.5"
info:
label: "Employee Transfer Orchestration"
description: "Processes employee transfers by updating Workday, re-provisioning Okta, transferring assets, and notifying."
tags:
- hr
- identity
- workday
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-transfer
port: 8080
tools:
- name: process-transfer
description: "Given worker ID and target department, update records and notify. Use for inter-department transfers."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
- name: target_department
in: body
type: string
description: "Target department."
steps:
- name: get-employee
type: call
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
- name: update-okta
type: call
call: okta.update-user-groups
with:
user_email: "{{get-employee.work_email}}"
department: "{{target_department}}"
- name: transfer-assets
type: call
call: servicenow.transfer-assets
with:
user_id: "{{worker_id}}"
department: "{{target_department}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-ops"
text: "Transfer: {{get-employee.first_name}} {{get-employee.last_name}} to {{target_department}}."
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: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users/{{user_email}}/groups"
inputParameters:
- name: user_email
in: path
operations:
- name: update-user-groups
method: PUT
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/alm_asset"
operations:
- name: transfer-assets
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages equipment calibration by checking due dates, scheduling calibration, and notifying metrology.
naftiko: "0.5"
info:
label: "Equipment Calibration Orchestration"
description: "Manages equipment calibration by checking due dates, scheduling calibration, and notifying metrology."
tags:
- quality
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: calibration
port: 8080
tools:
- name: schedule-calibration
description: "Given equipment ID, check due date, create work order, and notify. Use for calibration management."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment ID."
steps:
- name: check-due
type: call
call: sap-erp.get-calibration-status
with:
equipment: "{{equipment_id}}"
- name: create-wo
type: call
call: servicenow.create-work-order
with:
short_description: "Calibration: {{equipment_id}}"
category: "calibration"
due_date: "{{check-due.next_cal_date}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "calibration"
text: "Calibration scheduled: {{equipment_id}}. Due: {{check-due.next_cal_date}}. WO: {{create-wo.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment}}')/calibration"
inputParameters:
- name: equipment
in: path
operations:
- name: get-calibration-status
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current status of a New Drug Application from the regulatory tracking system.
naftiko: "0.5"
info:
label: "FDA NDA Submission Status Lookup"
description: "Retrieves the current status of a New Drug Application from the regulatory tracking system."
tags:
- regulatory
- clinical
- veeva-vault
capability:
exposes:
- type: mcp
namespace: regulatory-submissions
port: 8080
tools:
- name: get-nda-status
description: "Given an NDA number, return review status, FDA division, and expected PDUFA date. Use when regulatory checks submission progress."
inputParameters:
- name: nda_number
in: body
type: string
description: "NDA application number."
call: veeva-vault.get-submission
with:
nda_number: "{{nda_number}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: pdufa_date
type: string
mapping: "$.data.pdufa_date"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://gilead-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: submissions
path: "/objects/submission__c/{{nda_number}}"
inputParameters:
- name: nda_number
in: path
operations:
- name: get-submission
method: GET
On a GitHub Actions workflow failure on a protected branch, opens a Jira bug, creates a Datadog event marker, and notifies the engineering team in Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Response"
description: "On a GitHub Actions workflow failure on a protected branch, opens a Jira bug, creates a Datadog event marker, and notifies the engineering team in Microsoft Teams."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions run ID, repo, and branch, open a Jira bug, create a Datadog deployment event, and post the failure summary to the engineering Teams channel."
inputParameters:
- name: run_id
in: body
type: string
description: "The GitHub Actions workflow run ID that failed."
- name: repo
in: body
type: string
description: "The GitHub repository full name, e.g. gilead-sciences/platform."
- name: branch
in: body
type: string
description: "The branch name where the failure occurred."
- name: workflow_name
in: body
type: string
description: "The name of the failed GitHub Actions workflow."
steps:
- name: get-run-details
type: call
call: github.get-workflow-run
with:
run_id: "{{run_id}}"
repo: "{{repo}}"
- name: create-bug
type: call
call: jira.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
description: "Run ID: {{run_id}}\nStatus: {{get-run-details.conclusion}}"
- name: create-dd-event
type: call
call: datadog.create-event
with:
title: "CI Failure: {{workflow_name}} on {{branch}}"
text: "Run {{run_id}} failed. Jira: {{create-bug.key}}"
alert_type: "error"
- name: notify-eng
type: call
call: msteams-notify.post-message
with:
channel: "engineering-alerts"
text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams-notify
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/engineering/channels/general/messages"
operations:
- name: post-message
method: POST
Checks a GitHub repo for branch protection and security scanning.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks a GitHub repo for branch protection and security scanning."
tags:
- security
- devops
- github
capability:
exposes:
- type: mcp
namespace: repo-compliance
port: 8080
tools:
- name: check-compliance
description: "Given repo name, return protection and scanning status. Use to verify repo governance."
inputParameters:
- name: repo_name
in: body
type: string
description: "Repo in org/repo format."
call: github.get-repo-settings
with:
repo: "{{repo_name}}"
outputParameters:
- name: branch_protection
type: boolean
mapping: "$.data.branch_protection"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo}}"
inputParameters:
- name: repo
in: path
operations:
- name: get-repo-settings
method: GET
Audits a GitHub repository for required security settings (branch protection, secret scanning) and files a Jira compliance task if any are missing.
naftiko: "0.5"
info:
label: "GitHub Repository Security Policy Enforcement"
description: "Audits a GitHub repository for required security settings (branch protection, secret scanning) and files a Jira compliance task if any are missing."
tags:
- security
- devops
- github
- jira
- compliance
capability:
exposes:
- type: mcp
namespace: repo-governance
port: 8080
tools:
- name: enforce-repo-security-policy
description: "Given a GitHub repository, check branch protection rules and secret scanning status; if non-compliant, create a Jira task for the security team."
inputParameters:
- name: repo
in: body
type: string
description: "The GitHub repository full name to audit, e.g. gilead-sciences/platform."
- name: default_branch
in: body
type: string
description: "The default branch name to check for protection, e.g. main."
steps:
- name: check-branch-protection
type: call
call: github.get-branch-protection
with:
repo: "{{repo}}"
branch: "{{default_branch}}"
- name: create-compliance-task
type: call
call: jira.create-security-task
with:
project_key: "SEC"
summary: "Repo policy violation: {{repo}}"
description: "Branch {{default_branch}} protection status: {{check-branch-protection.required_status_checks}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/{{repo}}/branches/{{branch}}/protection"
inputParameters:
- name: repo
in: path
- name: branch
in: path
operations:
- name: get-branch-protection
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-security-task
method: POST
Retrieves GitHub Advanced Security code scanning alerts for a repository and creates a prioritized Jira security backlog with critical findings.
naftiko: "0.5"
info:
label: "GitHub Security Scanning Summary"
description: "Retrieves GitHub Advanced Security code scanning alerts for a repository and creates a prioritized Jira security backlog with critical findings."
tags:
- security
- devops
- github
- jira
- code-scanning
capability:
exposes:
- type: mcp
namespace: security-devops
port: 8080
tools:
- name: sync-security-alerts-to-jira
description: "Given a GitHub repository, fetch all open critical and high code scanning alerts and create corresponding Jira security issues for remediation tracking."
inputParameters:
- name: repo
in: body
type: string
description: "The GitHub repository full name, e.g. gilead-sciences/platform."
- name: severity_filter
in: body
type: string
description: "Minimum severity to import: critical, high, or medium."
steps:
- name: get-alerts
type: call
call: github.list-code-scanning-alerts
with:
repo: "{{repo}}"
severity: "{{severity_filter}}"
- name: create-security-issues
type: call
call: jira.create-security-backlog
with:
project_key: "SEC"
summary: "Security alerts in {{repo}}: {{get-alerts.total}} findings"
description: "Severity: {{severity_filter}}\nTop finding: {{get-alerts.top_rule}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: code-scanning-alerts
path: "/repos/{{repo}}/code-scanning/alerts"
inputParameters:
- name: repo
in: path
operations:
- name: list-code-scanning-alerts
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-security-backlog
method: POST
Checks GMP training compliance for a department from Workday Learning.
naftiko: "0.5"
info:
label: "GMP Training Compliance Check"
description: "Checks GMP training compliance for a department from Workday Learning."
tags:
- quality
- compliance
- workday
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-gmp-compliance
description: "Given department code, return training completion rate. Use when quality checks training."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
call: workday.get-training-compliance
with:
department: "{{department_code}}"
training_type: "gmp"
outputParameters:
- name: completion_rate
type: number
mapping: "$.data.completion_rate"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/training/compliance"
operations:
- name: get-training-compliance
method: GET
Retrieves current development phase and milestones for an HIV antiviral compound in the pipeline.
naftiko: "0.5"
info:
label: "HIV Antiviral Pipeline Status Lookup"
description: "Retrieves current development phase and milestones for an HIV antiviral compound in the pipeline."
tags:
- rd
- clinical
- snowflake
capability:
exposes:
- type: mcp
namespace: pipeline-tracker
port: 8080
tools:
- name: get-compound-status
description: "Given a compound ID, return development phase, next milestone, and timeline. Use when R&D leadership needs HIV pipeline visibility."
inputParameters:
- name: compound_id
in: body
type: string
description: "Internal compound identifier."
call: snowflake.execute-query
with:
query_name: "compound_pipeline_status"
params: "{{compound_id}}"
outputParameters:
- name: phase
type: string
mapping: "$.data[0].phase"
- name: next_milestone
type: string
mapping: "$.data[0].next_milestone"
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Orchestrates HIV resistance testing by submitting genotype samples, analyzing mutations, generating resistance reports, and notifying clinical teams.
naftiko: "0.5"
info:
label: "HIV Drug Resistance Testing Orchestration"
description: "Orchestrates HIV resistance testing by submitting genotype samples, analyzing mutations, generating resistance reports, and notifying clinical teams."
tags:
- clinical
- rd
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: resistance-testing
port: 8080
tools:
- name: process-resistance-test
description: "Given sample ID and patient ID, analyze genotype, identify mutations, generate report, and notify. Use for HIV resistance analysis."
inputParameters:
- name: sample_id
in: body
type: string
description: "Sample identifier."
- name: patient_id
in: body
type: string
description: "Patient identifier."
steps:
- name: analyze-genotype
type: call
call: snowflake.execute-query
with:
query_name: "hiv_genotype_analysis"
params: "{{sample_id}}"
- name: generate-report
type: call
call: snowflake.execute-query
with:
query_name: "resistance_report"
params: "{{sample_id}},{{analyze-genotype.mutations}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Resistance report: Patient {{patient_id}}"
category: "clinical_lab"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hiv-clinical"
text: "Resistance test for patient {{patient_id}}: {{analyze-genotype.mutation_count}} mutations detected. Report task: {{create-task.number}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers an Informatica Cloud ETL job.
naftiko: "0.5"
info:
label: "Informatica Data Integration Job Trigger"
description: "Triggers an Informatica Cloud ETL job."
tags:
- data
- integration
- informatica
capability:
exposes:
- type: mcp
namespace: data-integration
port: 8080
tools:
- name: trigger-job
description: "Given task ID, trigger ETL job. Use for data integration runs."
inputParameters:
- name: task_id
in: body
type: string
description: "Task ID."
call: informatica.start-job
with:
taskId: "{{task_id}}"
outputParameters:
- name: run_id
type: string
mapping: "$.runId"
consumes:
- type: http
namespace: informatica
baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
authentication:
type: bearer
token: "$secrets.informatica_token"
resources:
- name: jobs
path: "/job"
operations:
- name: start-job
method: POST
Retrieves a pending invoice from SAP Ariba, validates it against the SAP purchase order, and routes it for approval in ServiceNow.
naftiko: "0.5"
info:
label: "Invoice Processing and Approval Routing"
description: "Retrieves a pending invoice from SAP Ariba, validates it against the SAP purchase order, and routes it for approval in ServiceNow."
tags:
- finance
- procurement
- sap-ariba
- servicenow
- approval
capability:
exposes:
- type: mcp
namespace: invoice-ops
port: 8080
tools:
- name: process-invoice
description: "Given an Ariba invoice ID and PO number, validate the invoice against SAP and create a ServiceNow approval task for the finance team."
inputParameters:
- name: invoice_id
in: body
type: string
description: "The SAP Ariba invoice document ID to process."
- name: po_number
in: body
type: string
description: "The related SAP purchase order number for validation."
steps:
- name: get-invoice
type: call
call: ariba.get-invoice
with:
invoice_id: "{{invoice_id}}"
- name: get-po
type: call
call: sap.get-po-header
with:
po_number: "{{po_number}}"
- name: create-approval
type: call
call: servicenow.create-approval-task
with:
short_description: "Invoice {{invoice_id}} approval — PO {{po_number}}"
amount: "{{get-invoice.total_amount}}"
vendor: "{{get-invoice.vendor_name}}"
po_status: "{{get-po.status}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/invoice/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: invoices
path: "/invoices/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: sap
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po-header
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: approval-tasks
path: "/table/sysapproval_approver"
operations:
- name: create-approval-task
method: POST
On a critical Datadog alert, creates a ServiceNow P1 incident, pages the on-call team via PagerDuty, and posts context to Microsoft Teams.
naftiko: "0.5"
info:
label: "IT Incident Response Handler"
description: "On a critical Datadog alert, creates a ServiceNow P1 incident, pages the on-call team via PagerDuty, and posts context to Microsoft Teams."
tags:
- itsm
- incident-response
- datadog
- servicenow
- pagerduty
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: itsm-ops
port: 8080
tools:
- name: handle-critical-alert
description: "Given a Datadog alert ID and monitor name, create a ServiceNow P1 incident, trigger a PagerDuty incident, and notify the Microsoft Teams ops channel."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Datadog alert or event ID triggering the incident."
- name: monitor_name
in: body
type: string
description: "The name of the Datadog monitor that fired."
- name: severity
in: body
type: string
description: "Alert severity, e.g. critical, high, medium."
steps:
- name: create-incident
type: call
call: servicenow.create-p1
with:
short_description: "Critical alert: {{monitor_name}}"
impact: "1"
urgency: "1"
description: "Datadog alert {{alert_id}} fired for monitor {{monitor_name}}"
- name: page-oncall
type: call
call: pagerduty.create-incident
with:
title: "P1: {{monitor_name}}"
service_id: "$secrets.pagerduty_service_id"
body: "ServiceNow: {{create-incident.number}}"
- name: notify-teams
type: call
call: msteams.post-alert
with:
channel: "it-ops-alerts"
text: "P1 Incident: {{monitor_name}} | SN: {{create-incident.number}} | PD: {{page-oncall.id}} | Alert: {{alert_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.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-p1
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.pagerduty_token"
placement: header
resources:
- name: incidents
path: "/incidents"
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/it-ops/channels/general/messages"
operations:
- name: post-alert
method: POST
Creates a bug report in Jira.
naftiko: "0.5"
info:
label: "Jira Bug Report Creation"
description: "Creates a bug report in Jira."
tags:
- devops
- engineering
- jira
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: create-bug
description: "Given project key and summary, create a Jira bug. Use for defect logging."
inputParameters:
- name: project_key
in: body
type: string
description: "Project key."
- name: summary
in: body
type: string
description: "Bug summary."
call: jira.create-issue
with:
project: "{{project_key}}"
issuetype: "Bug"
summary: "{{summary}}"
outputParameters:
- name: issue_key
type: string
mapping: "$.key"
consumes:
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Compiles a sprint planning digest from Jira by fetching open issues for a project and posting a prioritized summary to Microsoft Teams.
naftiko: "0.5"
info:
label: "Jira Sprint Planning Digest"
description: "Compiles a sprint planning digest from Jira by fetching open issues for a project and posting a prioritized summary to Microsoft Teams."
tags:
- devops
- jira
- microsoft-teams
- reporting
- sprint-planning
capability:
exposes:
- type: mcp
namespace: devops-reporting
port: 8080
tools:
- name: digest-sprint-backlog
description: "Given a Jira project key and sprint name, retrieve open issues and post a prioritized sprint planning digest to the engineering Teams channel."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key to pull sprint issues from, e.g. PLAT."
- name: sprint_name
in: body
type: string
description: "The sprint name to filter issues, e.g. Sprint 42."
- name: teams_channel
in: body
type: string
description: "The Microsoft Teams channel name to post the digest to."
steps:
- name: get-sprint-issues
type: call
call: jira.search-issues
with:
jql: "project={{project_key}} AND sprint='{{sprint_name}}' AND status!=Done"
- name: post-digest
type: call
call: msteams.post-digest
with:
channel: "{{teams_channel}}"
text: "Sprint digest for {{project_key}} — {{sprint_name}}: {{get-sprint-issues.total}} open issues."
consumes:
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/search"
operations:
- name: search-issues
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/engineering/channels/general/messages"
operations:
- name: post-digest
method: POST
Retrieves employer brand metrics from LinkedIn.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Metrics"
description: "Retrieves employer brand metrics from LinkedIn."
tags:
- hr
- marketing
- linkedin
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: get-brand-metrics
description: "Return follower count and engagement rate. Use for employer brand tracking."
inputParameters:
- name: time_period
in: body
type: string
description: "Reporting period."
call: linkedin.get-organization-stats
with:
period: "{{time_period}}"
outputParameters:
- name: follower_count
type: integer
mapping: "$.data.followerCount"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: stats
path: "/organizationPageStatistics"
operations:
- name: get-organization-stats
method: GET
Retrieves active job postings from LinkedIn Recruiter and posts a weekly talent pipeline summary to the HR team in Microsoft Teams.
naftiko: "0.5"
info:
label: "LinkedIn Talent Pipeline Report"
description: "Retrieves active job postings from LinkedIn Recruiter and posts a weekly talent pipeline summary to the HR team in Microsoft Teams."
tags:
- hr
- recruiting
- linkedin
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: talent-reporting
port: 8080
tools:
- name: digest-talent-pipeline
description: "Fetch active job postings and applicant counts from LinkedIn and post a weekly pipeline summary to the HR Teams channel."
inputParameters:
- name: organization_id
in: body
type: string
description: "The LinkedIn organization URN for Gilead Sciences."
steps:
- name: get-job-postings
type: call
call: linkedin.list-job-postings
with:
organization_id: "{{organization_id}}"
- name: post-summary
type: call
call: msteams.post-talent-digest
with:
channel: "hr-talent"
text: "Weekly talent pipeline: {{get-job-postings.total}} active postings, {{get-job-postings.applicant_count}} total applicants."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: job-postings
path: "/jobPostings"
operations:
- name: list-job-postings
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/hr/channels/general/messages"
operations:
- name: post-talent-digest
method: POST
Retrieves a pharmaceutical manufacturing batch record from SAP, returning status, yield, and quality release information.
naftiko: "0.5"
info:
label: "Manufacturing Batch Record Status Check"
description: "Retrieves a pharmaceutical manufacturing batch record from SAP, returning status, yield, and quality release information."
tags:
- manufacturing
- quality
- sap
capability:
exposes:
- type: mcp
namespace: manufacturing-batch
port: 8080
tools:
- name: get-batch-status
description: "Given a batch number, return status, yield, and release status. Use when production needs batch visibility."
inputParameters:
- name: batch_number
in: body
type: string
description: "SAP batch number."
call: sap-erp.get-batch-record
with:
batch_id: "{{batch_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.BatchStatus"
- name: yield_percentage
type: number
mapping: "$.d.YieldPercent"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-records
path: "/A_BatchRecord('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-record
method: GET
When a manufacturing line goes down, creates incident, alerts maintenance, and logs downtime.
naftiko: "0.5"
info:
label: "Manufacturing Line Downtime Response"
description: "When a manufacturing line goes down, creates incident, alerts maintenance, and logs downtime."
tags:
- manufacturing
- it
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: mfg-downtime
port: 8080
tools:
- name: handle-line-downtime
description: "Given line ID and failure reason, create incident, notify team, and log downtime. Use when manufacturing detects stoppage."
inputParameters:
- name: line_id
in: body
type: string
description: "Production line ID."
- name: failure_reason
in: body
type: string
description: "Failure description."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Line {{line_id}} down: {{failure_reason}}"
category: "manufacturing"
priority: "1"
- name: alert-team
type: call
call: msteams.send-message
with:
channel_id: "manufacturing-ops"
text: "ALERT: Line {{line_id}} down. {{failure_reason}}. Incident: {{create-incident.number}}"
- name: log-downtime
type: call
call: sap-erp.create-downtime-record
with:
work_center: "{{line_id}}"
reason: "{{failure_reason}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.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.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_DOWNTIME_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: downtime
path: "/A_DowntimeRecord"
operations:
- name: create-downtime-record
method: POST
Assembles an NDA submission package from Veeva Vault documents, creates tracking task, and notifies regulatory.
naftiko: "0.5"
info:
label: "NDA Submission Package Orchestration"
description: "Assembles an NDA submission package from Veeva Vault documents, creates tracking task, and notifies regulatory."
tags:
- regulatory
- clinical
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: nda-submission
port: 8080
tools:
- name: assemble-nda
description: "Given NDA number and molecule, gather docs, create submission, and notify. Use for NDA filing."
inputParameters:
- name: nda_number
in: body
type: string
description: "NDA number."
- name: molecule_name
in: body
type: string
description: "Molecule name."
steps:
- name: gather-docs
type: call
call: veeva-vault.query-documents
with:
nda_number: "{{nda_number}}"
- name: create-submission
type: call
call: veeva-vault.create-submission
with:
nda_number: "{{nda_number}}"
molecule: "{{molecule_name}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "NDA: {{nda_number}} - {{molecule_name}}"
category: "regulatory_submission"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "regulatory"
text: "NDA {{nda_number}} package assembled for {{molecule_name}}. Docs: {{gather-docs.count}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://gilead-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/query"
operations:
- name: query-documents
method: POST
- name: submissions
path: "/objects/submission__c"
operations:
- name: create-submission
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves all user-application assignments from Okta for a specific application and generates an access review report posted to the security team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Okta Application Access Review"
description: "Retrieves all user-application assignments from Okta for a specific application and generates an access review report posted to the security team in Microsoft Teams."
tags:
- identity
- security
- okta
- microsoft-teams
- access-review
capability:
exposes:
- type: mcp
namespace: access-review
port: 8080
tools:
- name: run-app-access-review
description: "Given an Okta application ID, list all users with access and post a review summary to the security Teams channel for quarterly access certification."
inputParameters:
- name: app_id
in: body
type: string
description: "The Okta application ID to review user access for."
- name: app_name
in: body
type: string
description: "Human-readable application name for the report, e.g. Salesforce."
steps:
- name: list-app-users
type: call
call: okta.list-app-users
with:
app_id: "{{app_id}}"
- name: post-review
type: call
call: msteams.post-access-review
with:
channel: "security-reviews"
text: "Access review for {{app_name}}: {{list-app-users.total}} users have access. Review required by end of quarter."
consumes:
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: app-users
path: "/apps/{{app_id}}/users"
inputParameters:
- name: app_id
in: path
operations:
- name: list-app-users
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/security/channels/reviews/messages"
operations:
- name: post-access-review
method: POST
Audits all Okta users for MFA enrollment compliance and posts a non-compliant user list to ServiceNow as a compliance incident.
naftiko: "0.5"
info:
label: "Okta MFA Compliance Audit"
description: "Audits all Okta users for MFA enrollment compliance and posts a non-compliant user list to ServiceNow as a compliance incident."
tags:
- identity
- security
- okta
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: security-compliance
port: 8080
tools:
- name: audit-mfa-compliance
description: "Retrieve all active Okta users, identify those without MFA enrolled, and create a ServiceNow compliance incident with the non-compliant user list."
inputParameters:
- name: compliance_threshold
in: body
type: number
description: "Maximum allowed percentage of non-MFA users before a P2 incident is opened, e.g. 5."
steps:
- name: list-users
type: call
call: okta.list-active-users
- name: create-compliance-incident
type: call
call: servicenow.create-compliance-incident
with:
short_description: "Okta MFA non-compliance detected"
category: "security_compliance"
description: "Users without MFA exceeds threshold of {{compliance_threshold}}%"
consumes:
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: list-active-users
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.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-compliance-incident
method: POST
Retrieves Okta user profile by email, returning account status and MFA enrollment.
naftiko: "0.5"
info:
label: "Okta User Status Check"
description: "Retrieves Okta user profile by email, returning account status and MFA enrollment."
tags:
- security
- identity
- okta
capability:
exposes:
- type: mcp
namespace: identity-management
port: 8080
tools:
- name: get-user-status
description: "Given an email, return Okta status and last login. Use when IT verifies access."
inputParameters:
- name: email
in: body
type: string
description: "Employee email."
call: okta.get-user
with:
login: "{{email}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: last_login
type: string
mapping: "$.lastLogin"
consumes:
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users/{{login}}"
inputParameters:
- name: login
in: path
operations:
- name: get-user
method: GET
Uses OpenAI to generate structured summaries of clinical study reports.
naftiko: "0.5"
info:
label: "OpenAI Clinical Document Summarization"
description: "Uses OpenAI to generate structured summaries of clinical study reports."
tags:
- clinical
- ai
- openai
capability:
exposes:
- type: mcp
namespace: doc-summarization
port: 8080
tools:
- name: summarize-document
description: "Given document text, produce a structured summary. Use for clinical document overviews."
inputParameters:
- name: document_text
in: body
type: string
description: "Document text."
call: openai.create-completion
with:
model: "gpt-4"
prompt: "Summarize: {{document_text}}"
outputParameters:
- name: summary
type: string
mapping: "$.choices[0].message.content"
consumes:
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
Retrieves the current on-call engineer from PagerDuty for a given service and returns their contact details.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer from PagerDuty for a given service and returns their contact details."
tags:
- itsm
- pagerduty
- on-call
- operations
capability:
exposes:
- type: mcp
namespace: oncall-lookup
port: 8080
tools:
- name: get-oncall-engineer
description: "Given a PagerDuty schedule ID, return the name and contact of the currently on-call engineer. Use to identify who to escalate incidents to."
inputParameters:
- name: schedule_id
in: body
type: string
description: "The PagerDuty schedule ID to query for the current on-call user."
call: pagerduty.get-oncall
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: user_name
type: string
mapping: "$.oncalls[0].user.summary"
- name: user_email
type: string
mapping: "$.oncalls[0].user.email"
- name: escalation_policy
type: string
mapping: "$.oncalls[0].escalation_policy.summary"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.pagerduty_token"
placement: header
resources:
- name: oncalls
path: "/oncalls"
operations:
- name: get-oncall
method: GET
Enrolls patients in Gilead access programs by verifying eligibility, creating enrollment records, notifying case managers, and updating Salesforce.
naftiko: "0.5"
info:
label: "Patient Access Program Enrollment Orchestration"
description: "Enrolls patients in Gilead access programs by verifying eligibility, creating enrollment records, notifying case managers, and updating Salesforce."
tags:
- commercial
- clinical
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: patient-access
port: 8080
tools:
- name: enroll-patient
description: "Given patient ID and program, verify eligibility, create enrollment, and notify. Use for patient access program enrollments."
inputParameters:
- name: patient_id
in: body
type: string
description: "Patient identifier."
- name: program_name
in: body
type: string
description: "Access program name."
steps:
- name: verify-eligibility
type: call
call: salesforce.check-eligibility
with:
patient_id: "{{patient_id}}"
program: "{{program_name}}"
- name: create-enrollment
type: call
call: salesforce.create-enrollment
with:
patient_id: "{{patient_id}}"
program: "{{program_name}}"
- name: create-case
type: call
call: servicenow.create-task
with:
short_description: "Access enrollment: {{patient_id}} - {{program_name}}"
category: "patient_access"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "patient-access"
text: "Patient {{patient_id}} enrolled in {{program_name}}. Eligible: {{verify-eligibility.eligible}}. Case: {{create-case.number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: eligibility
path: "/sobjects/Patient_Access__c"
operations:
- name: check-eligibility
method: GET
- name: create-enrollment
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Pulls current headcount and salary band data from Workday by department and cost center for finance planning.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Pulls current headcount and salary band data from Workday by department and cost center for finance planning."
tags:
- hr
- finance
- workday
- reporting
- headcount
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-by-department
description: "Returns a list of active employees grouped by department and cost center with employment type from Workday. Use for headcount planning and cost analysis."
call: workday.headcount-export
outputParameters:
- name: employees
type: array
mapping: "$.data"
items:
- name: employee_id
type: string
mapping: "$.id"
- name: full_name
type: string
mapping: "$.displayName"
- name: department
type: string
mapping: "$.department"
- name: cost_center
type: string
mapping: "$.costCenter"
- name: employment_type
type: string
mapping: "$.employmentType"
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: "/gilead-sciences/workers"
operations:
- name: headcount-export
method: GET
Orchestrates PK analysis by extracting concentration data, running NCA, and notifying clinical pharmacology.
naftiko: "0.5"
info:
label: "Pharmacokinetics Data Analysis Orchestration"
description: "Orchestrates PK analysis by extracting concentration data, running NCA, and notifying clinical pharmacology."
tags:
- clinical
- rd
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pk-analysis
port: 8080
tools:
- name: run-pk-analysis
description: "Given study ID and analyte, extract PK data, run NCA, and notify. Use for PK analysis."
inputParameters:
- name: study_id
in: body
type: string
description: "Study ID."
- name: analyte
in: body
type: string
description: "Analyte name."
steps:
- name: extract
type: call
call: snowflake.execute-query
with:
query_name: "pk_concentrations"
params: "{{study_id}},{{analyte}}"
- name: nca
type: call
call: snowflake.execute-query
with:
query_name: "pk_nca"
params: "{{study_id}},{{analyte}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "clinical-pharmacology"
text: "PK analysis: {{study_id}} {{analyte}}. Cmax: {{nca.cmax}}. AUC: {{nca.auc}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates periodic safety update reports by aggregating adverse events and complaints.
naftiko: "0.5"
info:
label: "Post-Market Surveillance Report Orchestration"
description: "Generates periodic safety update reports by aggregating adverse events and complaints."
tags:
- regulatory
- quality
- safety
- snowflake
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pms-reporting
port: 8080
tools:
- name: generate-psur
description: "Given product and period, aggregate safety data and generate PSUR. Use for periodic safety reports."
inputParameters:
- name: product_name
in: body
type: string
description: "Product name."
- name: reporting_period
in: body
type: string
description: "Reporting period."
steps:
- name: get-aes
type: call
call: snowflake.execute-query
with:
query_name: "psur_aes"
params: "{{product_name}},{{reporting_period}}"
- name: create-report
type: call
call: veeva-vault.create-document
with:
doc_type: "psur"
product: "{{product_name}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "pharmacovigilance"
text: "PSUR for {{product_name}} ({{reporting_period}}). AEs: {{get-aes.total}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: veeva-vault
baseUri: "https://gilead-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/objects/documents"
operations:
- name: create-document
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers a Power BI commercial dashboard refresh.
naftiko: "0.5"
info:
label: "Power BI Commercial Dashboard Refresh"
description: "Triggers a Power BI commercial dashboard refresh."
tags:
- commercial
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-dashboard
description: "Given dataset ID, trigger refresh. Use for updated commercial metrics."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
call: powerbi.trigger-refresh
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
Triggers a Power BI dataset refresh for the quarterly financial dashboard and posts the completion status to the finance team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Power BI Financial Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the quarterly financial dashboard and posts the completion status to the finance team in Microsoft Teams."
tags:
- finance
- data-analytics
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: finance-reporting
port: 8080
tools:
- name: refresh-financial-dashboard
description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh and notify the finance team in Teams when complete."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace GUID containing the financial dashboard."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset GUID to refresh."
steps:
- name: trigger-refresh
type: call
call: powerbi.refresh-dataset
with:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-finance
type: call
call: msteams.post-refresh-status
with:
channel: "finance-analytics"
text: "Power BI financial dashboard refresh triggered for dataset {{dataset_id}}."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/finance/channels/general/messages"
operations:
- name: post-refresh-status
method: POST
Retrieves a CAPA record from the quality management system.
naftiko: "0.5"
info:
label: "Quality CAPA Status Lookup"
description: "Retrieves a CAPA record from the quality management system."
tags:
- quality
- compliance
- servicenow
capability:
exposes:
- type: mcp
namespace: quality-capa
port: 8080
tools:
- name: get-capa-status
description: "Given a CAPA number, return phase, root cause, and due date. Use when quality tracks CAPA progress."
inputParameters:
- name: capa_number
in: body
type: string
description: "CAPA record number."
call: servicenow.get-capa
with:
number: "{{capa_number}}"
outputParameters:
- name: phase
type: string
mapping: "$.result.phase"
- name: due_date
type: string
mapping: "$.result.due_date"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: capa-records
path: "/table/u_capa?sysparm_query=number={{number}}"
inputParameters:
- name: number
in: query
operations:
- name: get-capa
method: GET
Investigates a quality deviation by pulling batch data, creating investigation tasks, and notifying quality.
naftiko: "0.5"
info:
label: "Quality Deviation Investigation Orchestration"
description: "Investigates a quality deviation by pulling batch data, creating investigation tasks, and notifying quality."
tags:
- quality
- manufacturing
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: deviation-investigation
port: 8080
tools:
- name: initiate-investigation
description: "Given deviation number, pull batch data, create task, and notify. Use when QA escalates deviations."
inputParameters:
- name: deviation_number
in: body
type: string
description: "Deviation number."
steps:
- name: get-deviation
type: call
call: servicenow.get-deviation
with:
number: "{{deviation_number}}"
- name: get-batch
type: call
call: sap-erp.get-batch-record
with:
batch_id: "{{get-deviation.batch_number}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Investigate: {{deviation_number}}"
category: "quality_investigation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "quality"
text: "Investigation for {{deviation_number}}. Batch: {{get-deviation.batch_number}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: deviations
path: "/table/u_deviation"
operations:
- name: get-deviation
method: GET
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_BatchRecord('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-record
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Assembles QBR data from SAP, Salesforce, Workday, and generates a consolidated report.
naftiko: "0.5"
info:
label: "Quarterly Business Review Data Orchestration"
description: "Assembles QBR data from SAP, Salesforce, Workday, and generates a consolidated report."
tags:
- finance
- sales
- hr
- sap
- salesforce
- workday
- snowflake
capability:
exposes:
- type: mcp
namespace: qbr-data
port: 8080
tools:
- name: assemble-qbr
description: "Given business unit and quarter, pull data and generate report. Use for QBR prep."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit."
- name: quarter
in: body
type: string
description: "Fiscal quarter."
steps:
- name: financials
type: call
call: sap-erp.get-pl-summary
with:
unit: "{{business_unit}}"
quarter: "{{quarter}}"
- name: pipeline
type: call
call: salesforce.get-pipeline-summary
with:
unit: "{{business_unit}}"
- name: headcount
type: call
call: workday.get-headcount
with:
unit: "{{business_unit}}"
- name: report
type: call
call: snowflake.execute-query
with:
query_name: "qbr_report"
params: "{{business_unit}},{{quarter}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/FI_PL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pl
path: "/A_PLSummary"
operations:
- name: get-pl-summary
method: GET
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: pipeline
path: "/analytics/reports/pipeline_summary"
operations:
- name: get-pipeline-summary
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: headcount
path: "/headcount"
operations:
- name: get-headcount
method: GET
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Prepares for FDA/EMA audits by gathering CAPAs, deviations, training compliance, and generating a readiness report.
naftiko: "0.5"
info:
label: "Regulatory Audit Preparation Orchestration"
description: "Prepares for FDA/EMA audits by gathering CAPAs, deviations, training compliance, and generating a readiness report."
tags:
- regulatory
- quality
- compliance
- servicenow
- workday
- snowflake
capability:
exposes:
- type: mcp
namespace: audit-preparation
port: 8080
tools:
- name: prepare-audit-package
description: "Given audit type and facility, gather CAPAs, deviations, training, and generate report. Use when quality prepares for audits."
inputParameters:
- name: audit_type
in: body
type: string
description: "Audit type."
- name: facility_code
in: body
type: string
description: "Facility code."
steps:
- name: get-capas
type: call
call: servicenow.query-capas
with:
facility: "{{facility_code}}"
status: "open"
- name: get-deviations
type: call
call: servicenow.query-deviations
with:
facility: "{{facility_code}}"
- name: get-training
type: call
call: workday.get-training-status
with:
facility: "{{facility_code}}"
- name: generate-report
type: call
call: snowflake.execute-query
with:
query_name: "audit_readiness"
params: "{{facility_code}},{{audit_type}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: capas
path: "/table/u_capa"
operations:
- name: query-capas
method: GET
- name: deviations
path: "/table/u_deviation"
operations:
- name: query-deviations
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: training
path: "/training/compliance"
operations:
- name: get-training-status
method: GET
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Compiles a regulatory submission document package by retrieving trial data from Veeva Vault, generating a summary via Anthropic, and uploading the package back to Veeva.
naftiko: "0.5"
info:
label: "Regulatory Submission Document Package"
description: "Compiles a regulatory submission document package by retrieving trial data from Veeva Vault, generating a summary via Anthropic, and uploading the package back to Veeva."
tags:
- regulatory
- veeva
- anthropic
- clinical-trials
- ai
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: build-submission-package
description: "Given a trial ID and submission type, retrieve all trial documents from Veeva Vault, generate an AI-drafted executive summary via Anthropic, and upload the compiled package to Veeva."
inputParameters:
- name: trial_id
in: body
type: string
description: "The Veeva Vault clinical trial ID for the submission."
- name: submission_type
in: body
type: string
description: "Regulatory submission type, e.g. IND, NDA, BLA, MAA."
steps:
- name: get-documents
type: call
call: veeva.list-trial-documents
with:
trial_id: "{{trial_id}}"
- name: generate-summary
type: call
call: anthropic.create-message
with:
model: claude-opus-4-5
prompt: "Summarize the following clinical trial documents for a {{submission_type}} regulatory submission: {{get-documents.document_list}}"
- name: upload-package
type: call
call: veeva.create-document
with:
trial_id: "{{trial_id}}"
document_type: "{{submission_type}}_Package"
content: "{{generate-summary.content}}"
consumes:
- type: http
namespace: veeva
baseUri: "https://gilead.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: trial-documents
path: "/objects/documents"
operations:
- name: list-trial-documents
method: GET
- name: create-document
method: POST
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
Compiles a weekly account health digest from Salesforce for key biopharma accounts and posts it to the commercial ops team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Account Health Digest"
description: "Compiles a weekly account health digest from Salesforce for key biopharma accounts and posts it to the commercial ops team in Microsoft Teams."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: commercial-reporting
port: 8080
tools:
- name: digest-account-health
description: "Retrieve open opportunities, recent activities, and pipeline values for key accounts from Salesforce and post a weekly digest to the commercial Teams channel."
inputParameters:
- name: account_segment
in: body
type: string
description: "The account segment to report on, e.g. Top 50, Strategic Accounts."
steps:
- name: get-opportunities
type: call
call: salesforce.query-opportunities
with:
segment: "{{account_segment}}"
- name: post-digest
type: call
call: msteams.post-account-digest
with:
channel: "commercial-ops"
text: "Weekly account health ({{account_segment}}): {{get-opportunities.total}} open opps, ${{get-opportunities.pipeline_value}} pipeline."
consumes:
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
operations:
- name: query-opportunities
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/commercial/channels/general/messages"
operations:
- name: post-account-digest
method: POST
Retrieves a Salesforce account record by ID.
naftiko: "0.5"
info:
label: "Salesforce Account Lookup"
description: "Retrieves a Salesforce account record by ID."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account
description: "Given account ID, return name, type, and revenue. Use when commercial needs account data."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID."
call: salesforce.get-account
with:
id: "{{account_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
consumes:
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-account
method: GET
When a new Salesforce lead is created, enriches it with company data from ZoomInfo and updates the lead record with enriched fields.
naftiko: "0.5"
info:
label: "Salesforce Lead Enrichment and Qualification"
description: "When a new Salesforce lead is created, enriches it with company data from ZoomInfo and updates the lead record with enriched fields."
tags:
- sales
- crm
- salesforce
- zoominfo
- lead-enrichment
capability:
exposes:
- type: mcp
namespace: crm-sales
port: 8080
tools:
- name: enrich-lead
description: "Given a Salesforce lead ID and company name, fetch company intelligence from ZoomInfo and update the Salesforce lead record with enriched data."
inputParameters:
- name: lead_id
in: body
type: string
description: "The Salesforce lead record ID to enrich."
- name: company_name
in: body
type: string
description: "The company name to look up in ZoomInfo."
steps:
- name: get-company-data
type: call
call: zoominfo.search-company
with:
company_name: "{{company_name}}"
- name: update-lead
type: call
call: salesforce.update-lead
with:
lead_id: "{{lead_id}}"
annual_revenue: "{{get-company-data.revenue}}"
number_of_employees: "{{get-company-data.employee_count}}"
industry: "{{get-company-data.industry}}"
consumes:
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: update-lead
method: PATCH
When a Salesforce opportunity advances to Closed-Won, creates a Jira project epic for the customer onboarding workstream.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Stage Sync to Jira"
description: "When a Salesforce opportunity advances to Closed-Won, creates a Jira project epic for the customer onboarding workstream."
tags:
- sales
- crm
- salesforce
- jira
- onboarding
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: sync-opportunity-to-jira
description: "Given a Salesforce opportunity ID that has reached Closed-Won, create a Jira epic for the customer onboarding workstream and link back the epic key to the Salesforce opportunity."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce Opportunity record ID to sync."
steps:
- name: get-opportunity
type: call
call: salesforce.get-opportunity
with:
opportunity_id: "{{opportunity_id}}"
- name: create-epic
type: call
call: jira.create-epic
with:
project_key: "CS"
summary: "Customer Onboarding: {{get-opportunity.account_name}}"
description: "Salesforce Opp: {{opportunity_id}} | Value: {{get-opportunity.amount}}"
- name: update-opportunity
type: call
call: salesforce-update.patch-opportunity
with:
opportunity_id: "{{opportunity_id}}"
jira_epic_key: "{{create-epic.key}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-epic
method: POST
- type: http
namespace: salesforce-update
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: patch-opportunity
method: PATCH
Manages contract renewals by checking expiring contracts, creating tasks, and notifying procurement.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Renewal Orchestration"
description: "Manages contract renewals by checking expiring contracts, creating tasks, and notifying procurement."
tags:
- procurement
- sap-ariba
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: process-renewal
description: "Given contract ID, check terms, create task, and notify. Use for contract renewals."
inputParameters:
- name: contract_id
in: body
type: string
description: "Contract ID."
steps:
- name: get-contract
type: call
call: ariba.get-contract
with:
id: "{{contract_id}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Renew: {{get-contract.title}}"
due_date: "{{get-contract.expiry_date}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "procurement"
text: "Contract {{contract_id}} expiring {{get-contract.expiry_date}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a sourcing event in SAP Ariba for competitive bidding.
naftiko: "0.5"
info:
label: "SAP Ariba Sourcing Event Creation"
description: "Creates a sourcing event in SAP Ariba for competitive bidding."
tags:
- procurement
- sap-ariba
capability:
exposes:
- type: mcp
namespace: strategic-sourcing
port: 8080
tools:
- name: create-sourcing-event
description: "Given category and description, create sourcing event. Use for competitive bidding."
inputParameters:
- name: category
in: body
type: string
description: "Sourcing category."
- name: description
in: body
type: string
description: "Description."
call: ariba.create-event
with:
category: "{{category}}"
description: "{{description}}"
outputParameters:
- name: event_id
type: string
mapping: "$.data.eventId"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/sourcing-projects/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
Initiates a new supplier onboarding workflow in SAP Ariba, creates a ServiceNow vendor request ticket, and notifies the procurement team in Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Onboarding"
description: "Initiates a new supplier onboarding workflow in SAP Ariba, creates a ServiceNow vendor request ticket, and notifies the procurement team in Microsoft Teams."
tags:
- procurement
- sap-ariba
- servicenow
- microsoft-teams
- supplier-management
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: onboard-supplier
description: "Given a supplier name and contact email, register the supplier in SAP Ariba, create a ServiceNow vendor onboarding ticket, and notify procurement in Teams."
inputParameters:
- name: supplier_name
in: body
type: string
description: "The legal name of the supplier to onboard."
- name: supplier_email
in: body
type: string
description: "Primary contact email for the new supplier."
- name: spend_category
in: body
type: string
description: "The SAP Ariba spend category for this supplier, e.g. IT Services, Lab Supplies."
steps:
- name: register-supplier
type: call
call: ariba.create-supplier
with:
name: "{{supplier_name}}"
email: "{{supplier_email}}"
category: "{{spend_category}}"
- name: create-vendor-ticket
type: call
call: servicenow.create-vendor-request
with:
short_description: "New supplier onboarding: {{supplier_name}}"
supplier_id: "{{register-supplier.supplier_id}}"
- name: notify-procurement
type: call
call: msteams.notify-procurement
with:
channel: "procurement-ops"
text: "New supplier {{supplier_name}} registered in Ariba ({{register-supplier.supplier_id}}). SN ticket: {{create-vendor-ticket.number}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers"
operations:
- name: create-supplier
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: vendor-requests
path: "/table/u_vendor_request"
operations:
- name: create-vendor-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/procurement/channels/general/messages"
operations:
- name: notify-procurement
method: POST
Retrieves a pending SAP Concur travel request, validates it against travel policy via Anthropic, and routes it for approval in ServiceNow.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Approval"
description: "Retrieves a pending SAP Concur travel request, validates it against travel policy via Anthropic, and routes it for approval in ServiceNow."
tags:
- finance
- travel
- sap-concur
- servicenow
- approval
capability:
exposes:
- type: mcp
namespace: travel-ops
port: 8080
tools:
- name: route-travel-approval
description: "Given a SAP Concur travel request ID, validate the request against policy using Anthropic and create a ServiceNow approval task for the finance team."
inputParameters:
- name: request_id
in: body
type: string
description: "The SAP Concur travel request ID to review and route."
steps:
- name: get-travel-request
type: call
call: concur.get-travel-request
with:
request_id: "{{request_id}}"
- name: validate-policy
type: call
call: anthropic.validate-travel
with:
model: claude-opus-4-5
prompt: "Review this travel request for policy compliance: {{get-travel-request.details}}"
- name: create-approval
type: call
call: servicenow.create-travel-approval
with:
short_description: "Travel approval: {{get-travel-request.traveler_name}} — {{get-travel-request.destination}}"
policy_notes: "{{validate-policy.compliance_notes}}"
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: travel-requests
path: "/travelrequest/requests/{{request_id}}"
inputParameters:
- name: request_id
in: path
operations:
- name: get-travel-request
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: validate-travel
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: approvals
path: "/table/sysapproval_approver"
operations:
- name: create-travel-approval
method: POST
Retrieves a travel request from SAP Concur.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Lookup"
description: "Retrieves a travel request from SAP Concur."
tags:
- finance
- travel
- sap-concur
capability:
exposes:
- type: mcp
namespace: travel
port: 8080
tools:
- name: get-travel-request
description: "Given request ID, return destination and approval status. Use for travel visibility."
inputParameters:
- name: request_id
in: body
type: string
description: "Concur request ID."
call: concur.get-request
with:
id: "{{request_id}}"
outputParameters:
- name: destination
type: string
mapping: "$.MainDestination"
- name: status
type: string
mapping: "$.ApprovalStatusName"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: requests
path: "/travelrequest/requests/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-request
method: GET
Retrieves budget vs actual for an SAP cost center.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Lookup"
description: "Retrieves budget vs actual for an SAP cost center."
tags:
- finance
- erp
- sap
capability:
exposes:
- type: mcp
namespace: cost-center-budget
port: 8080
tools:
- name: get-budget
description: "Given cost center and period, return planned and actual spend. Use for budget visibility."
inputParameters:
- name: cost_center
in: body
type: string
description: "SAP cost center."
- name: fiscal_period
in: body
type: string
description: "Fiscal period."
call: sap-erp.get-budget
with:
cost_center: "{{cost_center}}"
period: "{{fiscal_period}}"
outputParameters:
- name: planned_budget
type: number
mapping: "$.d.PlannedAmount"
- name: actual_spend
type: number
mapping: "$.d.ActualAmount"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/FI_CO_BUDGET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budgets
path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',Period='{{period}}')"
inputParameters:
- name: cost_center
in: path
- name: period
in: path
operations:
- name: get-budget
method: GET
Posts a goods receipt in SAP for inbound API or excipient deliveries.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts a goods receipt in SAP for inbound API or excipient deliveries."
tags:
- supply-chain
- sap
capability:
exposes:
- type: mcp
namespace: goods-receipt
port: 8080
tools:
- name: post-goods-receipt
description: "Given delivery number, post goods receipt. Use when warehouse confirms material receipt."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP delivery number."
call: sap-erp.post-gr
with:
delivery: "{{delivery_number}}"
outputParameters:
- name: material_document
type: string
mapping: "$.d.MaterialDocument"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_GR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: goods-receipts
path: "/A_GoodsReceipt"
operations:
- name: post-gr
method: POST
Queries SAP for current inventory levels of an API or drug product material.
naftiko: "0.5"
info:
label: "SAP Inventory Level Check"
description: "Queries SAP for current inventory levels of an API or drug product material."
tags:
- supply-chain
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: inventory-management
port: 8080
tools:
- name: get-inventory-level
description: "Given material number and plant code, return unrestricted stock and reserved quantity. Use when supply chain checks stock."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: plant_code
in: body
type: string
description: "SAP plant code."
call: sap-erp.get-material-stock
with:
material: "{{material_number}}"
plant: "{{plant_code}}"
outputParameters:
- name: unrestricted_stock
type: number
mapping: "$.d.UnrestrictedStock"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-stock
path: "/A_MaterialStock(Material='{{material}}',Plant='{{plant}}')"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-material-stock
method: GET
Creates a preventive maintenance order in SAP for pharma manufacturing equipment.
naftiko: "0.5"
info:
label: "SAP Maintenance Order Creation"
description: "Creates a preventive maintenance order in SAP for pharma manufacturing equipment."
tags:
- manufacturing
- maintenance
- sap
capability:
exposes:
- type: mcp
namespace: plant-maintenance
port: 8080
tools:
- name: create-pm-order
description: "Given equipment ID and type, create PM order. Use for equipment servicing."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment ID."
- name: maintenance_type
in: body
type: string
description: "Maintenance type."
call: sap-erp.create-pm-order
with:
equipment: "{{equipment_id}}"
order_type: "{{maintenance_type}}"
outputParameters:
- name: order_number
type: string
mapping: "$.d.MaintenanceOrder"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PM_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: orders
path: "/A_MaintenanceOrder"
operations:
- name: create-pm-order
method: POST
Retrieves material master data from SAP.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP."
tags:
- supply-chain
- erp
- sap
capability:
exposes:
- type: mcp
namespace: material-master
port: 8080
tools:
- name: get-material-master
description: "Given material number, return description and UoM. Use for material details."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
call: sap-erp.get-material
with:
material: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-material
method: GET
Retrieves a production order from SAP with status, quantities, and schedule.
naftiko: "0.5"
info:
label: "SAP Production Order Status Lookup"
description: "Retrieves a production order from SAP with status, quantities, and schedule."
tags:
- manufacturing
- erp
- sap
capability:
exposes:
- type: mcp
namespace: production-orders
port: 8080
tools:
- name: get-production-order
description: "Given an order number, return status and quantities. Use when manufacturing checks orders."
inputParameters:
- name: order_number
in: body
type: string
description: "SAP production order."
call: sap-erp.get-prod-order
with:
order: "{{order_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OrderStatus"
- name: planned_quantity
type: number
mapping: "$.d.PlannedQuantity"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order}}')"
inputParameters:
- name: order
in: path
operations:
- name: get-prod-order
method: GET
Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor, and total value.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up a SAP S/4HANA purchase order by PO number and returns header status, vendor, and total value."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp-finance
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, return the header status, vendor name, total amount, and currency from SAP S/4HANA. Use for procurement status checks."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500001234."
call: sap.get-po
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves quality inspection lot details from SAP.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP."
tags:
- quality
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: quality-inspection
port: 8080
tools:
- name: get-inspection-lot
description: "Given inspection lot number, return status and usage decision. Use for QC review."
inputParameters:
- name: inspection_lot
in: body
type: string
description: "Inspection lot number."
call: sap-erp.get-inspection
with:
lot: "{{inspection_lot}}"
outputParameters:
- name: status
type: string
mapping: "$.d.InspectionLotStatus"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: lots
path: "/A_InspectionLot('{{lot}}')"
inputParameters:
- name: lot
in: path
operations:
- name: get-inspection
method: GET
Queries SAP for vendor payment status by invoice number.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Status Lookup"
description: "Queries SAP for vendor payment status by invoice number."
tags:
- finance
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: vendor-payments
port: 8080
tools:
- name: get-payment-status
description: "Given invoice number, return payment status and date. Use when AP verifies payments."
inputParameters:
- name: invoice_number
in: body
type: string
description: "SAP invoice number."
call: sap-erp.get-invoice-payment
with:
invoice: "{{invoice_number}}"
outputParameters:
- name: payment_status
type: string
mapping: "$.d.PaymentStatus"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/FI_AP_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_Invoice('{{invoice}}')/payments"
inputParameters:
- name: invoice
in: path
operations:
- name: get-invoice-payment
method: GET
Creates a security incident, isolates affected endpoint, and notifies SOC when a critical threat is confirmed.
naftiko: "0.5"
info:
label: "Security Incident Response Orchestration"
description: "Creates a security incident, isolates affected endpoint, and notifies SOC when a critical threat is confirmed."
tags:
- security
- it
- crowdstrike
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-response
port: 8080
tools:
- name: respond-to-security-incident
description: "Given detection ID and hostname, create incident, isolate endpoint, and notify SOC. Use when SOC confirms a threat."
inputParameters:
- name: detection_id
in: body
type: string
description: "CrowdStrike detection ID."
- name: hostname
in: body
type: string
description: "Affected hostname."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Security: threat on {{hostname}}"
category: "security"
priority: "1"
- name: isolate
type: call
call: crowdstrike.contain-host
with:
hostname: "{{hostname}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "security-ops"
text: "CRITICAL: {{create-incident.number}} - Host {{hostname}} isolated. Detection: {{detection_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.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: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: hosts
path: "/devices/entities/host-actions/v2"
operations:
- name: contain-host
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Submits a change request in ServiceNow for infrastructure changes, routes to the CAB for approval, and notifies stakeholders in Microsoft Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Management Approval"
description: "Submits a change request in ServiceNow for infrastructure changes, routes to the CAB for approval, and notifies stakeholders in Microsoft Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: submit-change-request
description: "Given change details, create a ServiceNow change request, assign it to the CAB group, and notify approvers in Microsoft Teams."
inputParameters:
- name: short_description
in: body
type: string
description: "A brief description of the infrastructure change being requested."
- name: change_type
in: body
type: string
description: "The ServiceNow change type: normal, standard, or emergency."
- name: risk_level
in: body
type: string
description: "Risk level of the change: low, medium, high."
- name: approver_email
in: body
type: string
description: "Email of the primary change approver to notify in Teams."
steps:
- name: create-change
type: call
call: servicenow.create-change-request
with:
short_description: "{{short_description}}"
type: "{{change_type}}"
risk: "{{risk_level}}"
assignment_group: "CAB"
- name: notify-approver
type: call
call: msteams.notify-approver
with:
recipient: "{{approver_email}}"
text: "Change request {{create-change.number}} requires your approval: {{short_description}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://gilead.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-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: notify-approver
method: POST
Retrieves status and assignment for a ServiceNow incident.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves status and assignment for a ServiceNow incident."
tags:
- it
- servicenow
capability:
exposes:
- type: mcp
namespace: it-incidents
port: 8080
tools:
- name: get-incident-status
description: "Given an incident number, return state, priority, and assigned group. Use when IT checks ticket status."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow 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://gilead.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={{number}}"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
Searches Gilead SharePoint document libraries by keyword.
naftiko: "0.5"
info:
label: "SharePoint Document Search"
description: "Searches Gilead SharePoint document libraries by keyword."
tags:
- documentation
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-search
port: 8080
tools:
- name: search-docs
description: "Given search query, return matching documents. Use for document search."
inputParameters:
- name: query
in: body
type: string
description: "Search keywords."
call: sharepoint.search
with:
querytext: "{{query}}"
outputParameters:
- name: result_count
type: integer
mapping: "$.PrimaryQueryResult.RelevantResults.TotalRows"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://gilead.sharepoint.com/_api"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: search
path: "/search/query?querytext='{{querytext}}'"
inputParameters:
- name: querytext
in: query
operations:
- name: search
method: GET
Runs a data quality validation query on Snowflake clinical trial data and posts the results to the data engineering team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Snowflake Clinical Data Quality Check"
description: "Runs a data quality validation query on Snowflake clinical trial data and posts the results to the data engineering team in Microsoft Teams."
tags:
- data-analytics
- clinical-trials
- snowflake
- microsoft-teams
- data-quality
capability:
exposes:
- type: mcp
namespace: clinical-data-ops
port: 8080
tools:
- name: run-clinical-data-quality
description: "Given a Snowflake database and table name containing clinical trial data, execute a data quality check and post the completeness and anomaly report to Teams."
inputParameters:
- name: database
in: body
type: string
description: "The Snowflake database name containing clinical trial data."
- name: table_name
in: body
type: string
description: "The Snowflake table to run quality checks against."
steps:
- name: run-quality-query
type: call
call: snowflake.execute-statement
with:
database: "{{database}}"
statement: "SELECT COUNT(*) as total, COUNT_IF(patient_id IS NULL) as missing_ids FROM {{table_name}}"
- name: post-results
type: call
call: msteams.post-quality-report
with:
channel: "clinical-data-eng"
text: "Data quality check on {{table_name}}: Total={{run-quality-query.total}}, Missing IDs={{run-quality-query.missing_ids}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/data-engineering/channels/clinical/messages"
operations:
- name: post-quality-report
method: POST
Checks Snowflake query performance and pipeline task status, raises a Datadog alert for any failing tasks, and creates a Jira incident ticket.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Health Monitor"
description: "Checks Snowflake query performance and pipeline task status, raises a Datadog alert for any failing tasks, and creates a Jira incident ticket."
tags:
- data-analytics
- snowflake
- datadog
- jira
- monitoring
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: monitor-pipeline-health
description: "Given a Snowflake account and task name, retrieve the task execution history, raise a Datadog alert for failures, and create a Jira incident for any failed runs."
inputParameters:
- name: task_name
in: body
type: string
description: "The Snowflake task name to check execution history for."
- name: account_identifier
in: body
type: string
description: "The Snowflake account identifier, e.g. gilead.us-east-1."
steps:
- name: get-task-history
type: call
call: snowflake.get-task-history
with:
task_name: "{{task_name}}"
- name: raise-dd-alert
type: call
call: datadog.create-event
with:
title: "Snowflake task failure: {{task_name}}"
text: "Task {{task_name}} failed. Last run: {{get-task-history.last_run_state}}"
alert_type: "error"
- name: open-jira-incident
type: call
call: jira.create-data-incident
with:
project_key: "DATA"
summary: "Snowflake task failure: {{task_name}}"
description: "Account: {{account_identifier}}\nTask: {{task_name}}\nState: {{get-task-history.last_run_state}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/GILEAD_DB/schemas/PIPELINES/tasks/{{task_name}}/executeHistory"
inputParameters:
- name: task_name
in: path
operations:
- name: get-task-history
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-data-incident
method: POST
Monitors drug product stability studies by checking timepoint results and notifying the stability team.
naftiko: "0.5"
info:
label: "Stability Study Monitoring Orchestration"
description: "Monitors drug product stability studies by checking timepoint results and notifying the stability team."
tags:
- quality
- rd
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: stability-monitoring
port: 8080
tools:
- name: check-stability
description: "Given protocol ID and timepoint, check results and notify. Use for stability timepoint reviews."
inputParameters:
- name: protocol_id
in: body
type: string
description: "Stability protocol ID."
- name: timepoint
in: body
type: string
description: "Timepoint in months."
steps:
- name: get-results
type: call
call: snowflake.execute-query
with:
query_name: "stability_results"
params: "{{protocol_id}},{{timepoint}}"
- name: check-trends
type: call
call: snowflake.execute-query
with:
query_name: "stability_trends"
params: "{{protocol_id}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "stability"
text: "Stability {{protocol_id}} T={{timepoint}}mo: All pass: {{get-results.all_pass}}. Trend: {{check-trends.trend_flag}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates a supplier quality scorecard pulling rejection rates, audit findings, and delivery performance.
naftiko: "0.5"
info:
label: "Supplier Quality Scorecard Generation"
description: "Generates a supplier quality scorecard pulling rejection rates, audit findings, and delivery performance."
tags:
- quality
- procurement
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: supplier-quality
port: 8080
tools:
- name: generate-supplier-scorecard
description: "Given a supplier ID, gather quality data and calculate scorecard. Use when procurement evaluates suppliers."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP vendor number."
steps:
- name: get-rejections
type: call
call: sap-erp.get-supplier-rejections
with:
vendor_id: "{{supplier_id}}"
- name: get-audits
type: call
call: servicenow.query-supplier-audits
with:
supplier_id: "{{supplier_id}}"
- name: calculate
type: call
call: snowflake.execute-query
with:
query_name: "supplier_scorecard"
params: "{{supplier_id}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: rejections
path: "/A_VendorRejection(Vendor='{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-supplier-rejections
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: audits
path: "/table/u_supplier_audit"
operations:
- name: query-supplier-audits
method: GET
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Identifies impacted POs, creates sourcing tasks, and notifies procurement when a supply disruption occurs.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Response Orchestration"
description: "Identifies impacted POs, creates sourcing tasks, and notifies procurement when a supply disruption occurs."
tags:
- supply-chain
- procurement
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-disruption
port: 8080
tools:
- name: respond-to-disruption
description: "Given supplier ID and disruption type, identify impacted POs, create tasks, and alert. Use for supply disruptions."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP vendor number."
- name: disruption_type
in: body
type: string
description: "Disruption type."
steps:
- name: get-pos
type: call
call: sap-erp.query-open-pos
with:
vendor_id: "{{supplier_id}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Alt sourcing: {{disruption_type}} from {{supplier_id}}"
priority: "1"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "supply-chain"
text: "DISRUPTION: Vendor {{supplier_id}}. POs: {{get-pos.count}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pos
path: "/A_PurchaseOrder"
operations:
- name: query-open-pos
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers a Tableau quality metrics dashboard refresh.
naftiko: "0.5"
info:
label: "Tableau Quality Dashboard Refresh"
description: "Triggers a Tableau quality metrics dashboard refresh."
tags:
- quality
- analytics
- tableau
capability:
exposes:
- type: mcp
namespace: quality-analytics
port: 8080
tools:
- name: refresh-quality-dashboard
description: "Given workbook name, trigger refresh. Use for quality metrics."
inputParameters:
- name: workbook_name
in: body
type: string
description: "Tableau workbook."
call: tableau.trigger-refresh
with:
workbook: "{{workbook_name}}"
outputParameters:
- name: job_id
type: string
mapping: "$.job.id"
consumes:
- type: http
namespace: tableau
baseUri: "https://gilead.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook}}/refresh"
inputParameters:
- name: workbook
in: path
operations:
- name: trigger-refresh
method: POST
Provisions a cloud environment with Terraform, configures monitoring, registers CMDB, and notifies DevOps.
naftiko: "0.5"
info:
label: "Terraform Environment Provisioning Orchestration"
description: "Provisions a cloud environment with Terraform, configures monitoring, registers CMDB, and notifies DevOps."
tags:
- devops
- cloud
- terraform
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-provisioning
port: 8080
tools:
- name: provision-environment
description: "Given environment name and workspace, provision infrastructure and notify. Use for new environments."
inputParameters:
- name: environment_name
in: body
type: string
description: "Environment name."
- name: workspace_id
in: body
type: string
description: "Terraform workspace ID."
steps:
- name: terraform
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
message: "Provisioning {{environment_name}}"
- name: monitoring
type: call
call: datadog.create-monitor
with:
name: "{{environment_name}} health"
- name: cmdb
type: call
call: servicenow.create-ci
with:
name: "{{environment_name}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "devops"
text: "Environment {{environment_name}} provisioning started. Run: {{terraform.run_id}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/workspaces/{{workspace_id}}/runs"
inputParameters:
- name: workspace_id
in: path
operations:
- name: create-run
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor"
operations:
- name: create-monitor
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb
path: "/table/cmdb_ci"
operations:
- name: create-ci
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a quality event is logged in Veeva Vault QualityDocs, creates a corresponding Jira CAPA task and notifies the quality team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Veeva Quality Event to Jira Tracker"
description: "When a quality event is logged in Veeva Vault QualityDocs, creates a corresponding Jira CAPA task and notifies the quality team in Microsoft Teams."
tags:
- quality
- veeva
- jira
- microsoft-teams
- capa
capability:
exposes:
- type: mcp
namespace: quality-ops
port: 8080
tools:
- name: create-capa-from-quality-event
description: "Given a Veeva Vault quality event ID, retrieve event details, create a Jira CAPA issue, and notify the quality team in Teams."
inputParameters:
- name: quality_event_id
in: body
type: string
description: "The Veeva Vault quality event record ID."
steps:
- name: get-quality-event
type: call
call: veeva.get-quality-event
with:
event_id: "{{quality_event_id}}"
- name: create-capa
type: call
call: jira.create-capa
with:
project_key: "QA"
summary: "CAPA: {{get-quality-event.title}}"
description: "Veeva Event ID: {{quality_event_id}}\nSeverity: {{get-quality-event.severity}}\nCategory: {{get-quality-event.category}}"
- name: notify-quality-team
type: call
call: msteams.notify-quality
with:
channel: "quality-ops"
text: "New CAPA created from Veeva quality event {{quality_event_id}}: {{create-capa.key}}"
consumes:
- type: http
namespace: veeva
baseUri: "https://gilead.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: quality-events
path: "/objects/quality_event__v/{{event_id}}"
inputParameters:
- name: event_id
in: path
operations:
- name: get-quality-event
method: GET
- type: http
namespace: jira
baseUri: "https://gilead.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-capa
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/quality/channels/general/messages"
operations:
- name: notify-quality
method: POST
Retrieves a regulatory or quality document from Veeva Vault by document number.
naftiko: "0.5"
info:
label: "Veeva Vault Document Retrieval"
description: "Retrieves a regulatory or quality document from Veeva Vault by document number."
tags:
- regulatory
- quality
- veeva-vault
capability:
exposes:
- type: mcp
namespace: vault-documents
port: 8080
tools:
- name: get-vault-document
description: "Given a document number, return metadata, version, and lifecycle state. Use for regulated document retrieval."
inputParameters:
- name: document_number
in: body
type: string
description: "Veeva Vault document number."
call: veeva-vault.get-document
with:
doc_number: "{{document_number}}"
outputParameters:
- name: title
type: string
mapping: "$.data.name__v"
- name: version
type: string
mapping: "$.data.major_version_number__v"
- name: lifecycle_state
type: string
mapping: "$.data.status__v"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://gilead-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: documents
path: "/objects/documents/{{doc_number}}"
inputParameters:
- name: doc_number
in: path
operations:
- name: get-document
method: GET
Retrieves the latest version and audit trail of a regulatory document from Veeva Vault for compliance tracking.
naftiko: "0.5"
info:
label: "Veeva Vault Document Version Tracker"
description: "Retrieves the latest version and audit trail of a regulatory document from Veeva Vault for compliance tracking."
tags:
- regulatory
- compliance
- veeva
- reporting
capability:
exposes:
- type: mcp
namespace: veeva-docs
port: 8080
tools:
- name: get-document-version
description: "Given a Veeva Vault document ID, return the current version, status, and last-modified audit trail for compliance reporting."
inputParameters:
- name: document_id
in: body
type: string
description: "The Veeva Vault document ID to look up."
call: veeva.get-document
with:
document_id: "{{document_id}}"
outputParameters:
- name: version
type: string
mapping: "$.data[0].major_version_number__v"
- name: status
type: string
mapping: "$.data[0].status__v"
- name: modified_date
type: string
mapping: "$.data[0].modified_date__v"
- name: modified_by
type: string
mapping: "$.data[0].modified_by__v"
consumes:
- type: http
namespace: veeva
baseUri: "https://gilead.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
Performs vendor risk assessment by querying financials, compliance, and calculating risk score.
naftiko: "0.5"
info:
label: "Vendor Risk Assessment Orchestration"
description: "Performs vendor risk assessment by querying financials, compliance, and calculating risk score."
tags:
- procurement
- compliance
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: vendor-risk
port: 8080
tools:
- name: assess-vendor-risk
description: "Given vendor ID, collect data and calculate risk. Use for vendor evaluation."
inputParameters:
- name: vendor_id
in: body
type: string
description: "SAP vendor number."
steps:
- name: get-financials
type: call
call: sap-erp.get-vendor-master
with:
vendor_id: "{{vendor_id}}"
- name: get-compliance
type: call
call: servicenow.query-vendor-compliance
with:
vendor_id: "{{vendor_id}}"
- name: score
type: call
call: snowflake.execute-query
with:
query_name: "vendor_risk_score"
params: "{{vendor_id}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://gilead-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_Vendor('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor-master
method: GET
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: compliance
path: "/table/u_vendor_compliance"
operations:
- name: query-vendor-compliance
method: GET
- type: http
namespace: snowflake
baseUri: "https://gilead.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves employee benefits enrollment status.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Status"
description: "Retrieves employee benefits enrollment status."
tags:
- hr
- benefits
- workday
capability:
exposes:
- type: mcp
namespace: benefits
port: 8080
tools:
- name: get-benefits
description: "Given worker ID, return benefits elections. Use to check benefits."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
call: workday.get-benefits
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: medical_plan
type: string
mapping: "$.data.medical_plan"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: benefits
path: "/workers/{{worker_id}}/benefits"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-benefits
method: GET
Launches compensation review by pulling performance data, generating recommendations, and notifying managers.
naftiko: "0.5"
info:
label: "Workday Compensation Review Orchestration"
description: "Launches compensation review by pulling performance data, generating recommendations, and notifying managers."
tags:
- hr
- finance
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: comp-review
port: 8080
tools:
- name: launch-comp-review
description: "Given department and cycle, pull performance, generate recs, and notify. Use for annual comp reviews."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
- name: cycle_name
in: body
type: string
description: "Cycle name."
steps:
- name: get-performance
type: call
call: workday.get-performance-ratings
with:
department: "{{department_code}}"
- name: generate-recs
type: call
call: workday.create-comp-recommendations
with:
department: "{{department_code}}"
cycle: "{{cycle_name}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "Comp review: {{department_code}}"
assigned_group: "HR_Compensation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-comp"
text: "Comp review '{{cycle_name}}' launched for {{department_code}}. Task: {{create-task.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: performance
path: "/performance/ratings"
operations:
- name: get-performance-ratings
method: GET
- name: compensation
path: "/compensation/recommendations"
operations:
- name: create-comp-recommendations
method: POST
- type: http
namespace: servicenow
baseUri: "https://gilead.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves an employee profile from Workday by worker ID.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves an employee profile from Workday by worker ID."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-profile
port: 8080
tools:
- name: get-employee-profile
description: "Given a worker ID, return name, department, title, and location. Use when HR needs employee details."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.data.full_name"
- name: department
type: string
mapping: "$.data.department"
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 open job requisitions from Workday by department.
naftiko: "0.5"
info:
label: "Workday Open Requisition Report"
description: "Retrieves open job requisitions from Workday by department."
tags:
- hr
- recruiting
- workday
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: get-open-reqs
description: "Given department, return open requisition count. Use for recruiting visibility."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
call: workday.get-requisitions
with:
department: "{{department_code}}"
outputParameters:
- name: open_count
type: integer
mapping: "$.data.total"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/recruiting/requisitions"
operations:
- name: get-requisitions
method: GET
Initiates the annual performance review cycle in Workday by creating review tasks for all active employees and notifying managers in Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Performance Review Cycle Launcher"
description: "Initiates the annual performance review cycle in Workday by creating review tasks for all active employees and notifying managers in Microsoft Teams."
tags:
- hr
- performance-management
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-performance
port: 8080
tools:
- name: launch-review-cycle
description: "Given a review cycle name and due date, create performance review tasks in Workday for all active employees and send manager notifications via Teams."
inputParameters:
- name: cycle_name
in: body
type: string
description: "The performance review cycle name, e.g. 2026 Annual Review."
- name: due_date
in: body
type: string
description: "Due date for review completion in YYYY-MM-DD format."
steps:
- name: create-review-cycle
type: call
call: workday.create-review-event
with:
cycle_name: "{{cycle_name}}"
due_date: "{{due_date}}"
- name: notify-managers
type: call
call: msteams.broadcast-review-launch
with:
channel: "people-managers"
text: "Performance review cycle '{{cycle_name}}' is now open. Completion due: {{due_date}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: review-events
path: "/gilead-sciences/performanceReviews"
operations:
- name: create-review-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/hr/channels/managers/messages"
operations:
- name: broadcast-review-launch
method: POST
When an employee changes role in Workday, updates their Okta group memberships and adjusts Salesforce profile permissions accordingly.
naftiko: "0.5"
info:
label: "Workday Role Change and Access Provisioning"
description: "When an employee changes role in Workday, updates their Okta group memberships and adjusts Salesforce profile permissions accordingly."
tags:
- hr
- identity
- workday
- okta
- salesforce
- access-management
capability:
exposes:
- type: mcp
namespace: hr-access
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday employee ID, new job title, and new department, update Okta group memberships and Salesforce profile to match the new role."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID of the employee changing roles."
- name: okta_user_id
in: body
type: string
description: "The Okta user ID for group assignment updates."
- name: new_okta_group_id
in: body
type: string
description: "The new Okta group ID to assign based on the new role."
- name: salesforce_profile_id
in: body
type: string
description: "The Salesforce profile ID matching the new job function."
steps:
- name: assign-okta-group
type: call
call: okta.add-user-to-group
with:
user_id: "{{okta_user_id}}"
group_id: "{{new_okta_group_id}}"
- name: update-sf-profile
type: call
call: salesforce.update-user-profile
with:
workday_id: "{{workday_employee_id}}"
profile_id: "{{salesforce_profile_id}}"
consumes:
- type: http
namespace: okta
baseUri: "https://gilead.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{group_id}}/users/{{user_id}}"
inputParameters:
- name: group_id
in: path
- name: user_id
in: path
operations:
- name: add-user-to-group
method: PUT
- type: http
namespace: salesforce
baseUri: "https://gilead.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{workday_id}}"
inputParameters:
- name: workday_id
in: path
operations:
- name: update-user-profile
method: PATCH