Amgen Capabilities
Naftiko 0.5 capability definitions for Amgen - 100 capabilities showing integration workflows and service orchestrations.
Submits a clinical study report from Veeva Vault to OpenAI for summarization and stores the structured summary back in SharePoint for regulatory affairs teams.
naftiko: "0.5"
info:
label: "AI Document Summarization for Clinical Reports"
description: "Submits a clinical study report from Veeva Vault to OpenAI for summarization and stores the structured summary back in SharePoint for regulatory affairs teams."
tags:
- ai
- clinical-trials
- veeva
- openai
- sharepoint
capability:
exposes:
- type: mcp
namespace: ai-clinical
port: 8080
tools:
- name: summarize-clinical-report
description: "Given a Veeva Vault document ID for a clinical report, retrieve the document, submit it to OpenAI for a structured summary, and store the result in SharePoint."
inputParameters:
- name: vault_doc_id
in: body
type: string
description: "The Veeva Vault document ID for the clinical study report."
- name: sharepoint_site_id
in: body
type: string
description: "The SharePoint site ID where the summary should be stored."
steps:
- name: get-vault-document
type: call
call: "veeva-ai.get-document"
with:
doc_id: "{{vault_doc_id}}"
- name: generate-summary
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "Summarize the following clinical study report in structured format with sections for Objective, Methods, Results, and Conclusion: {{get-vault-document.content}}"
- name: store-summary
type: call
call: "sharepoint-ai.create-file"
with:
site_id: "{{sharepoint_site_id}}"
file_name: "summary_{{vault_doc_id}}.txt"
content: "{{generate-summary.text}}"
consumes:
- type: http
namespace: veeva-ai
baseUri: "https://amgen.veevavault.com/api/v23.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: 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
- type: http
namespace: sharepoint-ai
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/items/root:/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_name
in: path
operations:
- name: create-file
method: PUT
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 a UPN, return Azure AD group memberships. Use when IT audits user group assignments."
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 current month spend by resource group.
naftiko: "0.5"
info:
label: "Azure Resource Cost Lookup"
description: "Queries Azure Cost Management for current month spend by resource group."
tags:
- it
- cloud
- microsoft-azure
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: get-resource-group-cost
description: "Given an Azure resource group, return current month spend and budget utilization. Use when FinOps needs cost visibility."
inputParameters:
- name: resource_group
in: body
type: string
description: "Azure resource group name."
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-management
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{rg_name}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: rg_name
in: path
operations:
- name: get-cost-summary
method: POST
When a serious adverse event is reported for a biologic therapy, logs it in the safety database, notifies pharmacovigilance, creates a regulatory filing task, and updates the CTMS.
naftiko: "0.5"
info:
label: "Biologic Drug Adverse Event Reporting Orchestration"
description: "When a serious adverse event is reported for a biologic therapy, logs it in the safety database, notifies pharmacovigilance, creates a regulatory filing task, and updates the CTMS."
tags:
- clinical
- regulatory
- safety
- oracle
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: drug-safety
port: 8080
tools:
- name: report-adverse-event
description: "Given a study ID, patient ID, event description, and severity, log the event, alert pharmacovigilance, create filing task, and update CTMS. Use when clinical sites report serious adverse events."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
- name: patient_id
in: body
type: string
description: "Patient subject identifier."
- name: event_description
in: body
type: string
description: "Description of the adverse event."
- name: severity
in: body
type: string
description: "Severity: mild, moderate, severe, life-threatening."
steps:
- name: log-safety-event
type: call
call: oracle-argus.create-case
with:
study_id: "{{study_id}}"
subject_id: "{{patient_id}}"
description: "{{event_description}}"
seriousness: "{{severity}}"
- name: notify-pharmacovigilance
type: call
call: msteams.send-message
with:
channel_id: "pharmacovigilance"
text: "SAE Alert - Study {{study_id}}, Patient {{patient_id}}: {{event_description}} ({{severity}}). Argus case: {{log-safety-event.case_number}}"
- name: create-regulatory-task
type: call
call: servicenow.create-task
with:
short_description: "Regulatory SAE report - {{log-safety-event.case_number}}"
category: "regulatory_filing"
priority: "1"
assigned_group: "Drug_Safety"
consumes:
- type: http
namespace: oracle-argus
baseUri: "https://amgen-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://amgen.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
Monitors bioreactor fermentation parameters and when out-of-spec conditions occur, creates a deviation, alerts manufacturing, and logs data in the process historian.
naftiko: "0.5"
info:
label: "Bioprocess Fermentation Monitoring Orchestration"
description: "Monitors bioreactor fermentation parameters and when out-of-spec conditions occur, creates a deviation, alerts manufacturing, and logs data in the process historian."
tags:
- manufacturing
- quality
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: bioprocess-monitoring
port: 8080
tools:
- name: handle-fermentation-excursion
description: "Given a bioreactor ID, parameter name, and measured value, create a deviation, alert the team, and log data. Use when bioreactor monitoring detects out-of-spec conditions."
inputParameters:
- name: bioreactor_id
in: body
type: string
description: "Bioreactor identifier."
- name: parameter_name
in: body
type: string
description: "Parameter name: pH, dissolved_oxygen, temperature, agitation."
- name: measured_value
in: body
type: string
description: "The measured out-of-spec value."
steps:
- name: create-deviation
type: call
call: servicenow.create-deviation
with:
description: "Fermentation excursion: {{parameter_name}} = {{measured_value}} at bioreactor {{bioreactor_id}}"
area: "bioprocess"
priority: "2"
- name: log-event
type: call
call: sap-erp.create-process-event
with:
equipment: "{{bioreactor_id}}"
parameter: "{{parameter_name}}"
value: "{{measured_value}}"
- name: alert-team
type: call
call: msteams.send-message
with:
channel_id: "bioprocess-ops"
text: "ALERT: Bioreactor {{bioreactor_id}} - {{parameter_name}} excursion: {{measured_value}}. Deviation: {{create-deviation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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://amgen-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: events
path: "/A_ProcessEvent"
operations:
- name: create-process-event
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
Orchestrates bioreactor scale-up validation by comparing process parameters across scales, generating equivalency reports, and notifying process development.
naftiko: "0.5"
info:
label: "Bioreactor Scale-Up Validation Orchestration"
description: "Orchestrates bioreactor scale-up validation by comparing process parameters across scales, generating equivalency reports, and notifying process development."
tags:
- manufacturing
- rd
- quality
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: scale-up-validation
port: 8080
tools:
- name: validate-scale-up
description: "Given small-scale and large-scale batch IDs, compare process parameters, generate equivalency report, and notify team. Use when process development validates scale-up."
inputParameters:
- name: small_scale_batch
in: body
type: string
description: "Small-scale batch identifier."
- name: large_scale_batch
in: body
type: string
description: "Large-scale batch identifier."
steps:
- name: compare-parameters
type: call
call: snowflake.execute-query
with:
query_name: "scale_up_comparison"
params: "{{small_scale_batch}},{{large_scale_batch}}"
- name: create-validation-record
type: call
call: servicenow.create-task
with:
short_description: "Scale-up validation: {{small_scale_batch}} vs {{large_scale_batch}}"
category: "process_validation"
assigned_group: "Process_Development"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "process-development"
text: "Scale-up comparison complete. Titer equivalence: {{compare-parameters.titer_equivalence}}%. CQA within spec: {{compare-parameters.cqa_pass}}. Task: {{create-validation-record.number}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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://amgen.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
Generates a competitive intelligence report on biosimilar market activity by querying Snowflake analytics for patent expirations, competitor filings, and market share data.
naftiko: "0.5"
info:
label: "Biosimilar Competitive Intelligence Report"
description: "Generates a competitive intelligence report on biosimilar market activity by querying Snowflake analytics for patent expirations, competitor filings, and market share data."
tags:
- commercial
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: competitive-intel
port: 8080
tools:
- name: get-biosimilar-report
description: "Given a therapeutic area and molecule name, return competitive landscape data including biosimilar filings, patent status, and market share. Use when commercial strategy needs competitive intelligence."
inputParameters:
- name: therapeutic_area
in: body
type: string
description: "Therapeutic area, e.g. 'oncology', 'inflammation'."
- name: molecule_name
in: body
type: string
description: "Reference molecule name."
call: snowflake.execute-query
with:
query_name: "biosimilar_competitive_report"
params: "{{therapeutic_area}},{{molecule_name}}"
outputParameters:
- name: biosimilar_count
type: integer
mapping: "$.data[0].biosimilar_count"
- name: market_share
type: number
mapping: "$.data[0].originator_market_share"
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Uploads a document to a Box folder and returns the file ID and link.
naftiko: "0.5"
info:
label: "Box Regulatory File Upload"
description: "Uploads a document to a Box folder and returns the file ID and link."
tags:
- regulatory
- documentation
- box
capability:
exposes:
- type: mcp
namespace: file-storage
port: 8080
tools:
- name: upload-to-box
description: "Given a folder ID and file name, upload to Box. Use when teams store documents in Box."
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
Tracks cell line development milestones by querying the LIMS for clone data, updating Jira tasks, and notifying the cell biology team.
naftiko: "0.5"
info:
label: "Cell Line Development Tracking Orchestration"
description: "Tracks cell line development milestones by querying the LIMS for clone data, updating Jira tasks, and notifying the cell biology team."
tags:
- rd
- manufacturing
- jira
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cell-line-dev
port: 8080
tools:
- name: update-cell-line-status
description: "Given a cell line ID, query clone selection data, update Jira, and notify the team. Use when cell biology reaches development milestones."
inputParameters:
- name: cell_line_id
in: body
type: string
description: "Cell line identifier."
steps:
- name: get-clone-data
type: call
call: snowflake.execute-query
with:
query_name: "cell_line_clone_data"
params: "{{cell_line_id}}"
- name: update-jira
type: call
call: jira.update-issue
with:
issue_key: "CLD-{{cell_line_id}}"
status: "{{get-clone-data.current_stage}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "cell-biology"
text: "Cell line {{cell_line_id}} update: Stage {{get-clone-data.current_stage}}. Top clone titer: {{get-clone-data.top_titer}} g/L."
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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: jira
baseUri: "https://amgen.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: update-issue
method: PUT
- 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 ServiceNow change request for infrastructure changes, routes it to the CAB board, and notifies requestors in Teams upon approval or rejection.
naftiko: "0.5"
info:
label: "Change Management Approval Workflow"
description: "Creates a ServiceNow change request for infrastructure changes, routes it to the CAB board, and notifies requestors in Teams upon approval or rejection."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: create-change-request
description: "Given change details, create a ServiceNow change request and notify the requestor in Teams. Use for any infrastructure or application change requiring CAB approval."
inputParameters:
- name: short_description
in: body
type: string
description: "Brief description of the change, e.g. Upgrade Kubernetes cluster to v1.30."
- name: change_type
in: body
type: string
description: "Change type: normal, standard, or emergency."
- name: risk_level
in: body
type: string
description: "Risk level: low, medium, high, or critical."
- name: requestor_upn
in: body
type: string
description: "The UPN of the change requestor for Teams notification."
steps:
- name: create-cr
type: call
call: "servicenow-chg.create-change"
with:
short_description: "{{short_description}}"
type: "{{change_type}}"
risk: "{{risk_level}}"
assignment_group: "CAB"
- name: notify-requestor
type: call
call: "msteams-chg.send-message"
with:
recipient_upn: "{{requestor_upn}}"
message: "Your change request has been submitted: {{create-cr.number}}. Type: {{change_type}}. Risk: {{risk_level}}. Pending CAB review."
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams-chg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Orchestrates clinical database lock by running data quality checks, generating discrepancy reports, locking the database, and notifying biostatistics.
naftiko: "0.5"
info:
label: "Clinical Data Lock Orchestration"
description: "Orchestrates clinical database lock by running data quality checks, generating discrepancy reports, locking the database, and notifying biostatistics."
tags:
- clinical
- rd
- snowflake
- oracle
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-data-lock
port: 8080
tools:
- name: execute-database-lock
description: "Given a study ID and lock date, run quality checks, generate reports, lock database, and notify biostat. Use when clinical data management locks a study database."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
- name: lock_date
in: body
type: string
description: "Target lock date YYYY-MM-DD."
steps:
- name: run-quality-checks
type: call
call: snowflake.execute-query
with:
query_name: "clinical_data_quality_check"
params: "{{study_id}}"
- name: lock-database
type: call
call: oracle-clinical.lock-study
with:
study_id: "{{study_id}}"
lock_date: "{{lock_date}}"
- name: notify-biostat
type: call
call: msteams.send-message
with:
channel_id: "biostatistics"
text: "Study {{study_id}} database locked as of {{lock_date}}. Open queries: {{run-quality-checks.open_query_count}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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://amgen-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 approval, provisioning site access, scheduling initiation visit, and notifying clinical operations.
naftiko: "0.5"
info:
label: "Clinical Site Activation Orchestration"
description: "Activates a clinical trial site by verifying IRB approval, provisioning site access, scheduling initiation visit, and notifying clinical operations."
tags:
- clinical
- rd
- oracle
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: site-activation
port: 8080
tools:
- name: activate-clinical-site
description: "Given a study ID and site ID, verify IRB, provision access, schedule visit, and notify ops. Use when clinical ops activates a trial site."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
- name: site_id
in: body
type: string
description: "Clinical 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-ops
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://amgen-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://amgen.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 the clinical trial management system for patient enrollment counts, site-level progress, and projected completion for a study.
naftiko: "0.5"
info:
label: "Clinical Trial Patient Enrollment Tracker"
description: "Queries the clinical trial management system for patient enrollment counts, site-level progress, and projected completion for a study."
tags:
- clinical
- rd
- oracle
capability:
exposes:
- type: mcp
namespace: clinical-enrollment
port: 8080
tools:
- name: get-enrollment-status
description: "Given a clinical study ID, return enrollment count, target, site breakdown, 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"
- name: projected_completion
type: string
mapping: "$.data.projected_completion_date"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://amgen-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, updating CTMS, and notifying the site coordinator.
naftiko: "0.5"
info:
label: "Clinical Trial Randomization Orchestration"
description: "Randomizes a patient into a clinical trial arm by verifying eligibility, executing randomization, updating CTMS, and notifying the site coordinator."
tags:
- clinical
- rd
- oracle
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: trial-randomization
port: 8080
tools:
- name: randomize-patient
description: "Given a study ID, site ID, and patient ID, verify eligibility, randomize, update CTMS, and notify. Use when sites randomize patients into clinical trials."
inputParameters:
- name: study_id
in: body
type: string
description: "Study identifier."
- name: site_id
in: body
type: string
description: "Site identifier."
- name: patient_id
in: body
type: string
description: "Patient identifier."
steps:
- name: verify-eligibility
type: call
call: oracle-clinical.check-eligibility
with:
study_id: "{{study_id}}"
patient_id: "{{patient_id}}"
- name: execute-randomization
type: call
call: oracle-clinical.randomize
with:
study_id: "{{study_id}}"
site_id: "{{site_id}}"
patient_id: "{{patient_id}}"
- name: notify-site
type: call
call: msteams.send-message
with:
channel_id: "clinical-sites"
text: "Patient {{patient_id}} randomized in study {{study_id}} at site {{site_id}}. Arm: {{execute-randomization.treatment_arm}}. Kit: {{execute-randomization.kit_number}}."
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://amgen-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
When a new clinical trial site is approved in Veeva Vault, creates a ServiceNow task for site setup, notifies the clinical operations team in Teams, and logs the activation in Salesforce.
naftiko: "0.5"
info:
label: "Clinical Trial Site Activation"
description: "When a new clinical trial site is approved in Veeva Vault, creates a ServiceNow task for site setup, notifies the clinical operations team in Teams, and logs the activation in Salesforce."
tags:
- clinical-trials
- veeva
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: activate-trial-site
description: "Given a Veeva Vault study ID and site ID, create a ServiceNow setup task, log the site in Salesforce, and notify the clinical operations team via Teams."
inputParameters:
- name: vault_study_id
in: body
type: string
description: "The Veeva Vault study document ID for the clinical trial."
- name: site_id
in: body
type: string
description: "The clinical site identifier to be activated."
- name: site_name
in: body
type: string
description: "The human-readable name of the clinical trial site."
steps:
- name: create-setup-task
type: call
call: "servicenow-clin.create-task"
with:
short_description: "Site activation: {{site_name}} for study {{vault_study_id}}"
assignment_group: "Clinical_Operations"
- name: log-in-salesforce
type: call
call: "salesforce-clin.create-record"
with:
object_type: "Clinical_Site__c"
study_id: "{{vault_study_id}}"
site_id: "{{site_id}}"
site_name: "{{site_name}}"
status: "Activated"
- name: notify-team
type: call
call: "msteams-clin.post-channel-message"
with:
channel_id: "clinical-ops-alerts"
message: "Site {{site_name}} (ID: {{site_id}}) activated for study {{vault_study_id}}. ServiceNow task: {{create-setup-task.number}}."
consumes:
- type: http
namespace: servicenow-clin
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: salesforce-clin
baseUri: "https://amgen.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/{{object_type}}"
inputParameters:
- name: object_type
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: msteams-clin
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow ticket for FinOps review, and posts a summary to the finance alerts Teams channel.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Responder"
description: "When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow ticket for FinOps review, and posts a summary to the finance alerts Teams channel."
tags:
- finops
- cloud
- aws
- datadog
- servicenow
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-cost-anomaly
description: "Given an AWS cost anomaly ID, affected service, and estimated overage, create a Datadog event annotation, open a ServiceNow FinOps ticket, and notify the finance channel in Teams."
inputParameters:
- name: anomaly_id
in: body
type: string
description: "The AWS Cost Anomaly Detection anomaly ID."
- name: aws_service
in: body
type: string
description: "The AWS service generating the anomaly, e.g. EC2, S3, RDS."
- name: estimated_overage_usd
in: body
type: number
description: "Estimated dollar overage detected."
- name: business_unit
in: body
type: string
description: "The Amgen business unit owning the AWS account."
steps:
- name: annotate-datadog
type: call
call: "datadog-finops.create-event"
with:
title: "AWS Cost Anomaly: {{aws_service}}"
text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}} — BU: {{business_unit}}"
alert_type: "warning"
- name: create-finops-ticket
type: call
call: "servicenow-finops.create-incident"
with:
short_description: "AWS cost anomaly on {{aws_service}} — ${{estimated_overage_usd}} overage"
description: "Anomaly {{anomaly_id}} on {{aws_service}} for {{business_unit}}. Datadog event: {{annotate-datadog.id}}."
assignment_group: "FinOps"
- name: notify-finance
type: call
call: "msteams-finops.post-channel-message"
with:
channel_id: "cloud-finance-alerts"
message: "AWS Cost Anomaly: {{aws_service}} | Overage: ${{estimated_overage_usd}} | BU: {{business_unit}} | Ticket: {{create-finops-ticket.number}}"
consumes:
- type: http
namespace: datadog-finops
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: servicenow-finops
baseUri: "https://amgen.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-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a cold chain temperature excursion is detected during biologic shipment, creates a deviation, quarantines the batch, notifies quality, and initiates stability assessment.
naftiko: "0.5"
info:
label: "Cold Chain Temperature Excursion Orchestration"
description: "When a cold chain temperature excursion is detected during biologic shipment, creates a deviation, quarantines the batch, notifies quality, and initiates stability assessment."
tags:
- supply-chain
- quality
- manufacturing
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cold-chain
port: 8080
tools:
- name: handle-temp-excursion
description: "Given a shipment ID, batch number, and temperature reading, create deviation, quarantine batch, notify quality, and start assessment. Use when cold chain monitoring detects temperature breach."
inputParameters:
- name: shipment_id
in: body
type: string
description: "Shipment tracking identifier."
- name: batch_number
in: body
type: string
description: "Affected batch number."
- name: temperature_reading
in: body
type: string
description: "Recorded temperature reading."
steps:
- name: create-deviation
type: call
call: servicenow.create-deviation
with:
description: "Cold chain excursion: Shipment {{shipment_id}}, Batch {{batch_number}}, Temp {{temperature_reading}}"
area: "cold_chain"
priority: "1"
- name: quarantine-batch
type: call
call: sap-erp.update-batch-status
with:
batch: "{{batch_number}}"
status: "quarantine"
- name: notify-quality
type: call
call: msteams.send-message
with:
channel_id: "quality-supply-chain"
text: "COLD CHAIN ALERT: Shipment {{shipment_id}}, Batch {{batch_number}} quarantined. Temp: {{temperature_reading}}. Deviation: {{create-deviation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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://amgen-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 a compliance document review by retrieving the document, creating reviewer tasks, and notifying reviewers.
naftiko: "0.5"
info:
label: "Compliance Document Review Orchestration"
description: "Initiates a compliance document review by retrieving the document, creating reviewer tasks, and notifying reviewers."
tags:
- compliance
- quality
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance-review
port: 8080
tools:
- name: initiate-document-review
description: "Given a document ID and deadline, create review tasks and notify reviewers. Use when quality initiates document reviews."
inputParameters:
- name: document_id
in: body
type: string
description: "Veeva Vault document ID."
- name: review_deadline
in: body
type: string
description: "Review deadline YYYY-MM-DD."
steps:
- name: get-document
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-document.title}}"
category: "compliance_review"
due_date: "{{review_deadline}}"
assigned_group: "Quality_Compliance"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "compliance-reviews"
text: "Document review: {{get-document.title}} (v{{get-document.version}}). Due: {{review_deadline}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://amgen-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://amgen.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 a standard operating procedure from Confluence by page ID.
naftiko: "0.5"
info:
label: "Confluence SOP Retrieval"
description: "Retrieves a standard operating procedure from Confluence by page ID."
tags:
- quality
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: sop-library
port: 8080
tools:
- name: get-sop
description: "Given a Confluence page ID, return title, version, and last updated date. Use when staff references 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://amgen.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 threat detections on a specific endpoint.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Lookup"
description: "Queries CrowdStrike for threat detections on a specific endpoint."
tags:
- security
- endpoint
- crowdstrike
capability:
exposes:
- type: mcp
namespace: endpoint-security
port: 8080
tools:
- name: get-endpoint-threats
description: "Given a hostname, return active detections and severity. Use when security investigates alerts."
inputParameters:
- name: hostname
in: body
type: string
description: "Endpoint 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
When CrowdStrike detects a high-severity endpoint detection, creates a ServiceNow security incident, isolates the endpoint via CrowdStrike API, and alerts the SOC team in Teams.
naftiko: "0.5"
info:
label: "CrowdStrike Security Alert Triage"
description: "When CrowdStrike detects a high-severity endpoint detection, creates a ServiceNow security incident, isolates the endpoint via CrowdStrike API, and alerts the SOC team in Teams."
tags:
- security
- crowdstrike
- servicenow
- incident-response
- soc
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: handle-endpoint-detection
description: "Given a CrowdStrike detection ID and host ID, create a ServiceNow security incident, isolate the host via CrowdStrike, and alert the SOC channel in Teams."
inputParameters:
- name: detection_id
in: body
type: string
description: "The CrowdStrike detection ID."
- name: host_id
in: body
type: string
description: "The CrowdStrike host/device ID for the affected endpoint."
- name: severity
in: body
type: string
description: "Detection severity: critical, high, medium, or low."
steps:
- name: create-security-incident
type: call
call: "servicenow-soc.create-incident"
with:
short_description: "CrowdStrike detection {{detection_id}} — {{severity}} severity"
category: "security"
assignment_group: "SOC"
urgency: "1"
- name: isolate-host
type: call
call: "crowdstrike.contain-host"
with:
host_id: "{{host_id}}"
- name: alert-soc
type: call
call: "msteams-soc.post-channel-message"
with:
channel_id: "soc-alerts"
message: "SECURITY ALERT: CrowdStrike detection {{detection_id}} ({{severity}}) on host {{host_id}}. Host isolated. Incident: {{create-security-incident.number}}."
consumes:
- type: http
namespace: servicenow-soc
baseUri: "https://amgen.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: host-containment
path: "/devices/entities/devices-actions/v2"
operations:
- name: contain-host
method: POST
- type: http
namespace: msteams-soc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Deploys a machine learning model from Databricks to production by registering, creating a change request, and notifying the data science team.
naftiko: "0.5"
info:
label: "Databricks ML Model Deployment Orchestration"
description: "Deploys a machine learning model from Databricks to production by registering, creating a change request, and notifying the data science team."
tags:
- rd
- ai
- databricks
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ml-deployment
port: 8080
tools:
- name: deploy-ml-model
description: "Given a model name and version, register in production, create change request, and notify team. Use when data science deploys a model."
inputParameters:
- name: model_name
in: body
type: string
description: "Databricks model name."
- name: model_version
in: body
type: string
description: "Model version number."
steps:
- name: register-model
type: call
call: databricks.register-model-version
with:
name: "{{model_name}}"
version: "{{model_version}}"
stage: "Production"
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "ML model: {{model_name}} v{{model_version}}"
category: "application"
assigned_group: "Data_Science"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "data-science"
text: "Model {{model_name}} v{{model_version}} deployed. Change: {{create-change.number}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://amgen.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://amgen.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 status, returning uptime, error rate, and active alerts.
naftiko: "0.5"
info:
label: "Datadog Application Health Check"
description: "Queries Datadog for application health status, returning uptime, error rate, and active alerts."
tags:
- it
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: app-monitoring
port: 8080
tools:
- name: get-app-health
description: "Given a service name, return uptime, error rate, and active alert count. Use when SRE needs 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"
- name: error_rate
type: number
mapping: "$.data.error_rate"
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
Retrieves the current health status of Amgen's monitored infrastructure hosts and services from Datadog, returning a consolidated health snapshot.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Check"
description: "Retrieves the current health status of Amgen's monitored infrastructure hosts and services from Datadog, returning a consolidated health snapshot."
tags:
- observability
- datadog
- monitoring
- infrastructure
capability:
exposes:
- type: mcp
namespace: infra-monitoring
port: 8080
tools:
- name: get-infrastructure-health
description: "Query Datadog for the current status of all monitored hosts and active alerts. Returns a health summary suitable for ops dashboards and incident triage."
inputParameters:
- name: environment
in: body
type: string
description: "The deployment environment to query: production, staging, or development."
call: "datadog.list-monitors"
with:
tags: "env:{{environment}}"
outputParameters:
- name: monitors
type: array
mapping: "$.monitors"
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"
operations:
- name: list-monitors
method: GET
inputParameters:
- name: tags
in: query
Sends a contract for electronic signature via DocuSign, updates Salesforce, and notifies legal upon completion.
naftiko: "0.5"
info:
label: "DocuSign Contract Execution Orchestration"
description: "Sends a contract for electronic signature via DocuSign, updates Salesforce, and notifies legal upon completion."
tags:
- legal
- sales
- docusign
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-execution
port: 8080
tools:
- name: send-contract-for-signature
description: "Given a Salesforce opportunity ID and template, send contract via DocuSign, update CRM, and notify legal. Use when commercial executes a contract."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
- name: template_id
in: body
type: string
description: "DocuSign template ID."
steps:
- name: get-opportunity
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-opportunity.contact_email}}"
signer_name: "{{get-opportunity.contact_name}}"
- name: update-crm
type: call
call: salesforce.update-opportunity
with:
opp_id: "{{opportunity_id}}"
contract_status: "Sent for Signature"
- name: notify-legal
type: call
call: msteams.send-message
with:
channel_id: "legal-contracts"
text: "Contract sent for {{get-opportunity.account_name}} via DocuSign. Envelope: {{send-envelope.envelope_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://amgen.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
Retrieves the current development phase and key milestones for a drug molecule in the pipeline tracking system.
naftiko: "0.5"
info:
label: "Drug Molecule Pipeline Status Lookup"
description: "Retrieves the current development phase and key milestones for a drug molecule in the pipeline tracking system."
tags:
- rd
- clinical
- snowflake
capability:
exposes:
- type: mcp
namespace: pipeline-tracker
port: 8080
tools:
- name: get-molecule-status
description: "Given a molecule ID, return the development phase, next milestone, and projected timeline. Use when R&D leadership needs pipeline visibility."
inputParameters:
- name: molecule_id
in: body
type: string
description: "Internal molecule identifier."
call: snowflake.execute-query
with:
query_name: "molecule_pipeline_status"
params: "{{molecule_id}}"
outputParameters:
- name: phase
type: string
mapping: "$.data[0].phase"
- name: next_milestone
type: string
mapping: "$.data[0].next_milestone"
- name: projected_date
type: string
mapping: "$.data[0].projected_date"
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Manages drug product lot release by checking QC results, verifying stability data, generating the certificate of analysis, and notifying distribution.
naftiko: "0.5"
info:
label: "Drug Product Lot Release Orchestration"
description: "Manages drug product lot release by checking QC results, verifying stability data, generating the certificate of analysis, and notifying distribution."
tags:
- quality
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lot-release
port: 8080
tools:
- name: release-drug-product-lot
description: "Given a batch number and product code, verify QC, check stability, create CoA, and notify distribution. Use when QA releases a drug product lot."
inputParameters:
- name: batch_number
in: body
type: string
description: "Batch number."
- name: product_code
in: body
type: string
description: "Drug product code."
steps:
- name: get-qc-results
type: call
call: sap-erp.get-inspection
with:
batch: "{{batch_number}}"
material: "{{product_code}}"
- name: release-batch
type: call
call: sap-erp.release-batch
with:
batch: "{{batch_number}}"
status: "released"
- name: create-coa-task
type: call
call: servicenow.create-task
with:
short_description: "CoA: Batch {{batch_number}} - {{product_code}}"
category: "quality_release"
assigned_group: "Quality_Assurance"
- name: notify-distribution
type: call
call: msteams.send-message
with:
channel_id: "drug-product-distribution"
text: "Lot {{batch_number}} ({{product_code}}) released. QC: {{get-qc-results.result}}. CoA task: {{create-coa-task.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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://amgen.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
When a pharmacovigilance signal is flagged in the safety database, creates a ServiceNow case for medical affairs review and notifies the drug safety team in Teams.
naftiko: "0.5"
info:
label: "Drug Safety Signal Notification"
description: "When a pharmacovigilance signal is flagged in the safety database, creates a ServiceNow case for medical affairs review and notifies the drug safety team in Teams."
tags:
- pharmacovigilance
- drug-safety
- servicenow
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: drug-safety
port: 8080
tools:
- name: notify-safety-signal
description: "Given a drug safety signal ID and product name, create a ServiceNow case for medical affairs review and notify the pharmacovigilance team in Teams."
inputParameters:
- name: signal_id
in: body
type: string
description: "The pharmacovigilance safety signal identifier."
- name: product_name
in: body
type: string
description: "The Amgen product name associated with the signal."
- name: signal_type
in: body
type: string
description: "The type of safety signal, e.g. adverse_event, labeling_update."
- name: severity
in: body
type: string
description: "Signal severity: serious, non-serious."
steps:
- name: create-safety-case
type: call
call: "servicenow-safety.create-case"
with:
short_description: "Safety signal: {{product_name}} — {{signal_type}} ({{severity}})"
category: "pharmacovigilance"
assignment_group: "Medical_Affairs"
description: "Signal ID: {{signal_id}}. Product: {{product_name}}. Type: {{signal_type}}. Severity: {{severity}}."
- name: notify-pv-team
type: call
call: "msteams-safety.post-channel-message"
with:
channel_id: "drug-safety-alerts"
message: "Safety Signal: {{product_name}} | Type: {{signal_type}} | Severity: {{severity}} | Case: {{create-safety-case.number}}"
consumes:
- type: http
namespace: servicenow-safety
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cases
path: "/table/sn_customerservice_case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-safety
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an employee termination is recorded in Workday, revokes Microsoft 365 access, closes all open ServiceNow tickets assigned to the user, and notifies the HR business partner via Teams.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When an employee termination is recorded in Workday, revokes Microsoft 365 access, closes all open ServiceNow tickets assigned to the user, and notifies the HR business partner via Teams."
tags:
- hr
- offboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-employee-offboarding
description: "Given a Workday employee ID and termination date, revoke Microsoft 365 licenses, disable the Azure AD account, close open ServiceNow tickets, and alert the HR business partner in Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "The effective termination date in ISO 8601 format."
- name: hr_bp_upn
in: body
type: string
description: "The UPN of the HR business partner to notify, e.g. jsmith@amgen.com."
steps:
- name: get-worker
type: call
call: "workday-off.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: disable-account
type: call
call: "msgraph-off.disable-user"
with:
user_principal_name: "{{get-worker.work_email}}"
- name: revoke-licenses
type: call
call: "msgraph-off.remove-license"
with:
user_principal_name: "{{get-worker.work_email}}"
- name: notify-hr-bp
type: call
call: "msteams-off.send-message"
with:
recipient_upn: "{{hr_bp_upn}}"
message: "Offboarding complete for {{get-worker.full_name}} (termination: {{termination_date}}). M365 access revoked."
consumes:
- type: http
namespace: workday-off
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/amgen/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_principal_name}}"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: disable-user
method: PATCH
- name: remove-license
method: POST
- type: http
namespace: msteams-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message to the new employee.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message to the new employee."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-employee-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Microsoft Teams, and Microsoft Graph. Creates the onboarding ticket, grants M365 license, and sends a welcome message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire, e.g. WD-00123."
- name: start_date
in: body
type: string
description: "The employee start date in ISO 8601 format, e.g. 2026-04-01."
- name: department
in: body
type: string
description: "The business department the new hire is joining, e.g. Research & Development."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-onboarding-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.full_name}}"
category: "hr_onboarding"
assignment_group: "IT_Onboarding"
caller_id: "{{get-worker.work_email}}"
- name: provision-m365
type: call
call: "msgraph.assign-license"
with:
user_principal_name: "{{get-worker.work_email}}"
sku_id: "enterprisepack"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
message: "Welcome to Amgen, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-onboarding-ticket.number}}. Your Microsoft 365 access has been provisioned."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/amgen/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://amgen.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: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-licenses
path: "/users/{{user_principal_name}}/assignLicense"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: assign-license
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When an employee transfers between departments, updates Workday, re-provisions Okta groups, transfers assets, and notifies managers.
naftiko: "0.5"
info:
label: "Employee Transfer Orchestration"
description: "When an employee transfers between departments, updates Workday, re-provisions Okta groups, transfers assets, and notifies managers."
tags:
- hr
- identity
- workday
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-transfer
port: 8080
tools:
- name: process-employee-transfer
description: "Given a worker ID and target department, update records, re-provision access, transfer assets, and notify. Use when HR processes a transfer."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
- name: target_department
in: body
type: string
description: "Target department code."
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}}"
new_department: "{{target_department}}"
- name: transfer-assets
type: call
call: servicenow.transfer-assets
with:
user_id: "{{worker_id}}"
new_department: "{{target_department}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-operations"
text: "Transfer: {{get-employee.first_name}} {{get-employee.last_name}} to {{target_department}}. Access and assets updated."
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://amgen.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://amgen.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
Retrieves the current status of an Investigational New Drug application from the regulatory tracking system by IND number.
naftiko: "0.5"
info:
label: "FDA IND Submission Status Lookup"
description: "Retrieves the current status of an Investigational New Drug application from the regulatory tracking system by IND number."
tags:
- regulatory
- clinical
- veeva-vault
capability:
exposes:
- type: mcp
namespace: regulatory-submissions
port: 8080
tools:
- name: get-ind-status
description: "Given an IND number, return the current review status, FDA division, and expected response date. Use when regulatory affairs checks IND submission progress."
inputParameters:
- name: ind_number
in: body
type: string
description: "FDA IND application number."
call: veeva-vault.get-submission
with:
ind_number: "{{ind_number}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: fda_division
type: string
mapping: "$.data.review_division"
- name: expected_response
type: string
mapping: "$.data.target_date"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://amgen-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: submissions
path: "/objects/submission__c/{{ind_number}}"
inputParameters:
- name: ind_number
in: path
operations:
- name: get-submission
method: GET
On a GitHub Actions pipeline failure on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering team in Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Response"
description: "On a GitHub Actions pipeline failure on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering team in Microsoft Teams."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-cicd
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow run failure event, create a Datadog deployment marker, open a Jira bug for engineering triage, and alert the engineering channel in Teams."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name in org/repo format, e.g. amgen/bioinfo-pipeline."
- name: workflow_name
in: body
type: string
description: "The name of the GitHub Actions workflow that failed."
- name: branch_name
in: body
type: string
description: "The branch where the failure occurred."
- name: commit_sha
in: body
type: string
description: "The commit SHA that triggered the workflow."
- name: run_url
in: body
type: string
description: "URL to the failed GitHub Actions workflow run."
steps:
- name: create-dd-marker
type: call
call: "datadog-cicd.create-event"
with:
title: "Pipeline failure: {{repo_name}}"
text: "Workflow {{workflow_name}} failed on {{branch_name}} at {{commit_sha}}"
alert_type: "error"
- name: create-jira-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo_name}} / {{branch_name}} — {{workflow_name}}"
description: "Pipeline failure on {{branch_name}}. Commit: {{commit_sha}}. Run: {{run_url}}. Datadog: {{create-dd-marker.id}}."
- name: notify-engineering
type: call
call: "msteams-cicd.post-channel-message"
with:
channel_id: "engineering-alerts"
message: "Pipeline Failure: {{repo_name}} | Branch: {{branch_name}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
consumes:
- type: http
namespace: datadog-cicd
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://amgen.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-cicd
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks a GitHub repository for branch protection, required reviewers, and security scanning configuration.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks a GitHub repository for branch protection, required reviewers, and security scanning configuration."
tags:
- security
- devops
- github
capability:
exposes:
- type: mcp
namespace: repo-compliance
port: 8080
tools:
- name: check-repo-compliance
description: "Given a repo name, return branch protection status and security scanning enablement. Use when engineering verifies repo governance."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository name in org/repo format."
call: github.get-repo-settings
with:
repo: "{{repo_name}}"
outputParameters:
- name: branch_protection_enabled
type: boolean
mapping: "$.data.branch_protection"
- name: security_scanning
type: boolean
mapping: "$.data.security_scanning_enabled"
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
When GitHub Advanced Security finds a critical code scanning alert, automatically creates a Jira security issue and notifies the security engineering team in Teams.
naftiko: "0.5"
info:
label: "GitHub Security Scan to Jira"
description: "When GitHub Advanced Security finds a critical code scanning alert, automatically creates a Jira security issue and notifies the security engineering team in Teams."
tags:
- security
- devops
- github
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: appsec
port: 8080
tools:
- name: handle-code-scanning-alert
description: "Given a GitHub code scanning alert ID and repository, create a Jira security issue for remediation and notify the AppSec team in Teams."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository in org/repo format."
- name: alert_number
in: body
type: integer
description: "The GitHub code scanning alert number."
- name: alert_severity
in: body
type: string
description: "Alert severity: critical, high, medium, or low."
- name: rule_description
in: body
type: string
description: "The code scanning rule description."
steps:
- name: get-alert
type: call
call: "github.get-code-scanning-alert"
with:
repo: "{{repo_name}}"
alert_number: "{{alert_number}}"
- name: create-security-issue
type: call
call: "jira-appsec.create-issue"
with:
project_key: "SEC"
issuetype: "Security Vulnerability"
summary: "[{{alert_severity}}] {{rule_description}} in {{repo_name}}"
description: "GitHub alert #{{alert_number}} in {{repo_name}}. Rule: {{rule_description}}. File: {{get-alert.file_path}}."
- name: notify-appsec
type: call
call: "msteams-appsec.post-channel-message"
with:
channel_id: "appsec-alerts"
message: "Code Scan Alert: {{repo_name}} | {{alert_severity}} | {{rule_description}} | Jira: {{create-security-issue.key}}"
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/{{alert_number}}"
inputParameters:
- name: repo
in: path
- name: alert_number
in: path
operations:
- name: get-code-scanning-alert
method: GET
- type: http
namespace: jira-appsec
baseUri: "https://amgen.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-appsec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks GMP training compliance for a department by querying Workday Learning.
naftiko: "0.5"
info:
label: "GMP Training Compliance Check"
description: "Checks GMP training compliance for a department by querying Workday Learning."
tags:
- quality
- compliance
- workday
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-gmp-compliance
description: "Given a department code, return GMP training completion rate and overdue count. Use when quality needs training visibility."
inputParameters:
- name: department_code
in: body
type: string
description: "Workday department code."
call: workday.get-training-compliance
with:
department: "{{department_code}}"
training_type: "gmp"
outputParameters:
- name: completion_rate
type: number
mapping: "$.data.completion_rate"
- name: overdue_count
type: integer
mapping: "$.data.overdue_count"
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 the current GxP validation status for a regulated system from ServiceNow, returning validation lifecycle details for compliance reporting.
naftiko: "0.5"
info:
label: "GxP System Validation Status Check"
description: "Retrieves the current GxP validation status for a regulated system from ServiceNow, returning validation lifecycle details for compliance reporting."
tags:
- compliance
- gxp
- validation
- servicenow
- regulatory
capability:
exposes:
- type: mcp
namespace: gxp-compliance
port: 8080
tools:
- name: get-system-validation-status
description: "Given a GxP system name or CMDB CI ID, retrieve its current validation status, last qualification date, and next revalidation due date from ServiceNow."
inputParameters:
- name: system_ci_id
in: body
type: string
description: "The ServiceNow CMDB configuration item ID for the GxP system."
call: "servicenow-gxp.get-ci"
with:
ci_id: "{{system_ci_id}}"
outputParameters:
- name: system_name
type: string
mapping: "$.result.name"
- name: validation_status
type: string
mapping: "$.result.u_validation_status"
- name: last_qualified
type: string
mapping: "$.result.u_last_qualified_date"
- name: next_revalidation
type: string
mapping: "$.result.u_next_revalidation_date"
consumes:
- type: http
namespace: servicenow-gxp
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb-ci
path: "/table/cmdb_ci/{{ci_id}}"
inputParameters:
- name: ci_id
in: path
operations:
- name: get-ci
method: GET
Triggers an Informatica Cloud data integration job.
naftiko: "0.5"
info:
label: "Informatica Data Integration Job Trigger"
description: "Triggers an Informatica Cloud data integration job."
tags:
- data
- integration
- informatica
capability:
exposes:
- type: mcp
namespace: data-integration
port: 8080
tools:
- name: trigger-integration-job
description: "Given a task ID, trigger the ETL job. Use when data engineering runs integration jobs."
inputParameters:
- name: task_id
in: body
type: string
description: "Informatica task ID."
call: informatica.start-job
with:
taskId: "{{task_id}}"
outputParameters:
- name: run_id
type: string
mapping: "$.runId"
- name: status
type: string
mapping: "$.status"
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
When a complex ServiceNow incident is created, submits the incident description to OpenAI for AI-assisted triage categorization and recommended resolution steps, updating the ticket with the analysis.
naftiko: "0.5"
info:
label: "Intelligent Incident Triage with OpenAI"
description: "When a complex ServiceNow incident is created, submits the incident description to OpenAI for AI-assisted triage categorization and recommended resolution steps, updating the ticket with the analysis."
tags:
- ai
- itsm
- servicenow
- openai
- incident-response
capability:
exposes:
- type: mcp
namespace: ai-triage
port: 8080
tools:
- name: triage-incident-with-ai
description: "Given a ServiceNow incident number, retrieve the incident, submit to OpenAI for root cause and resolution recommendations, and update the ServiceNow record with the AI analysis."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number, e.g. INC0012345."
steps:
- name: get-incident
type: call
call: "servicenow-ai.get-incident"
with:
number: "{{incident_number}}"
- name: analyze-incident
type: call
call: "openai-triage.create-completion"
with:
model: "gpt-4o"
prompt: "Analyze this IT incident and provide: 1) Probable root cause, 2) Recommended resolution steps, 3) Priority suggestion. Incident: {{get-incident.short_description}} — {{get-incident.description}}"
- name: update-incident
type: call
call: "servicenow-ai.update-incident"
with:
number: "{{incident_number}}"
work_notes: "AI Triage Analysis: {{analyze-incident.text}}"
consumes:
- type: http
namespace: servicenow-ai
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
inputParameters:
- name: number
in: query
- name: update-incident
method: PATCH
- type: http
namespace: openai-triage
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
When a vendor invoice is received in SAP Ariba, validates it against the SAP purchase order, routes it for approval via ServiceNow, and notifies the finance team in Teams.
naftiko: "0.5"
info:
label: "Invoice Processing and Approval"
description: "When a vendor invoice is received in SAP Ariba, validates it against the SAP purchase order, routes it for approval via ServiceNow, and notifies the finance team in Teams."
tags:
- finance
- procurement
- sap-ariba
- servicenow
- invoice-processing
capability:
exposes:
- type: mcp
namespace: finance-ap
port: 8080
tools:
- name: process-vendor-invoice
description: "Given an Ariba invoice ID and SAP PO number, validate the invoice against the PO in SAP, create a ServiceNow approval task, and notify the finance team in Microsoft Teams."
inputParameters:
- name: ariba_invoice_id
in: body
type: string
description: "The SAP Ariba invoice identifier."
- name: po_number
in: body
type: string
description: "The SAP purchase order number to validate against."
- name: vendor_name
in: body
type: string
description: "The vendor name for notification context."
steps:
- name: get-invoice
type: call
call: "sap-ariba.get-invoice"
with:
invoice_id: "{{ariba_invoice_id}}"
- name: validate-po
type: call
call: "sap-po.get-po"
with:
po_number: "{{po_number}}"
- name: create-approval-task
type: call
call: "servicenow-ap.create-task"
with:
short_description: "Invoice approval: {{vendor_name}} - {{ariba_invoice_id}}"
description: "Invoice {{ariba_invoice_id}} from {{vendor_name}} against PO {{po_number}}. Amount: {{get-invoice.total_amount}} {{get-invoice.currency}}."
assignment_group: "Finance_AP"
- name: notify-finance
type: call
call: "msteams-ap.send-message"
with:
recipient_upn: "finance-ap@amgen.com"
message: "Invoice {{ariba_invoice_id}} from {{vendor_name}} pending approval. PO: {{po_number}}. Task: {{create-approval-task.number}}."
consumes:
- type: http
namespace: sap-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-po
baseUri: "https://amgen-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
- type: http
namespace: servicenow-ap
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-ap
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When a critical Datadog alert fires, creates a ServiceNow incident, posts an alert to the Microsoft Teams ops channel, and pages the on-call engineer.
naftiko: "0.5"
info:
label: "IT Incident Response Chain"
description: "When a critical Datadog alert fires, creates a ServiceNow incident, posts an alert to the Microsoft Teams ops channel, and pages the on-call engineer."
tags:
- itsm
- incident-response
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: handle-critical-alert
description: "Given a Datadog alert ID, severity, and affected service, create a ServiceNow incident and notify the IT operations channel in Microsoft Teams. Use when a Datadog monitor reaches critical state."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Datadog alert or monitor ID."
- name: severity
in: body
type: string
description: "Alert severity level: critical, high, medium, or low."
- name: service_name
in: body
type: string
description: "The name of the affected service or application."
- name: alert_message
in: body
type: string
description: "The alert message body from Datadog."
steps:
- name: create-incident
type: call
call: "servicenow-ops.create-incident"
with:
short_description: "{{severity}} alert: {{service_name}} - {{alert_id}}"
description: "{{alert_message}}"
urgency: "1"
impact: "1"
assignment_group: "IT_Operations"
- name: post-alert
type: call
call: "msteams-ops.post-channel-message"
with:
channel_id: "it-ops-alerts"
message: "INCIDENT: {{severity}} alert on {{service_name}} | Datadog: {{alert_id}} | ServiceNow: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow-ops
baseUri: "https://amgen.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-ops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Creates a bug report in Jira with project, summary, description, and priority.
naftiko: "0.5"
info:
label: "Jira Bug Report Creation"
description: "Creates a bug report in Jira with project, summary, description, and priority."
tags:
- devops
- engineering
- jira
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: create-bug-report
description: "Given project key, summary, description, and priority, create a Jira bug. Use when engineering logs defects."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key."
- name: summary
in: body
type: string
description: "Bug summary."
- name: priority
in: body
type: string
description: "Priority level."
call: jira.create-issue
with:
project: "{{project_key}}"
issuetype: "Bug"
summary: "{{summary}}"
priority: "{{priority}}"
outputParameters:
- name: issue_key
type: string
mapping: "$.key"
consumes:
- type: http
namespace: jira
baseUri: "https://amgen.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
Generates a daily sprint status digest from Jira, summarizing completed, in-progress, and blocked issues, then posts it to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Digest Report"
description: "Generates a daily sprint status digest from Jira, summarizing completed, in-progress, and blocked issues, then posts it to the engineering Teams channel."
tags:
- devops
- jira
- reporting
- sprint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sprint-reporting
port: 8080
tools:
- name: digest-sprint-status
description: "Given a Jira project key and sprint name, fetch all sprint issues and post a summary digest to the engineering Teams channel. Use for daily stand-up prep and sprint reviews."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key, e.g. ENG or BIONF."
- name: sprint_name
in: body
type: string
description: "The Jira sprint name to summarize."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID to post the digest to."
steps:
- name: get-sprint-issues
type: call
call: "jira-sprint.search-issues"
with:
jql: "project = {{project_key}} AND sprint = '{{sprint_name}}'"
- name: post-digest
type: call
call: "msteams-sprint.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Sprint Digest — {{project_key}} / {{sprint_name}}: Total: {{get-sprint-issues.total}} | Done: {{get-sprint-issues.done_count}} | In Progress: {{get-sprint-issues.inprogress_count}} | Blocked: {{get-sprint-issues.blocked_count}}"
consumes:
- type: http
namespace: jira-sprint
baseUri: "https://amgen.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/search"
operations:
- name: search-issues
method: GET
inputParameters:
- name: jql
in: query
- type: http
namespace: msteams-sprint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams.
naftiko: "0.5"
info:
label: "LinkedIn Talent Acquisition Signal"
description: "When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams."
tags:
- hr
- recruiting
- linkedin
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: enrich-candidate-profile
description: "Given a LinkedIn member URN and a Workday job requisition ID, fetch the LinkedIn profile and create or enrich the candidate record in Workday, then notify the hiring manager in Teams."
inputParameters:
- name: linkedin_member_urn
in: body
type: string
description: "The LinkedIn member URN for the candidate."
- name: job_req_id
in: body
type: string
description: "The Workday job requisition ID the candidate applied for."
- name: hiring_manager_upn
in: body
type: string
description: "The UPN of the hiring manager to notify."
steps:
- name: get-linkedin-profile
type: call
call: "linkedin.get-profile"
with:
member_urn: "{{linkedin_member_urn}}"
- name: create-candidate
type: call
call: "workday-recruit.create-candidate"
with:
job_req_id: "{{job_req_id}}"
first_name: "{{get-linkedin-profile.firstName}}"
last_name: "{{get-linkedin-profile.lastName}}"
headline: "{{get-linkedin-profile.headline}}"
- name: notify-hiring-manager
type: call
call: "msteams-recruit.send-message"
with:
recipient_upn: "{{hiring_manager_upn}}"
message: "New candidate: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} applied for req {{job_req_id}}. Title: {{get-linkedin-profile.headline}}. Workday record: {{create-candidate.candidate_id}}."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: profiles
path: "/people/{{member_urn}}"
inputParameters:
- name: member_urn
in: path
operations:
- name: get-profile
method: GET
- type: http
namespace: workday-recruit
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: candidates
path: "/amgen/jobRequisitions/{{job_req_id}}/candidates"
inputParameters:
- name: job_req_id
in: path
operations:
- name: create-candidate
method: POST
- type: http
namespace: msteams-recruit
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves employer brand and talent pipeline metrics from LinkedIn.
naftiko: "0.5"
info:
label: "LinkedIn Talent Pipeline Report"
description: "Retrieves employer brand and talent pipeline metrics from LinkedIn."
tags:
- hr
- marketing
- linkedin
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: get-talent-metrics
description: "Return LinkedIn follower count, engagement rate, and talent pipeline size. Use when HR needs employer brand data."
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"
- name: engagement_rate
type: number
mapping: "$.data.engagementRate"
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 a biologic manufacturing batch record from SAP, returning batch status, yield, titer data, and quality release information.
naftiko: "0.5"
info:
label: "Manufacturing Batch Record Status Check"
description: "Retrieves a biologic manufacturing batch record from SAP, returning batch status, yield, titer data, 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 the manufacturing batch status, yield, titer, and release status. Use when production teams need batch visibility for biologics manufacturing."
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"
- name: titer
type: number
mapping: "$.d.Titer"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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 biologics manufacturing line goes down, creates an incident, alerts maintenance, logs downtime in SAP, and adjusts production schedule.
naftiko: "0.5"
info:
label: "Manufacturing Line Downtime Response"
description: "When a biologics manufacturing line goes down, creates an incident, alerts maintenance, logs downtime in SAP, and adjusts production schedule."
tags:
- manufacturing
- it
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: mfg-downtime
port: 8080
tools:
- name: handle-line-downtime
description: "Given a production line ID and failure reason, create incident, notify team, log downtime, and adjust schedule. Use when manufacturing detects an unplanned stoppage."
inputParameters:
- name: line_id
in: body
type: string
description: "Production line identifier."
- name: failure_reason
in: body
type: string
description: "Description of the failure."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Line {{line_id}} down: {{failure_reason}}"
category: "manufacturing"
priority: "1"
assigned_group: "Maintenance_Engineering"
- name: alert-team
type: call
call: msteams.send-message
with:
channel_id: "manufacturing-ops"
text: "ALERT: Line {{line_id}} down. Reason: {{failure_reason}}. Incident: {{create-incident.number}}"
- name: log-downtime
type: call
call: sap-erp.create-downtime-record
with:
work_center: "{{line_id}}"
reason_code: "{{failure_reason}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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://amgen-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 a New Drug Application submission package by gathering documents from Veeva Vault, creating the eCTD structure, and notifying the regulatory team.
naftiko: "0.5"
info:
label: "NDA Submission Package Orchestration"
description: "Assembles a New Drug Application submission package by gathering documents from Veeva Vault, creating the eCTD structure, and notifying the regulatory team."
tags:
- regulatory
- clinical
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: nda-submission
port: 8080
tools:
- name: assemble-nda-package
description: "Given an NDA number and molecule name, gather documents, create eCTD structure, and notify team. Use when regulatory affairs prepares an NDA filing."
inputParameters:
- name: nda_number
in: body
type: string
description: "NDA application number."
- name: molecule_name
in: body
type: string
description: "Drug molecule name."
steps:
- name: gather-documents
type: call
call: veeva-vault.query-documents
with:
nda_number: "{{nda_number}}"
doc_type: "ectd"
- name: create-submission
type: call
call: veeva-vault.create-submission
with:
nda_number: "{{nda_number}}"
molecule: "{{molecule_name}}"
document_ids: "{{gather-documents.document_ids}}"
- name: create-task
type: call
call: servicenow.create-task
with:
short_description: "NDA submission: {{nda_number}} - {{molecule_name}}"
category: "regulatory_submission"
assigned_group: "Regulatory_Affairs"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "regulatory-submissions"
text: "NDA {{nda_number}} package assembled for {{molecule_name}}. Documents: {{gather-documents.count}}. Task: {{create-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://amgen-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://amgen.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
When a new employee joins Amgen, provisions the appropriate Okta application assignments based on their department and role, as defined in Workday.
naftiko: "0.5"
info:
label: "Okta User Access Provisioning"
description: "When a new employee joins Amgen, provisions the appropriate Okta application assignments based on their department and role, as defined in Workday."
tags:
- identity
- security
- okta
- workday
- access-management
capability:
exposes:
- type: mcp
namespace: identity-provisioning
port: 8080
tools:
- name: provision-okta-access
description: "Given a Workday employee ID, retrieve their role and department, then assign the appropriate Okta application groups. Use during onboarding or role changes."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the employee."
- name: okta_user_id
in: body
type: string
description: "The Okta user ID for the employee."
steps:
- name: get-worker-profile
type: call
call: "workday-okta.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: assign-okta-groups
type: call
call: "okta.assign-group"
with:
user_id: "{{okta_user_id}}"
department: "{{get-worker-profile.department}}"
job_title: "{{get-worker-profile.job_title}}"
consumes:
- type: http
namespace: workday-okta
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/amgen/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://amgen.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: assign-group
method: PUT
Retrieves an Okta user profile by email, returning account status, last login, and MFA enrollment.
naftiko: "0.5"
info:
label: "Okta User Status Check"
description: "Retrieves an Okta user profile by email, returning account status, last login, 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 account status, last login, and MFA state. Use when IT security verifies user access."
inputParameters:
- name: email
in: body
type: string
description: "Employee email address."
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://amgen.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 a structured summary of a clinical study report or protocol document.
naftiko: "0.5"
info:
label: "OpenAI Clinical Document Summarization"
description: "Uses OpenAI to generate a structured summary of a clinical study report or protocol document."
tags:
- clinical
- ai
- openai
capability:
exposes:
- type: mcp
namespace: doc-summarization
port: 8080
tools:
- name: summarize-clinical-document
description: "Given document text, generate a structured summary. Use when clinical teams need quick document overviews."
inputParameters:
- name: document_text
in: body
type: string
description: "Clinical document text."
call: openai.create-completion
with:
model: "gpt-4"
prompt: "Summarize this clinical document: {{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 for a PagerDuty schedule.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer for a PagerDuty schedule."
tags:
- it
- observability
- pagerduty
capability:
exposes:
- type: mcp
namespace: on-call
port: 8080
tools:
- name: get-on-call-engineer
description: "Given a PagerDuty schedule ID, return the on-call engineer name and rotation end time. Use when teams identify who is on call."
inputParameters:
- name: schedule_id
in: body
type: string
description: "PagerDuty schedule identifier."
call: pagerduty.get-on-call
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: engineer_name
type: string
mapping: "$.oncalls[0].user.name"
- name: email
type: string
mapping: "$.oncalls[0].user.email"
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?schedule_ids[]={{schedule_id}}"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-on-call
method: GET
Returns current headcount by department and cost center from Workday, suitable for finance planning and headcount reporting.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Returns current headcount by department and cost center from Workday, suitable for finance planning and headcount reporting."
tags:
- hr
- finance
- reporting
- workday
- headcount
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-by-department
description: "Returns a list of active Amgen employees grouped by department and cost center from Workday. Use for headcount planning, budget reviews, and workforce analytics."
call: "workday-hc.headcount-report"
outputParameters:
- name: employees
type: array
mapping: "$.data"
consumes:
- type: http
namespace: workday-hc
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/amgen/reports/headcount"
operations:
- name: headcount-report
method: GET
Orchestrates PK data analysis by extracting concentration data from Snowflake, running noncompartmental analysis, generating reports, and notifying the clinical pharmacology team.
naftiko: "0.5"
info:
label: "Pharmacokinetics Data Analysis Orchestration"
description: "Orchestrates PK data analysis by extracting concentration data from Snowflake, running noncompartmental analysis, generating reports, and notifying the clinical pharmacology team."
tags:
- clinical
- rd
- analytics
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pk-analysis
port: 8080
tools:
- name: run-pk-analysis
description: "Given a study ID and analyte, extract PK data, run NCA, generate report, and notify team. Use when clinical pharmacology performs PK analysis."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
- name: analyte
in: body
type: string
description: "Analyte name."
steps:
- name: extract-pk-data
type: call
call: snowflake.execute-query
with:
query_name: "extract_pk_concentrations"
params: "{{study_id}},{{analyte}}"
- name: run-nca
type: call
call: snowflake.execute-query
with:
query_name: "pk_nca_analysis"
params: "{{study_id}},{{analyte}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "clinical-pharmacology"
text: "PK analysis complete for {{study_id}} - {{analyte}}. Cmax: {{run-nca.cmax}}. AUC: {{run-nca.auc}}. Half-life: {{run-nca.half_life}}h."
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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 periodic safety update report by aggregating adverse events, complaint data, and field actions into a consolidated regulatory report.
naftiko: "0.5"
info:
label: "Post-Market Surveillance Report Orchestration"
description: "Generates a periodic safety update report by aggregating adverse events, complaint data, and field actions into a consolidated regulatory report."
tags:
- regulatory
- quality
- safety
- snowflake
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pms-reporting
port: 8080
tools:
- name: generate-psur
description: "Given a product name and reporting period, aggregate safety data and generate a PSUR. Use when pharmacovigilance prepares periodic safety reports."
inputParameters:
- name: product_name
in: body
type: string
description: "Drug product name."
- name: reporting_period
in: body
type: string
description: "Reporting period."
steps:
- name: get-adverse-events
type: call
call: snowflake.execute-query
with:
query_name: "psur_adverse_events"
params: "{{product_name}},{{reporting_period}}"
- name: get-complaint-data
type: call
call: snowflake.execute-query
with:
query_name: "psur_complaints"
params: "{{product_name}},{{reporting_period}}"
- name: create-report
type: call
call: veeva-vault.create-document
with:
doc_type: "psur"
product: "{{product_name}}"
period: "{{reporting_period}}"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "pharmacovigilance"
text: "PSUR generated for {{product_name}} ({{reporting_period}}). AEs: {{get-adverse-events.total}}. Complaints: {{get-complaint-data.total}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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://amgen-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 refresh of the commercial performance Power BI dashboard.
naftiko: "0.5"
info:
label: "Power BI Commercial Dashboard Refresh"
description: "Triggers a refresh of the commercial performance Power BI dashboard."
tags:
- commercial
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-commercial-dashboard
description: "Given a dataset ID, trigger a Power BI refresh. Use when commercial teams need updated data."
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
Generates a Power BI embed token for a specific report and workspace, enabling secure embedding in Amgen's internal portal.
naftiko: "0.5"
info:
label: "Power BI Report Embed Token Generator"
description: "Generates a Power BI embed token for a specific report and workspace, enabling secure embedding in Amgen's internal portal."
tags:
- data
- analytics
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: powerbi-reporting
port: 8080
tools:
- name: get-report-embed-token
description: "Given a Power BI workspace ID and report ID, generate a secure embed token for use in Amgen's internal analytics portal."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace (group) ID."
- name: report_id
in: body
type: string
description: "The Power BI report ID to generate a token for."
call: "powerbi.generate-embed-token"
with:
workspace_id: "{{workspace_id}}"
report_id: "{{report_id}}"
outputParameters:
- name: token
type: string
mapping: "$.token"
- name: expiration
type: string
mapping: "$.expiration"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: embed-token
path: "/groups/{{workspace_id}}/reports/{{report_id}}/GenerateToken"
inputParameters:
- name: workspace_id
in: path
- name: report_id
in: path
operations:
- name: generate-embed-token
method: POST
When protein characterization experiments complete, ingests analytical results into Snowflake, validates data quality, and notifies the R&D team.
naftiko: "0.5"
info:
label: "Protein Characterization Data Pipeline"
description: "When protein characterization experiments complete, ingests analytical results into Snowflake, validates data quality, and notifies the R&D team."
tags:
- rd
- analytics
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: protein-analytics
port: 8080
tools:
- name: process-characterization-data
description: "Given an experiment ID and data path, ingest results, validate quality, and notify researchers. Use when analytical lab completes protein characterization."
inputParameters:
- name: experiment_id
in: body
type: string
description: "Experiment identifier."
- name: data_path
in: body
type: string
description: "S3 path to results file."
steps:
- name: ingest-data
type: call
call: snowflake.execute-query
with:
query_name: "ingest_protein_characterization"
params: "{{experiment_id}},{{data_path}}"
- name: validate-quality
type: call
call: snowflake.execute-query
with:
query_name: "validate_analytical_quality"
params: "{{experiment_id}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "rd-analytical"
text: "Protein characterization {{experiment_id}} processed. Quality: {{validate-quality.pass_rate}}% pass."
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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
Retrieves a corrective and preventive action record from the quality management system by CAPA number.
naftiko: "0.5"
info:
label: "Quality CAPA Status Lookup"
description: "Retrieves a corrective and preventive action record from the quality management system by CAPA number."
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, due date, and owner. Use when quality teams track 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: root_cause
type: string
mapping: "$.result.root_cause_category"
- name: due_date
type: string
mapping: "$.result.due_date"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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
When a deviation is escalated, assigns an investigator, pulls batch data, creates investigation tasks, and notifies quality.
naftiko: "0.5"
info:
label: "Quality Deviation Investigation Orchestration"
description: "When a deviation is escalated, assigns an investigator, pulls batch data, creates investigation tasks, and notifies quality."
tags:
- quality
- manufacturing
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: deviation-investigation
port: 8080
tools:
- name: initiate-investigation
description: "Given a deviation number, assign investigator, pull batch data, create tasks, and notify. Use when QA escalates a deviation."
inputParameters:
- name: deviation_number
in: body
type: string
description: "Deviation record 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"
assigned_group: "Quality_Investigation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "quality-investigations"
text: "Investigation for {{deviation_number}}. Batch: {{get-deviation.batch_number}}. Yield: {{get-batch.yield_percentage}}%. Task: {{create-task.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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://amgen-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
- 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 by pulling financials from SAP, pipeline from Salesforce, headcount from Workday, and generating a consolidated report.
naftiko: "0.5"
info:
label: "Quarterly Business Review Data Orchestration"
description: "Assembles QBR data by pulling financials from SAP, pipeline from Salesforce, headcount from Workday, and generating a consolidated report."
tags:
- finance
- sales
- hr
- sap
- salesforce
- workday
- snowflake
capability:
exposes:
- type: mcp
namespace: qbr-data
port: 8080
tools:
- name: assemble-qbr-data
description: "Given a business unit and quarter, pull financials, pipeline, headcount, and generate report. Use when finance prepares QBRs."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit code."
- name: fiscal_quarter
in: body
type: string
description: "Fiscal quarter."
steps:
- name: get-financials
type: call
call: sap-erp.get-pl-summary
with:
unit: "{{business_unit}}"
quarter: "{{fiscal_quarter}}"
- name: get-pipeline
type: call
call: salesforce.get-pipeline-summary
with:
unit: "{{business_unit}}"
- name: get-headcount
type: call
call: workday.get-headcount
with:
unit: "{{business_unit}}"
- name: generate-report
type: call
call: snowflake.execute-query
with:
query_name: "qbr_report"
params: "{{business_unit}},{{fiscal_quarter}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-s4.sap.com/sap/opu/odata/sap/FI_PL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pl-summary
path: "/A_PLSummary"
operations:
- name: get-pl-summary
method: GET
- type: http
namespace: salesforce
baseUri: "https://amgen.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://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Prepares for a regulatory audit by gathering open CAPAs, pending deviations, training compliance, and generating a readiness report.
naftiko: "0.5"
info:
label: "Regulatory Audit Preparation Orchestration"
description: "Prepares for a regulatory audit by gathering open CAPAs, pending 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 an audit type and facility code, gather CAPAs, deviations, training status, and generate a readiness report. Use when quality prepares for FDA or EMA audits."
inputParameters:
- name: audit_type
in: body
type: string
description: "Audit type: FDA, EMA, internal."
- name: facility_code
in: body
type: string
description: "Manufacturing facility code."
steps:
- name: get-open-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}}"
status: "pending"
- name: get-training-compliance
type: call
call: workday.get-training-status
with:
facility: "{{facility_code}}"
compliance_type: "gmp"
- name: generate-report
type: call
call: snowflake.execute-query
with:
query_name: "audit_readiness_report"
params: "{{facility_code}},{{audit_type}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves the status of regulatory submission documents from Veeva Vault and cross-references open action items in ServiceNow for a given regulatory filing.
naftiko: "0.5"
info:
label: "Regulatory Submission Document Tracker"
description: "Retrieves the status of regulatory submission documents from Veeva Vault and cross-references open action items in ServiceNow for a given regulatory filing."
tags:
- regulatory
- veeva
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: get-submission-status
description: "Given a Veeva Vault document ID for a regulatory submission, retrieve document status and cross-reference any open ServiceNow action items. Use for regulatory filing status checks."
inputParameters:
- name: vault_doc_id
in: body
type: string
description: "The Veeva Vault document ID for the regulatory submission."
steps:
- name: get-vault-doc
type: call
call: "veeva-vault.get-document"
with:
doc_id: "{{vault_doc_id}}"
- name: get-action-items
type: call
call: "servicenow-reg.query-tasks"
with:
correlation_id: "{{vault_doc_id}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://amgen.veevavault.com/api/v23.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-reg
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: query-tasks
method: GET
Generates a weekly account health digest from Salesforce, summarizing open opportunities, recent activities, and support cases for strategic accounts, posted to the sales Teams channel.
naftiko: "0.5"
info:
label: "Salesforce Account Health Digest"
description: "Generates a weekly account health digest from Salesforce, summarizing open opportunities, recent activities, and support cases for strategic accounts, posted to the sales Teams channel."
tags:
- sales
- crm
- salesforce
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: account-health
port: 8080
tools:
- name: digest-account-health
description: "Given a Salesforce account ID, retrieve open opportunities, recent activities, and open cases, then post a health digest to the sales Teams channel."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID, e.g. 0015G00001xyz."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID where the digest should be posted."
steps:
- name: get-account
type: call
call: "salesforce-acct.get-account"
with:
account_id: "{{account_id}}"
- name: get-opportunities
type: call
call: "salesforce-acct.get-account-opportunities"
with:
account_id: "{{account_id}}"
- name: post-digest
type: call
call: "msteams-acct.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Account Health: {{get-account.name}} | Open Opps: {{get-opportunities.total_count}} | Total Pipeline: ${{get-opportunities.total_amount}} | Health Score: {{get-account.health_score}}"
consumes:
- type: http
namespace: salesforce-acct
baseUri: "https://amgen.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- name: account-opportunities
path: "/sobjects/Account/{{account_id}}/Opportunities"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account-opportunities
method: GET
- type: http
namespace: msteams-acct
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a Salesforce account record by ID, returning account name, type, annual revenue, and owner.
naftiko: "0.5"
info:
label: "Salesforce Account Lookup"
description: "Retrieves a Salesforce account record by ID, returning account name, type, annual revenue, and owner."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account
description: "Given a Salesforce account ID, return name, type, annual revenue, and owner. Use when commercial teams need account details."
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"
- name: account_type
type: string
mapping: "$.Type"
- name: annual_revenue
type: number
mapping: "$.AnnualRevenue"
consumes:
- type: http
namespace: salesforce
baseUri: "https://amgen.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
Retrieves the current status, value, and stage of a Salesforce opportunity by ID, for use in sales pipeline reviews and CRM status checks.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Status Lookup"
description: "Retrieves the current status, value, and stage of a Salesforce opportunity by ID, for use in sales pipeline reviews and CRM status checks."
tags:
- sales
- crm
- salesforce
- reporting
capability:
exposes:
- type: mcp
namespace: crm-sales
port: 8080
tools:
- name: get-opportunity
description: "Look up a Salesforce opportunity by ID. Returns stage, amount, close date, and account name. Use for pipeline reviews or to surface deal context during customer calls."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity record ID, e.g. 0065G00001abc."
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: stage
type: string
mapping: "$.StageName"
- name: amount
type: number
mapping: "$.Amount"
- name: close_date
type: string
mapping: "$.CloseDate"
- name: account_name
type: string
mapping: "$.Account.Name"
consumes:
- type: http
namespace: salesforce
baseUri: "https://amgen.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
Manages contract renewals by checking expiring contracts in Ariba, creating renewal tasks, and notifying procurement leadership.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Renewal Orchestration"
description: "Manages contract renewals by checking expiring contracts in Ariba, creating renewal tasks, and notifying procurement leadership."
tags:
- procurement
- sap-ariba
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: process-contract-renewal
description: "Given a contract ID, check terms, create renewal task, and notify procurement. Use when contracts approach expiration."
inputParameters:
- name: contract_id
in: body
type: string
description: "SAP Ariba contract ID."
steps:
- name: get-contract
type: call
call: ariba.get-contract
with:
id: "{{contract_id}}"
- name: create-renewal-task
type: call
call: servicenow.create-task
with:
short_description: "Contract renewal: {{get-contract.title}}"
category: "procurement"
assigned_group: "Strategic_Sourcing"
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}}: {{get-contract.title}}. Task: {{create-renewal-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://amgen.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, description, and budget, create an Ariba sourcing event. Use when procurement initiates bidding."
inputParameters:
- name: category
in: body
type: string
description: "Sourcing category."
- name: description
in: body
type: string
description: "Event description."
- name: budget_amount
in: body
type: number
description: "Budget amount."
call: ariba.create-event
with:
category: "{{category}}"
description: "{{description}}"
budget: "{{budget_amount}}"
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
Retrieves a pending expense report from SAP Concur, validates it against travel policy, and routes it for manager approval via ServiceNow.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Retrieves a pending expense report from SAP Concur, validates it against travel policy, and routes it for manager approval via ServiceNow."
tags:
- finance
- expense-management
- sap-concur
- servicenow
capability:
exposes:
- type: mcp
namespace: expense-mgmt
port: 8080
tools:
- name: process-expense-report
description: "Given a SAP Concur expense report ID and employee ID, retrieve the report, validate against Amgen travel policy, and create a ServiceNow approval task for the manager."
inputParameters:
- name: expense_report_id
in: body
type: string
description: "The SAP Concur expense report identifier."
- name: employee_id
in: body
type: string
description: "The employee ID submitting the expense report."
steps:
- name: get-expense-report
type: call
call: "sap-concur.get-expense-report"
with:
report_id: "{{expense_report_id}}"
- name: create-approval-task
type: call
call: "servicenow-exp.create-task"
with:
short_description: "Expense approval: {{employee_id}} — {{expense_report_id}}"
description: "Amount: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Period: {{get-expense-report.period}}."
assignment_group: "Finance_Expense"
consumes:
- type: http
namespace: sap-concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: servicenow-exp
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Retrieves a travel request from SAP Concur by request ID.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Lookup"
description: "Retrieves a travel request from SAP Concur by request ID."
tags:
- finance
- travel
- sap-concur
capability:
exposes:
- type: mcp
namespace: travel-management
port: 8080
tools:
- name: get-travel-request
description: "Given a request ID, return destination, dates, cost, and approval status. Use when employees check travel requests."
inputParameters:
- name: request_id
in: body
type: string
description: "Concur travel request ID."
call: concur.get-request
with:
id: "{{request_id}}"
outputParameters:
- name: destination
type: string
mapping: "$.MainDestination"
- name: approval_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 figures for an SAP cost center.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Lookup"
description: "Retrieves budget vs actual figures for an SAP cost center."
tags:
- finance
- erp
- sap
capability:
exposes:
- type: mcp
namespace: cost-center-budget
port: 8080
tools:
- name: get-cost-center-budget
description: "Given a cost center code and fiscal period, return planned budget, actual spend, and variance. Use when finance needs budget data."
inputParameters:
- name: cost_center
in: body
type: string
description: "SAP cost center code."
- 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://amgen-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 an inbound delivery of raw materials or drug substance.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts a goods receipt in SAP for an inbound delivery of raw materials or drug substance."
tags:
- supply-chain
- sap
capability:
exposes:
- type: mcp
namespace: goods-receipt
port: 8080
tools:
- name: post-goods-receipt
description: "Given a delivery number, post the goods receipt in SAP. Use when warehouse confirms receipt of materials."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP inbound 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://amgen-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 a material at a plant, returning available stock, reserved quantity, and reorder status.
naftiko: "0.5"
info:
label: "SAP Inventory Level Check"
description: "Queries SAP for current inventory levels of a material at a plant, returning available stock, reserved quantity, and reorder status."
tags:
- supply-chain
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: inventory-management
port: 8080
tools:
- name: get-inventory-level
description: "Given a material number and plant code, return unrestricted stock, reserved quantity, and reorder point. Use when supply chain checks stock availability."
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"
- name: reserved_quantity
type: number
mapping: "$.d.ReservedQuantity"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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 biologics manufacturing equipment.
naftiko: "0.5"
info:
label: "SAP Maintenance Order Creation"
description: "Creates a preventive maintenance order in SAP for biologics manufacturing equipment."
tags:
- manufacturing
- maintenance
- sap
capability:
exposes:
- type: mcp
namespace: plant-maintenance
port: 8080
tools:
- name: create-maintenance-order
description: "Given equipment ID and maintenance type, create a PM order in SAP. Use when maintenance schedules trigger equipment servicing."
inputParameters:
- name: equipment_id
in: body
type: string
description: "SAP equipment ID."
- name: maintenance_type
in: body
type: string
description: "Type: preventive, corrective, calibration."
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://amgen-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 by material number.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP by material number."
tags:
- supply-chain
- erp
- sap
capability:
exposes:
- type: mcp
namespace: material-master
port: 8080
tools:
- name: get-material-master
description: "Given a material number, return description, UoM, and material group. Use when supply chain needs 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"
- name: base_uom
type: string
mapping: "$.d.BaseUnitOfMeasure"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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 biologics production order from SAP, returning status, planned quantity, actual output, and schedule.
naftiko: "0.5"
info:
label: "SAP Production Order Status Lookup"
description: "Retrieves a biologics production order from SAP, returning status, planned quantity, actual output, and schedule."
tags:
- manufacturing
- erp
- sap
capability:
exposes:
- type: mcp
namespace: production-orders
port: 8080
tools:
- name: get-production-order
description: "Given a SAP production order number, return status, planned vs actual quantity, and scheduled dates. Use when manufacturing planners need order visibility."
inputParameters:
- name: order_number
in: body
type: string
description: "SAP production order number."
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"
- name: actual_output
type: number
mapping: "$.d.ActualQuantity"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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 an Amgen SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up an Amgen SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP S/4HANA purchase order by PO number. Returns header status, vendor name, total value, and currency. Use for procurement status checks and invoice matching."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500012345."
call: "sap-erp.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-erp
baseUri: "https://amgen-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
outputRawFormat: xml
Retrieves quality inspection lot details from SAP, returning results, usage decision, and defect counts.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP, returning results, usage decision, and defect counts."
tags:
- quality
- manufacturing
- sap
capability:
exposes:
- type: mcp
namespace: quality-inspection
port: 8080
tools:
- name: get-inspection-lot
description: "Given an inspection lot number, return status, usage decision, and defects. Use when quality reviews inspection results."
inputParameters:
- name: inspection_lot
in: body
type: string
description: "SAP inspection lot number."
call: sap-erp.get-inspection
with:
lot: "{{inspection_lot}}"
outputParameters:
- name: status
type: string
mapping: "$.d.InspectionLotStatus"
- name: usage_decision
type: string
mapping: "$.d.UsageDecision"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspection-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 an invoice number, return payment status, date, and amount. Use when AP verifies vendor payment."
inputParameters:
- name: invoice_number
in: body
type: string
description: "SAP invoice document number."
call: sap-erp.get-invoice-payment
with:
invoice: "{{invoice_number}}"
outputParameters:
- name: payment_status
type: string
mapping: "$.d.PaymentStatus"
- name: payment_date
type: string
mapping: "$.d.PaymentDate"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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
When a critical security alert fires, creates a security incident, isolates the endpoint, notifies SOC, and logs for compliance.
naftiko: "0.5"
info:
label: "Security Incident Response Orchestration"
description: "When a critical security alert fires, creates a security incident, isolates the endpoint, notifies SOC, and logs for compliance."
tags:
- security
- it
- crowdstrike
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-response
port: 8080
tools:
- name: respond-to-security-incident
description: "Given a detection ID and hostname, create incident, isolate endpoint, notify SOC. Use when SOC confirms a real threat."
inputParameters:
- name: detection_id
in: body
type: string
description: "CrowdStrike detection ID."
- name: hostname
in: body
type: string
description: "Affected endpoint hostname."
steps:
- name: create-sec-incident
type: call
call: servicenow.create-incident
with:
short_description: "Security incident: threat on {{hostname}}"
category: "security"
priority: "1"
assigned_group: "SOC"
- name: isolate-endpoint
type: call
call: crowdstrike.contain-host
with:
hostname: "{{hostname}}"
- name: notify-soc
type: call
call: msteams.send-message
with:
channel_id: "security-ops"
text: "CRITICAL: Security incident {{create-sec-incident.number}} - Host {{hostname}} isolated. Detection: {{detection_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://amgen.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
Retrieves the current status and assignment details for a ServiceNow incident by ticket number.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves the current status and assignment details for a ServiceNow incident by ticket number."
tags:
- it
- servicenow
capability:
exposes:
- type: mcp
namespace: it-incidents
port: 8080
tools:
- name: get-incident-status
description: "Given a ServiceNow incident number, return current state, priority, and assigned group. Use when IT support 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://amgen.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 Amgen SharePoint document libraries by keyword.
naftiko: "0.5"
info:
label: "SharePoint Document Search"
description: "Searches Amgen SharePoint document libraries by keyword."
tags:
- documentation
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-search
port: 8080
tools:
- name: search-sharepoint
description: "Given a search query, return matching documents with titles and links. Use when employees search SharePoint."
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://amgen.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
Queries Snowflake for failed or long-running data pipeline tasks and reports their status, enabling data engineering teams to triage issues quickly.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Health Check"
description: "Queries Snowflake for failed or long-running data pipeline tasks and reports their status, enabling data engineering teams to triage issues quickly."
tags:
- data
- analytics
- snowflake
- pipeline-monitoring
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: get-pipeline-task-failures
description: "Query Snowflake task history for failed or suspended pipeline tasks in a given database and schema. Use to triage data engineering issues and SLA breaches."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database to query, e.g. AMGEN_ANALYTICS."
- name: schema_name
in: body
type: string
description: "The Snowflake schema to query, e.g. PIPELINES."
- name: lookback_hours
in: body
type: integer
description: "Number of hours to look back in task history, e.g. 24."
call: "snowflake.query-task-history"
with:
database: "{{database_name}}"
schema: "{{schema_name}}"
hours: "{{lookback_hours}}"
outputParameters:
- name: failed_tasks
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/{{database}}/schemas/{{schema}}/tasks/history"
inputParameters:
- name: database
in: path
- name: schema
in: path
- name: hours
in: query
operations:
- name: query-task-history
method: GET
When a Snowflake data quality check fails, creates a Jira data quality issue and notifies the data engineering team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Alert"
description: "When a Snowflake data quality check fails, creates a Jira data quality issue and notifies the data engineering team via Microsoft Teams."
tags:
- data
- analytics
- snowflake
- jira
- data-quality
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: handle-data-quality-failure
description: "Given a Snowflake data quality check failure for a specific table, open a Jira data quality issue and notify the data engineering team in Teams."
inputParameters:
- name: table_name
in: body
type: string
description: "The fully qualified Snowflake table name that failed the quality check."
- name: check_name
in: body
type: string
description: "The name of the data quality check that failed."
- name: failure_detail
in: body
type: string
description: "Description of what failed and relevant metrics."
steps:
- name: create-dq-issue
type: call
call: "jira-dq.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "[DQ Failure] {{table_name}} — {{check_name}}"
description: "Data quality check {{check_name}} failed on table {{table_name}}. Detail: {{failure_detail}}."
- name: notify-data-team
type: call
call: "msteams-dq.post-channel-message"
with:
channel_id: "data-engineering-alerts"
message: "Data Quality Failure: {{table_name}} | Check: {{check_name}} | Jira: {{create-dq-issue.key}}"
consumes:
- type: http
namespace: jira-dq
baseUri: "https://amgen.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-dq
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors drug product stability studies by checking timepoint results, flagging out-of-trend data, and notifying the stability team.
naftiko: "0.5"
info:
label: "Stability Study Monitoring Orchestration"
description: "Monitors drug product stability studies by checking timepoint results, flagging out-of-trend data, and notifying the stability team."
tags:
- quality
- rd
- manufacturing
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: stability-monitoring
port: 8080
tools:
- name: check-stability-timepoint
description: "Given a stability protocol ID and timepoint, check results, flag trends, and notify team. Use when stability lab reports new timepoint data."
inputParameters:
- name: protocol_id
in: body
type: string
description: "Stability protocol identifier."
- name: timepoint
in: body
type: string
description: "Timepoint in months."
steps:
- name: get-results
type: call
call: snowflake.execute-query
with:
query_name: "stability_timepoint_results"
params: "{{protocol_id}},{{timepoint}}"
- name: check-trends
type: call
call: snowflake.execute-query
with:
query_name: "stability_trend_analysis"
params: "{{protocol_id}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "stability-studies"
text: "Stability {{protocol_id}} T={{timepoint}}mo: All specs met: {{get-results.all_pass}}. Trend alert: {{check-trends.trend_flag}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://amgen.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 by pulling rejection rates from SAP, audit findings from ServiceNow, and delivery performance metrics.
naftiko: "0.5"
info:
label: "Supplier Quality Scorecard Generation"
description: "Generates a supplier quality scorecard by pulling rejection rates from SAP, audit findings from ServiceNow, and delivery performance metrics."
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 rejection rates, audit findings, and delivery metrics for a quality scorecard. Use when procurement evaluates supplier performance."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP supplier/vendor number."
steps:
- name: get-rejection-data
type: call
call: sap-erp.get-supplier-rejections
with:
vendor_id: "{{supplier_id}}"
- name: get-audit-findings
type: call
call: servicenow.query-supplier-audits
with:
supplier_id: "{{supplier_id}}"
- name: calculate-scorecard
type: call
call: snowflake.execute-query
with:
query_name: "supplier_scorecard"
params: "{{supplier_id}},{{get-rejection-data.rejection_rate}},{{get-audit-findings.findings_count}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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://amgen.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://amgen.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
When a supply chain risk is identified for a critical raw material, creates a ServiceNow procurement task, updates the Salesforce supply record, and alerts the procurement team in Teams.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Alert"
description: "When a supply chain risk is identified for a critical raw material, creates a ServiceNow procurement task, updates the Salesforce supply record, and alerts the procurement team in Teams."
tags:
- supply-chain
- procurement
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: handle-supply-disruption
description: "Given a material ID, supplier name, and disruption severity, create a ServiceNow procurement task, update the Salesforce supply record, and notify the procurement team in Teams."
inputParameters:
- name: material_id
in: body
type: string
description: "The SAP material ID for the at-risk raw material."
- name: supplier_name
in: body
type: string
description: "The supplier name experiencing the disruption."
- name: disruption_type
in: body
type: string
description: "Type of disruption: shortage, delay, quality_issue, or force_majeure."
- name: severity
in: body
type: string
description: "Disruption severity: critical, high, medium, or low."
steps:
- name: create-procurement-task
type: call
call: "servicenow-sc.create-task"
with:
short_description: "Supply disruption: {{material_id}} from {{supplier_name}}"
description: "Disruption type: {{disruption_type}}. Severity: {{severity}}."
assignment_group: "Procurement"
- name: update-supply-record
type: call
call: "salesforce-sc.update-record"
with:
object_type: "Supply_Record__c"
material_id: "{{material_id}}"
status: "Disrupted"
disruption_type: "{{disruption_type}}"
- name: alert-procurement
type: call
call: "msteams-sc.post-channel-message"
with:
channel_id: "procurement-alerts"
message: "Supply Disruption: {{material_id}} from {{supplier_name}} | Type: {{disruption_type}} | Severity: {{severity}} | Task: {{create-procurement-task.number}}"
consumes:
- type: http
namespace: servicenow-sc
baseUri: "https://amgen.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: salesforce-sc
baseUri: "https://amgen.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: supply-records
path: "/sobjects/Supply_Record__c"
operations:
- name: update-record
method: PATCH
- type: http
namespace: msteams-sc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a supply chain disruption is detected, identifies impacted POs, notifies procurement, and creates sourcing tasks.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Response Orchestration"
description: "When a supply chain disruption is detected, identifies impacted POs, notifies procurement, and creates sourcing tasks."
tags:
- supply-chain
- procurement
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-disruption
port: 8080
tools:
- name: respond-to-disruption
description: "Given a supplier ID and disruption type, identify impacted POs, alert procurement, and create sourcing tasks. Use when supply chain detects disruption."
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-impacted-pos
type: call
call: sap-erp.query-open-pos
with:
vendor_id: "{{supplier_id}}"
- name: create-sourcing-task
type: call
call: servicenow.create-task
with:
short_description: "Alt sourcing: {{disruption_type}} from {{supplier_id}}"
category: "procurement"
priority: "1"
assigned_group: "Strategic_Sourcing"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "supply-chain-ops"
text: "DISRUPTION: Vendor {{supplier_id}} - {{disruption_type}}. Impacted POs: {{get-impacted-pos.count}}. Task: {{create-sourcing-task.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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"
operations:
- name: query-open-pos
method: GET
- type: http
namespace: servicenow
baseUri: "https://amgen.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 workbook extract refresh and notifies stakeholders in Teams when the refresh completes or fails.
naftiko: "0.5"
info:
label: "Tableau Dashboard Refresh Trigger"
description: "Triggers a Tableau workbook extract refresh and notifies stakeholders in Teams when the refresh completes or fails."
tags:
- data
- analytics
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-tableau-workbook
description: "Given a Tableau workbook ID and site name, trigger an extract refresh and notify the designated stakeholder channel in Teams when complete."
inputParameters:
- name: workbook_id
in: body
type: string
description: "The Tableau workbook ID to refresh."
- name: site_name
in: body
type: string
description: "The Tableau site name, e.g. amgen."
- name: notification_channel
in: body
type: string
description: "The Teams channel ID to notify on completion."
steps:
- name: trigger-refresh
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "{{workbook_id}}"
site: "{{site_name}}"
- name: notify-stakeholders
type: call
call: "msteams-bi.post-channel-message"
with:
channel_id: "{{notification_channel}}"
message: "Tableau workbook {{workbook_id}} refresh triggered. Job ID: {{trigger-refresh.job_id}}."
consumes:
- type: http
namespace: tableau
baseUri: "https://tableau.amgen.com/api/2.8"
authentication:
type: apikey
key: "X-Tableau-Auth"
value: "$secrets.tableau_token"
placement: header
resources:
- name: workbook-refresh
path: "/sites/{{site}}/workbooks/{{workbook_id}}/refresh"
inputParameters:
- name: site
in: path
- name: workbook_id
in: path
operations:
- name: refresh-workbook
method: POST
- type: http
namespace: msteams-bi
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers a refresh of a quality metrics Tableau dashboard.
naftiko: "0.5"
info:
label: "Tableau Quality Dashboard Refresh"
description: "Triggers a refresh of a quality metrics Tableau dashboard."
tags:
- quality
- analytics
- tableau
capability:
exposes:
- type: mcp
namespace: quality-analytics
port: 8080
tools:
- name: refresh-quality-dashboard
description: "Given a workbook name, trigger a data refresh. Use when quality needs updated metrics."
inputParameters:
- name: workbook_name
in: body
type: string
description: "Tableau workbook name."
call: tableau.trigger-refresh
with:
workbook: "{{workbook_name}}"
outputParameters:
- name: job_id
type: string
mapping: "$.job.id"
consumes:
- type: http
namespace: tableau
baseUri: "https://amgen.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
Creates a new Terraform Cloud workspace for a given project and environment, applies initial variable sets, and notifies the infrastructure team in Teams.
naftiko: "0.5"
info:
label: "Terraform Cloud Workspace Provisioning"
description: "Creates a new Terraform Cloud workspace for a given project and environment, applies initial variable sets, and notifies the infrastructure team in Teams."
tags:
- cloud
- infrastructure
- terraform
- devops
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: provision-terraform-workspace
description: "Given a project name and environment, create a Terraform Cloud workspace, configure variable sets, and notify the infrastructure team in Teams."
inputParameters:
- name: project_name
in: body
type: string
description: "The project name for the new workspace, e.g. genomics-pipeline."
- name: environment
in: body
type: string
description: "The deployment environment: dev, staging, or prod."
- name: terraform_org
in: body
type: string
description: "The Terraform Cloud organization name, e.g. amgen."
steps:
- name: create-workspace
type: call
call: "terraform.create-workspace"
with:
org: "{{terraform_org}}"
name: "{{project_name}}-{{environment}}"
- name: notify-infra
type: call
call: "msteams-tf.post-channel-message"
with:
channel_id: "infrastructure-team"
message: "Terraform workspace created: {{project_name}}-{{environment}} in org {{terraform_org}}. ID: {{create-workspace.workspace_id}}."
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/organizations/{{org}}/workspaces"
inputParameters:
- name: org
in: path
operations:
- name: create-workspace
method: POST
- type: http
namespace: msteams-tf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Provisions a cloud environment by triggering Terraform, configuring monitoring, creating CMDB record, and notifying DevOps.
naftiko: "0.5"
info:
label: "Terraform Environment Provisioning Orchestration"
description: "Provisions a cloud environment by triggering Terraform, configuring monitoring, creating CMDB record, and notifying 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 ID, run Terraform, configure monitoring, register in CMDB, and notify. Use when engineering needs a new environment."
inputParameters:
- name: environment_name
in: body
type: string
description: "Environment name."
- name: workspace_id
in: body
type: string
description: "Terraform workspace ID."
steps:
- name: trigger-terraform
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
message: "Provisioning {{environment_name}}"
- name: configure-monitoring
type: call
call: datadog.create-monitor
with:
name: "{{environment_name}} health"
query: "service:{{environment_name}}"
- name: create-cmdb
type: call
call: servicenow.create-ci
with:
name: "{{environment_name}}"
category: "cloud_environment"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "devops"
text: "Environment {{environment_name}} provisioning started. Run: {{trigger-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://amgen.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
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 Veeva Vault document number, return metadata, version, and lifecycle state. Use when teams locate regulated documents."
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://amgen-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 version history of a Veeva Vault regulatory document and checks it against compliance audit requirements, returning a structured audit trail.
naftiko: "0.5"
info:
label: "Veeva Vault Document Version Audit"
description: "Retrieves the version history of a Veeva Vault regulatory document and checks it against compliance audit requirements, returning a structured audit trail."
tags:
- regulatory
- compliance
- veeva
- audit
capability:
exposes:
- type: mcp
namespace: doc-audit
port: 8080
tools:
- name: audit-document-versions
description: "Given a Veeva Vault document ID, retrieve all version history entries and return a structured audit trail for compliance review."
inputParameters:
- name: vault_doc_id
in: body
type: string
description: "The Veeva Vault document ID to audit."
call: "veeva-audit.get-document-versions"
with:
doc_id: "{{vault_doc_id}}"
outputParameters:
- name: versions
type: array
mapping: "$.data"
consumes:
- type: http
namespace: veeva-audit
baseUri: "https://amgen.veevavault.com/api/v23.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: document-versions
path: "/objects/documents/{{doc_id}}/versions"
inputParameters:
- name: doc_id
in: path
operations:
- name: get-document-versions
method: GET
Performs vendor risk assessment by querying SAP financial data, compliance records, and calculating a risk score.
naftiko: "0.5"
info:
label: "Vendor Risk Assessment Orchestration"
description: "Performs vendor risk assessment by querying SAP financial data, compliance records, and calculating a risk score."
tags:
- procurement
- compliance
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: vendor-risk
port: 8080
tools:
- name: assess-vendor-risk
description: "Given a vendor ID, collect financial data, compliance records, and calculate risk score. Use when procurement evaluates vendor risk."
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: calculate-score
type: call
call: snowflake.execute-query
with:
query_name: "vendor_risk_score"
params: "{{vendor_id}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://amgen-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://amgen.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://amgen.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 from Workday.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Status"
description: "Retrieves employee benefits enrollment status from Workday."
tags:
- hr
- benefits
- workday
capability:
exposes:
- type: mcp
namespace: benefits
port: 8080
tools:
- name: get-benefits-status
description: "Given a worker ID, return benefits elections and enrollment deadline. Use when HR or employees check benefits."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
call: workday.get-benefits
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: medical_plan
type: string
mapping: "$.data.medical_plan"
- name: enrollment_deadline
type: string
mapping: "$.data.enrollment_deadline"
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 a compensation review cycle by pulling performance data, generating recommendations, and notifying managers.
naftiko: "0.5"
info:
label: "Workday Compensation Review Orchestration"
description: "Launches a compensation review cycle 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 name, pull performance, generate recommendations, and notify. Use when HR launches annual comp reviews."
inputParameters:
- name: department_code
in: body
type: string
description: "Department code."
- name: cycle_name
in: body
type: string
description: "Review cycle name."
steps:
- name: get-performance
type: call
call: workday.get-performance-ratings
with:
department: "{{department_code}}"
- name: generate-recommendations
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}} - {{cycle_name}}"
assigned_group: "HR_Compensation"
- name: notify
type: call
call: msteams.send-message
with:
channel_id: "hr-compensation"
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://amgen.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, returning name, department, job title, and location.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and location."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-profile
port: 8080
tools:
- name: get-employee-profile
description: "Given a Workday worker ID, return employee name, department, title, and location. Use when HR or managers need employee information."
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"
- name: job_title
type: string
mapping: "$.data.job_title"
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-requisitions
description: "Given a department code, return open requisition count and average days open. Use when HR needs recruiting visibility."
inputParameters:
- name: department_code
in: body
type: string
description: "Workday department code."
call: workday.get-requisitions
with:
department: "{{department_code}}"
status: "open"
outputParameters:
- name: open_count
type: integer
mapping: "$.data.total"
- name: avg_days_open
type: number
mapping: "$.data.avg_days_open"
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
When an employee changes roles in Workday, updates their Okta group memberships, adjusts Salesforce profile permissions, and notifies the new manager via Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Provisioning"
description: "When an employee changes roles in Workday, updates their Okta group memberships, adjusts Salesforce profile permissions, and notifies the new manager via Teams."
tags:
- hr
- identity
- workday
- okta
- salesforce
capability:
exposes:
- type: mcp
namespace: hr-role-change
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday employee ID and new role details, update Okta group assignments, adjust Salesforce profile, and notify the new manager in Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the employee changing roles."
- name: new_role
in: body
type: string
description: "The new job role or title."
- name: new_manager_upn
in: body
type: string
description: "The UPN of the new manager."
steps:
- name: get-worker
type: call
call: "workday-role.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: update-okta-groups
type: call
call: "okta-role.update-user-groups"
with:
user_id: "{{get-worker.okta_user_id}}"
new_department: "{{get-worker.new_department}}"
- name: notify-new-manager
type: call
call: "msteams-role.send-message"
with:
recipient_upn: "{{new_manager_upn}}"
message: "{{get-worker.full_name}} has been assigned to your team in role: {{new_role}}. Okta and Salesforce access updated."
consumes:
- type: http
namespace: workday-role
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/amgen/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta-role
baseUri: "https://amgen.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users/{{user_id}}/groups"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user-groups
method: PUT
- type: http
namespace: msteams-role
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST