Abbott Capabilities
Naftiko 0.5 capability definitions for Abbott - 100 capabilities showing integration workflows and service orchestrations.
Retrieves a regulatory submission document from Veeva Vault, sends it to the Anthropic Claude API for intelligent summarization, and posts the summary to the regulatory affairs Teams channel.
naftiko: "0.5"
info:
label: "AI-Assisted Regulatory Document Summarization"
description: "Retrieves a regulatory submission document from Veeva Vault, sends it to the Anthropic Claude API for intelligent summarization, and posts the summary to the regulatory affairs Teams channel."
tags:
- ai
- regulatory
- veeva
- anthropic
- healthcare
capability:
exposes:
- type: mcp
namespace: ai-regulatory
port: 8080
tools:
- name: summarize-regulatory-document
description: "Given a Veeva Vault document ID, retrieve the document content and send it to Anthropic Claude for summarization with regulatory focus. Post the AI summary to the regulatory Teams channel. Use when regulatory teams need quick comprehension of lengthy submission documents."
inputParameters:
- name: vault_document_id
in: body
type: string
description: "Veeva Vault document ID to summarize."
- name: reg_channel_id
in: body
type: string
description: "Regulatory affairs Teams channel ID."
steps:
- name: get-document
type: call
call: veeva-ai.get-document
with:
document_id: "{{vault_document_id}}"
- name: generate-summary
type: call
call: anthropic.create-message
with:
model: "claude-opus-4-5"
prompt: "Summarize this regulatory submission document for a pharmaceutical regulatory affairs team. Identify key claims, study results, and action items: {{get-document.content}}"
- name: post-summary
type: call
call: msteams-ai-reg.post-channel-message
with:
channel_id: "{{reg_channel_id}}"
text: "Regulatory Summary for document {{vault_document_id}}: {{generate-summary.content[0].text}}"
consumes:
- type: http
namespace: veeva-ai
baseUri: "https://abbott.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: msteams-ai-reg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves metadata for archived data files in Amazon S3, returning object size, storage class, and last modified date.
naftiko: "0.5"
info:
label: "Amazon S3 Data Archive Lookup"
description: "Retrieves metadata for archived data files in Amazon S3, returning object size, storage class, and last modified date."
tags:
- data
- cloud
- amazon-s3
capability:
exposes:
- type: mcp
namespace: data-archive
port: 8080
tools:
- name: get-archive-metadata
description: "Given an S3 bucket and key prefix, return matching object metadata including size, storage class, and timestamps. Use when data teams need to locate archived datasets."
inputParameters:
- name: bucket
in: body
type: string
description: "S3 bucket name."
- name: prefix
in: body
type: string
description: "Object key prefix."
call: s3.list-objects
with:
bucket: "{{bucket}}"
prefix: "{{prefix}}"
outputParameters:
- name: object_count
type: integer
mapping: "$.KeyCount"
- name: total_size_bytes
type: integer
mapping: "$.total_size"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.aws_s3_auth"
placement: header
resources:
- name: objects
path: "/{{bucket}}?list-type=2&prefix={{prefix}}"
inputParameters:
- name: bucket
in: path
- name: prefix
in: query
operations:
- name: list-objects
method: GET
Queries the Kong API gateway for health status of registered services, returning uptime, request counts, and error rates.
naftiko: "0.5"
info:
label: "API Gateway Health Check"
description: "Queries the Kong API gateway for health status of registered services, returning uptime, request counts, and error rates."
tags:
- it
- integration
- kong
capability:
exposes:
- type: mcp
namespace: api-health
port: 8080
tools:
- name: check-api-gateway-health
description: "Given a service name, return the API gateway health metrics including uptime, request volume, and error rate. Use when platform engineering needs API service visibility."
inputParameters:
- name: service_name
in: body
type: string
description: "Kong service name."
call: kong.get-service-status
with:
service: "{{service_name}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: request_count
type: integer
mapping: "$.data.request_count"
- name: error_rate
type: number
mapping: "$.data.error_rate"
consumes:
- type: http
namespace: kong
baseUri: "https://abbott-api.konghq.com/admin-api"
authentication:
type: apikey
key: "apikey"
value: "$secrets.kong_admin_key"
placement: header
resources:
- name: services
path: "/services/{{service}}/status"
inputParameters:
- name: service
in: path
operations:
- name: get-service-status
method: GET
Retrieves Azure Active Directory group membership for a user, returning all group names and their types.
naftiko: "0.5"
info:
label: "Azure AD Group Membership Lookup"
description: "Retrieves Azure Active Directory group membership for a user, returning all group names and their types."
tags:
- security
- identity
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: ad-groups
port: 8080
tools:
- name: get-user-groups
description: "Given a user principal name, return all Azure AD group memberships with group names and types. Use when IT security needs to audit user group assignments."
inputParameters:
- name: user_upn
in: body
type: string
description: "User principal name (email)."
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, returning cost breakdown and budget utilization.
naftiko: "0.5"
info:
label: "Azure Resource Cost Lookup"
description: "Queries Azure Cost Management for current month spend by resource group, returning cost breakdown and budget utilization."
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 name, return current month spend, budget limit, and utilization percentage. Use when FinOps teams need 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"
- name: budget_limit
type: number
mapping: "$.properties.budget_limit"
- name: utilization_percent
type: number
mapping: "$.properties.utilization"
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
Uploads a regulatory document to a specified Box folder and returns the file ID and shared link.
naftiko: "0.5"
info:
label: "Box Regulatory File Upload"
description: "Uploads a regulatory document to a specified Box folder and returns the file ID and shared 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 details, upload the document to Box and return the file ID and link. Use when regulatory teams need to store documents in Box."
inputParameters:
- name: folder_id
in: body
type: string
description: "Box folder ID."
- name: file_name
in: body
type: string
description: "Name of the file to upload."
call: box.upload-file
with:
folder_id: "{{folder_id}}"
name: "{{file_name}}"
outputParameters:
- name: file_id
type: string
mapping: "$.entries[0].id"
- name: shared_link
type: string
mapping: "$.entries[0].shared_link.url"
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
When a GitHub Actions workflow fails on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering Teams channel.
naftiko: "0.5"
info:
label: "CI/CD Pipeline Failure Observability"
description: "When a GitHub Actions workflow fails on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering Teams channel."
tags:
- devops
- cicd
- github
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: devops-ci
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions failure event with repo, branch, commit, and workflow details, open a Jira bug in the engineering project, create a Datadog deployment event, and post an alert to the engineering Teams channel. Use when a protected-branch CI pipeline fails."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository full name."
- name: branch
in: body
type: string
description: "Branch where the failure occurred."
- name: commit_sha
in: body
type: string
description: "Failing commit SHA."
- name: workflow_name
in: body
type: string
description: "Name of the failed GitHub Actions workflow."
- name: run_url
in: body
type: string
description: "URL to the failed workflow run."
- name: eng_channel_id
in: body
type: string
description: "Engineering Teams channel ID."
steps:
- name: create-bug
type: call
call: jira-eng.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
description: "Commit: {{commit_sha}}\nRun: {{run_url}}"
- name: log-deploy-event
type: call
call: datadog-ci.create-event
with:
title: "CI Failure: {{repo}} — {{branch}}"
text: "Commit {{commit_sha}} | Workflow {{workflow_name}} failed"
alert_type: "error"
- name: alert-eng
type: call
call: msteams-eng.post-channel-message
with:
channel_id: "{{eng_channel_id}}"
text: "CI Failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{run_url}}"
consumes:
- type: http
namespace: jira-eng
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog-ci
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates clinical database lock by running final 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 final data quality checks, generating discrepancy reports, locking the database, and notifying biostatistics."
tags:
- clinical
- rd
- quality
- 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 data quality checks, generate discrepancy report, lock the database, and notify biostatistics. Use when clinical data management is ready to lock a study database."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
- name: lock_date
in: body
type: string
description: "Target database lock date in YYYY-MM-DD format."
steps:
- name: run-quality-checks
type: call
call: snowflake.execute-query
with:
query_name: "clinical_data_quality_check"
params: "{{study_id}}"
- name: generate-discrepancy-report
type: call
call: snowflake.execute-query
with:
query_name: "discrepancy_report"
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}}. Discrepancies: {{generate-discrepancy-report.discrepancy_count}}. Lock status: {{lock-database.status}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.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://abbott-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, creating monitoring visits, and notifying the clinical operations team.
naftiko: "0.5"
info:
label: "Clinical Site Activation Orchestration"
description: "Activates a clinical trial site by verifying IRB approval, provisioning site access, creating monitoring visits, and notifying the clinical operations team."
tags:
- clinical
- rd
- oracle
- servicenow
- 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 approval, provision site access, schedule monitoring, and notify the team. Use when clinical operations is ready to activate a new 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}}"
site_id: "{{site_id}}"
- name: schedule-monitoring
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 status: {{verify-irb.status}}. Initiation visit scheduled: {{schedule-monitoring.visit_date}}"
consumes:
- type: http
namespace: oracle-clinical
baseUri: "https://abbott-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://abbott.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
When a serious adverse event is reported, logs it in the safety database, notifies the medical monitor, creates a regulatory filing task, and updates the trial management system.
naftiko: "0.5"
info:
label: "Clinical Trial Adverse Event Reporting"
description: "When a serious adverse event is reported, logs it in the safety database, notifies the medical monitor, creates a regulatory filing task, and updates the trial management system."
tags:
- clinical
- regulatory
- safety
- oracle
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-safety
port: 8080
tools:
- name: report-adverse-event
description: "Given a study ID, patient ID, and event description, log the adverse event in the safety database, alert the medical monitor, create a regulatory task, and update the 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: "Event 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-medical-monitor
type: call
call: msteams.send-message
with:
channel_id: "medical-monitoring"
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: "Regulatory_Safety"
- name: update-ctms
type: call
call: oracle-clinical.update-study-event
with:
study_id: "{{study_id}}"
subject_id: "{{patient_id}}"
safety_case: "{{log-safety-event.case_number}}"
consumes:
- type: http
namespace: oracle-argus
baseUri: "https://abbott-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://abbott.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: oracle-clinical
baseUri: "https://abbott-ctms.oracle.com/api/v2"
authentication:
type: bearer
token: "$secrets.oracle_ctms_token"
resources:
- name: study-events
path: "/studies/{{study_id}}/subjects/{{subject_id}}/events"
inputParameters:
- name: study_id
in: path
- name: subject_id
in: path
operations:
- name: update-study-event
method: POST
Queries the clinical trial management system for current patient enrollment counts, site-level progress, and projected completion dates for a given study.
naftiko: "0.5"
info:
label: "Clinical Trial Patient Enrollment Tracker"
description: "Queries the clinical trial management system for current patient enrollment counts, site-level progress, and projected completion dates for a given 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 current enrollment count, target enrollment, site breakdown, and projected completion date. Use when clinical ops needs enrollment visibility."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical trial 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://abbott-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
Tracks regulatory submission status for clinical trial documents in Veeva Vault, logs updates in ServiceNow, and notifies the regulatory affairs team via Teams.
naftiko: "0.5"
info:
label: "Clinical Trial Regulatory Submission Tracker"
description: "Tracks regulatory submission status for clinical trial documents in Veeva Vault, logs updates in ServiceNow, and notifies the regulatory affairs team via Teams."
tags:
- regulatory
- clinical
- veeva
- servicenow
- healthcare
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: track-submission-status
description: "Given a Veeva Vault document ID, retrieve the current regulatory submission status, update the corresponding ServiceNow record, and notify the regulatory affairs Teams channel. Use when regulatory teams need to track submission milestones."
inputParameters:
- name: vault_document_id
in: body
type: string
description: "Veeva Vault document ID for the regulatory submission."
- name: servicenow_record_id
in: body
type: string
description: "ServiceNow record sys_id to update with submission status."
- name: teams_channel_id
in: body
type: string
description: "Regulatory affairs Teams channel ID."
steps:
- name: get-doc-status
type: call
call: veeva-vault.get-document
with:
document_id: "{{vault_document_id}}"
- name: update-snow-record
type: call
call: servicenow-reg.update-record
with:
sys_id: "{{servicenow_record_id}}"
submission_status: "{{get-doc-status.lifecycle_state}}"
last_updated: "{{get-doc-status.modified_date}}"
- name: notify-reg-team
type: call
call: msteams-reg.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Regulatory submission {{vault_document_id}} status: {{get-doc-status.lifecycle_state}} (updated {{get-doc-status.modified_date}}). ServiceNow updated: {{servicenow_record_id}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_token"
resources:
- name: documents
path: "/objects/documents/{{document_id}}"
inputParameters:
- name: document_id
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: servicenow-reg
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/u_regulatory_submission/{{sys_id}}"
inputParameters:
- name: sys_id
in: path
operations:
- name: update-record
method: PATCH
- type: http
namespace: msteams-reg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira ticket for the cloud team, and posts an alert to the FinOps Teams channel.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Response"
description: "When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira ticket for the cloud team, and posts an alert to the FinOps Teams channel."
tags:
- finops
- cloud
- aws
- datadog
- jira
capability:
exposes:
- type: mcp
namespace: finops-ops
port: 8080
tools:
- name: handle-cost-anomaly
description: "Given an AWS cost anomaly ID, service name, and estimated overage, create a Datadog warning event, open a Jira ticket for the cloud FinOps team, and post to the FinOps Teams channel. Use when AWS Cost Anomaly Detection triggers above the configured threshold."
inputParameters:
- name: anomaly_id
in: body
type: string
description: "AWS Cost Anomaly Detection anomaly ID."
- name: service_name
in: body
type: string
description: "AWS service generating the cost anomaly."
- name: estimated_overage_usd
in: body
type: number
description: "Estimated cost overage in USD."
- name: finops_channel_id
in: body
type: string
description: "FinOps Teams channel ID."
steps:
- name: create-dd-event
type: call
call: datadog.create-event
with:
title: "AWS Cost Anomaly: {{service_name}}"
text: "Anomaly {{anomaly_id}} — estimated overage ${{estimated_overage_usd}}"
alert_type: "warning"
- name: open-jira
type: call
call: jira-cloud.create-issue
with:
project_key: "CLOUD"
issuetype: "Task"
summary: "Cost anomaly: {{service_name}} +${{estimated_overage_usd}}"
description: "AWS anomaly {{anomaly_id}}. Datadog: {{create-dd-event.id}}. Investigate and remediate."
- name: alert-finops
type: call
call: msteams-finops.post-channel-message
with:
channel_id: "{{finops_channel_id}}"
text: "AWS Cost Anomaly on {{service_name}}: +${{estimated_overage_usd}} | Jira: {{open-jira.key}} | Datadog: {{create-dd-event.url}}"
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: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: jira-cloud
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Initiates a compliance document review cycle by retrieving the document from Veeva Vault, creating reviewer tasks in ServiceNow, setting deadlines, and notifying reviewers.
naftiko: "0.5"
info:
label: "Compliance Document Review Orchestration"
description: "Initiates a compliance document review cycle by retrieving the document from Veeva Vault, creating reviewer tasks in ServiceNow, setting deadlines, 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 Veeva document ID and reviewer list, create review tasks, set deadlines, and notify reviewers. Use when quality or compliance initiates periodic 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 in YYYY-MM-DD format."
steps:
- name: get-document
type: call
call: veeva-vault.get-document
with:
doc_id: "{{document_id}}"
- name: create-review-task
type: call
call: servicenow.create-task
with:
short_description: "Review: {{get-document.title}}"
category: "compliance_review"
assigned_group: "Quality_Compliance"
due_date: "{{review_deadline}}"
- name: notify-reviewers
type: call
call: msteams.send-message
with:
channel_id: "compliance-reviews"
text: "Document review requested: {{get-document.title}} (v{{get-document.version}}). Due: {{review_deadline}}. Task: {{create-review-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott-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://abbott.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 document from Confluence by page ID, returning title, content, version, and last updated date.
naftiko: "0.5"
info:
label: "Confluence SOP Retrieval"
description: "Retrieves a standard operating procedure document from Confluence by page ID, returning title, content, version, and last updated date."
tags:
- quality
- documentation
- confluence
capability:
exposes:
- type: mcp
namespace: sop-library
port: 8080
tools:
- name: get-sop-document
description: "Given a Confluence page ID, return the SOP title, body content, version number, and last modified date. Use when quality or operations staff need to reference standard procedures."
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"
- name: last_updated
type: string
mapping: "$.version.when"
consumes:
- type: http
namespace: confluence
baseUri: "https://abbott.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,body.storage"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
Queries CrowdStrike Falcon for threat detections on a specific endpoint, returning detection details, severity, and recommended actions.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Lookup"
description: "Queries CrowdStrike Falcon for threat detections on a specific endpoint, returning detection details, severity, and recommended actions."
tags:
- security
- endpoint
- crowdstrike
capability:
exposes:
- type: mcp
namespace: endpoint-security
port: 8080
tools:
- name: get-endpoint-threats
description: "Given a hostname, return active threat detections, severity levels, and recommended remediation actions. Use when security operations investigates endpoint 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"
- name: max_severity
type: string
mapping: "$.resources[0].max_severity_displayname"
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
Analyzes customer complaint trends by querying Snowflake for complaint data grouped by product line, category, and time period.
naftiko: "0.5"
info:
label: "Customer Complaint Trend Analysis"
description: "Analyzes customer complaint trends by querying Snowflake for complaint data grouped by product line, category, and time period."
tags:
- quality
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: complaint-analytics
port: 8080
tools:
- name: analyze-complaint-trends
description: "Given a product line and time period, return complaint counts by category, trending patterns, and comparison to prior period. Use when quality teams need complaint trend visibility."
inputParameters:
- name: product_line
in: body
type: string
description: "Product line name, e.g. 'Diagnostics', 'Nutrition', 'Medical Devices'."
- name: period
in: body
type: string
description: "Analysis period, e.g. 'last_90_days'."
call: snowflake.execute-query
with:
query_name: "complaint_trend_analysis"
params: "{{product_line}},{{period}}"
outputParameters:
- name: total_complaints
type: integer
mapping: "$.data[0].total"
- name: top_category
type: string
mapping: "$.data[0].top_category"
- name: trend_direction
type: string
mapping: "$.data[0].trend"
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Deploys a machine learning model from Databricks to production by registering the model, running validation, deploying the endpoint, 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 the model, running validation, deploying the endpoint, 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 it, run validation tests, deploy to serving endpoint, and notify the team. Use when data science approves a model for production deployment."
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-request
type: call
call: servicenow.create-change
with:
short_description: "ML model deployment: {{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 to production. Change request: {{create-change-request.number}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://abbott.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://abbott.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 the current health status of a monitored application, returning uptime, error rate, and active alerts.
naftiko: "0.5"
info:
label: "Datadog Application Health Check"
description: "Queries Datadog for the current health status of a monitored application, 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 Datadog service name, return the current uptime percentage, error rate, and count of active alerts. Use when SRE teams need quick application health visibility."
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"
- name: active_alerts
type: integer
mapping: "$.data.active_alerts_count"
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
When a medical device complaint exceeds severity threshold, automatically creates a CAPA record, notifies the quality team, and updates the complaint tracking system.
naftiko: "0.5"
info:
label: "Device Complaint to CAPA Orchestration"
description: "When a medical device complaint exceeds severity threshold, automatically creates a CAPA record, notifies the quality team, and updates the complaint tracking system."
tags:
- quality
- regulatory
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: quality-complaint-capa
port: 8080
tools:
- name: escalate-complaint-to-capa
description: "Given a complaint case ID, evaluate severity and create a CAPA if threshold is met, notify quality leadership, and update the complaint record. Use when quality assurance identifies a high-severity device complaint."
inputParameters:
- name: complaint_case_id
in: body
type: string
description: "Salesforce complaint case ID."
steps:
- name: get-complaint
type: call
call: salesforce.get-case
with:
case_id: "{{complaint_case_id}}"
- name: create-capa
type: call
call: servicenow.create-capa
with:
short_description: "CAPA from complaint: {{get-complaint.subject}}"
severity: "{{get-complaint.severity}}"
product_code: "{{get-complaint.product_code}}"
source_complaint: "{{complaint_case_id}}"
- name: notify-quality
type: call
call: msteams.send-message
with:
channel_id: "quality-leadership"
text: "CAPA {{create-capa.number}} created from device complaint {{complaint_case_id}} - Severity: {{get-complaint.severity}} - Product: {{get-complaint.product_code}}"
- name: update-complaint
type: call
call: salesforce.update-case
with:
case_id: "{{complaint_case_id}}"
capa_reference: "{{create-capa.number}}"
status: "CAPA Initiated"
consumes:
- type: http
namespace: salesforce
baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- name: update-case
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: capa
path: "/table/u_capa"
operations:
- name: create-capa
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages reagent lot release by checking QC test results in SAP, verifying specifications, creating the release certificate, and notifying distribution.
naftiko: "0.5"
info:
label: "Diagnostic Reagent Lot Release Orchestration"
description: "Manages reagent lot release by checking QC test results in SAP, verifying specifications, creating the release certificate, and notifying distribution."
tags:
- quality
- manufacturing
- diagnostics
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lot-release
port: 8080
tools:
- name: release-reagent-lot
description: "Given a batch number and product code, verify QC results, generate release certificate, update SAP status, and notify distribution. Use when quality assurance releases a diagnostic reagent lot."
inputParameters:
- name: batch_number
in: body
type: string
description: "Manufacturing batch number."
- name: product_code
in: body
type: string
description: "Diagnostic reagent product code."
steps:
- name: get-qc-results
type: call
call: sap-erp.get-inspection
with:
batch: "{{batch_number}}"
material: "{{product_code}}"
- name: update-batch-status
type: call
call: sap-erp.release-batch
with:
batch: "{{batch_number}}"
status: "released"
- name: create-certificate
type: call
call: servicenow.create-task
with:
short_description: "CoA generation: Batch {{batch_number}} - {{product_code}}"
category: "quality_release"
assigned_group: "Quality_Assurance"
- name: notify-distribution
type: call
call: msteams.send-message
with:
channel_id: "diagnostics-distribution"
text: "Reagent lot {{batch_number}} ({{product_code}}) released. QC result: {{get-qc-results.result}}. CoA task: {{create-certificate.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Pulls the diagnostics division's open Salesforce opportunity pipeline, refreshes the Power BI executive dashboard, and emails a weekly summary to sales leadership.
naftiko: "0.5"
info:
label: "Diagnostics Sales Opportunity Pipeline Report"
description: "Pulls the diagnostics division's open Salesforce opportunity pipeline, refreshes the Power BI executive dashboard, and emails a weekly summary to sales leadership."
tags:
- sales
- crm
- salesforce
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: sales-pipeline
port: 8080
tools:
- name: publish-pipeline-report
description: "Given a Salesforce opportunity filter and Power BI dataset ID, retrieve the open sales pipeline from Salesforce, trigger a Power BI refresh, and email the pipeline summary to sales leadership. Use weekly for sales forecast reviews."
inputParameters:
- name: division
in: body
type: string
description: "Sales division to filter, e.g. 'Diagnostics' or 'Medical Devices'."
- name: pbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for the pipeline dashboard."
- name: leadership_email
in: body
type: string
description: "Sales leadership email distribution list."
steps:
- name: get-pipeline
type: call
call: salesforce-pipeline.query-opportunities
with:
division: "{{division}}"
stage_not_in: "Closed Won,Closed Lost"
- name: refresh-pbi
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "{{pbi_dataset_id}}"
- name: send-summary
type: call
call: msgraph-sales.send-email
with:
to: "{{leadership_email}}"
subject: "{{division}} Pipeline Report — {{get-pipeline.record_count}} opportunities | ${{get-pipeline.total_value}}"
body: "Open pipeline for {{division}}: {{get-pipeline.record_count}} opportunities totaling ${{get-pipeline.total_value}}. Power BI dashboard refreshed."
consumes:
- type: http
namespace: salesforce-pipeline
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
inputParameters:
- name: division
in: query
- name: stage_not_in
in: query
operations:
- name: query-opportunities
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msgraph-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender}}/sendMail"
operations:
- name: send-email
method: POST
Sends a contract for electronic signature via DocuSign, updates the Salesforce opportunity with the envelope status, and notifies legal when fully executed.
naftiko: "0.5"
info:
label: "DocuSign Contract Execution Orchestration"
description: "Sends a contract for electronic signature via DocuSign, updates the Salesforce opportunity with the envelope status, and notifies legal when fully executed."
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 contract template, send the contract via DocuSign, update CRM, and notify legal upon completion. Use when sales needs to execute a customer contract."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
- name: template_id
in: body
type: string
description: "DocuSign template identifier."
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"
envelope_id: "{{send-envelope.envelope_id}}"
- 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}}. Opportunity: {{opportunity_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://abbott.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
When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and removes Salesforce user license.
naftiko: "0.5"
info:
label: "Employee Offboarding Deprovisioning"
description: "When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and removes Salesforce user license."
tags:
- hr
- offboarding
- okta
- workday
- identity
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: deprovision-terminated-employee
description: "Given a terminated employee's Workday ID and Okta user ID, deactivate their Okta account, close open ServiceNow access requests, and deactivate their Salesforce user license. Use immediately upon processing a termination in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the terminated employee."
- name: okta_user_id
in: body
type: string
description: "Okta user ID to deactivate."
- name: salesforce_user_id
in: body
type: string
description: "Salesforce user ID to deactivate."
steps:
- name: deactivate-okta
type: call
call: okta-offboard.deactivate-user
with:
user_id: "{{okta_user_id}}"
- name: close-access-requests
type: call
call: servicenow-offboard.patch-requests
with:
employee_id: "{{workday_employee_id}}"
state: "closed_complete"
- name: deactivate-sf
type: call
call: salesforce-offboard.update-user
with:
user_id: "{{salesforce_user_id}}"
is_active: "false"
consumes:
- type: http
namespace: okta-offboard
baseUri: "https://abbott.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: user-lifecycle
path: "/users/{{user_id}}/lifecycle/deactivate"
inputParameters:
- name: user_id
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: servicenow-offboard
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: patch-requests
method: PATCH
- type: http
namespace: salesforce-offboard
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
When a Workday employee role change is approved, updates their Okta group memberships, adjusts Salesforce user profile, and notifies the IT help desk via ServiceNow.
naftiko: "0.5"
info:
label: "Employee Role Change Provisioning"
description: "When a Workday employee role change is approved, updates their Okta group memberships, adjusts Salesforce user profile, and notifies the IT help desk via ServiceNow."
tags:
- hr
- identity
- workday
- okta
- provisioning
capability:
exposes:
- type: mcp
namespace: role-change
port: 8080
tools:
- name: process-role-change
description: "Given a Workday employee ID, new role, and Okta group assignments, update the employee's Okta group membership to reflect new role permissions, update their Salesforce user profile, and create a ServiceNow task for IT follow-up. Use when an employee's role or department changes."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the employee with the role change."
- name: new_role
in: body
type: string
description: "New job title or role description."
- name: okta_add_groups
in: body
type: string
description: "Comma-separated Okta group IDs to add the user to."
- name: okta_remove_groups
in: body
type: string
description: "Comma-separated Okta group IDs to remove the user from."
- name: salesforce_user_id
in: body
type: string
description: "Salesforce user ID to update."
steps:
- name: get-worker
type: call
call: workday-rc.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: update-okta-groups
type: call
call: okta-role.update-user-groups
with:
user_email: "{{get-worker.work_email}}"
add_groups: "{{okta_add_groups}}"
remove_groups: "{{okta_remove_groups}}"
- name: update-sf-profile
type: call
call: salesforce-role.update-user
with:
user_id: "{{salesforce_user_id}}"
title: "{{new_role}}"
- name: create-it-task
type: call
call: servicenow-rc.create-task
with:
short_description: "Role change: {{get-worker.full_name}} → {{new_role}}"
category: "access_management"
assigned_group: "IT_Access_Provisioning"
consumes:
- type: http
namespace: workday-rc
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-role
baseUri: "https://abbott.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: user-groups
path: "/groups/{{group_id}}/users"
inputParameters:
- name: group_id
in: path
operations:
- name: update-user-groups
method: POST
- type: http
namespace: salesforce-role
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: servicenow-rc
baseUri: "https://abbott.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
When an employee transfers between divisions, updates Workday, re-provisions Okta group memberships, transfers ServiceNow assets, and notifies both managers.
naftiko: "0.5"
info:
label: "Employee Transfer Orchestration"
description: "When an employee transfers between divisions, updates Workday, re-provisions Okta group memberships, transfers ServiceNow assets, and notifies both 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, source department, and target department, update HR records, re-provision access, transfer assets, and notify stakeholders. Use when HR processes an inter-division 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-groups
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-managers
type: call
call: msteams.send-message
with:
channel_id: "hr-operations"
text: "Transfer processed: {{get-employee.first_name}} {{get-employee.last_name}} to {{target_department}}. Access updated. Assets transferred."
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://abbott.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://abbott.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
When an environmental monitoring sensor detects an out-of-spec condition in a cleanroom, creates an incident, alerts quality, logs a deviation, and triggers investigation.
naftiko: "0.5"
info:
label: "Environmental Monitoring Alert Response"
description: "When an environmental monitoring sensor detects an out-of-spec condition in a cleanroom, creates an incident, alerts quality, logs a deviation, and triggers investigation."
tags:
- manufacturing
- quality
- compliance
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-monitoring
port: 8080
tools:
- name: handle-env-excursion
description: "Given a sensor ID, parameter name, and measured value, create an incident, alert quality, log a deviation, and initiate investigation. Use when cleanroom environmental monitoring detects out-of-spec conditions."
inputParameters:
- name: sensor_id
in: body
type: string
description: "Environmental monitoring sensor identifier."
- name: parameter_name
in: body
type: string
description: "Parameter out of spec, e.g. 'particle_count', 'temperature', 'humidity'."
- name: measured_value
in: body
type: string
description: "The measured out-of-spec value."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Environmental excursion: {{parameter_name}} at sensor {{sensor_id}}"
category: "manufacturing_quality"
priority: "2"
assigned_group: "Quality_Assurance"
- name: log-deviation
type: call
call: servicenow.create-deviation
with:
description: "Environmental excursion: {{parameter_name}} measured {{measured_value}} at sensor {{sensor_id}}"
area: "cleanroom"
incident_ref: "{{create-incident.number}}"
- name: alert-quality
type: call
call: msteams.send-message
with:
channel_id: "quality-alerts"
text: "ENV ALERT: {{parameter_name}} excursion at sensor {{sensor_id}}. Value: {{measured_value}}. Deviation: {{log-deviation.number}}. Incident: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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
- name: deviations
path: "/table/u_deviation"
operations:
- name: create-deviation
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages equipment calibration by checking due dates in SAP, scheduling the calibration, assigning technicians, and updating the calibration certificate in the QMS.
naftiko: "0.5"
info:
label: "Equipment Calibration Orchestration"
description: "Manages equipment calibration by checking due dates in SAP, scheduling the calibration, assigning technicians, and updating the calibration certificate in the QMS."
tags:
- quality
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: calibration-mgmt
port: 8080
tools:
- name: schedule-calibration
description: "Given an equipment ID, check calibration due date, schedule the calibration, assign a technician, and update the QMS. Use when quality assurance manages calibration schedules."
inputParameters:
- name: equipment_id
in: body
type: string
description: "SAP equipment identifier."
steps:
- name: check-due-date
type: call
call: sap-erp.get-calibration-status
with:
equipment: "{{equipment_id}}"
- name: create-work-order
type: call
call: servicenow.create-work-order
with:
short_description: "Calibration: Equipment {{equipment_id}}"
category: "calibration"
assigned_group: "Metrology_Lab"
due_date: "{{check-due-date.next_cal_date}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "quality-calibration"
text: "Calibration scheduled for equipment {{equipment_id}}. Due: {{check-due-date.next_cal_date}}. Work order: {{create-work-order.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment}}')/calibration"
inputParameters:
- name: equipment
in: path
operations:
- name: get-calibration-status
method: GET
- type: http
namespace: servicenow
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current status of a pending FDA 510(k) premarket notification by submission number from the regulatory affairs tracking system.
naftiko: "0.5"
info:
label: "FDA 510(k) Submission Status Lookup"
description: "Retrieves the current status of a pending FDA 510(k) premarket notification by submission number from the regulatory affairs tracking system."
tags:
- regulatory
- fda
- veeva-vault
capability:
exposes:
- type: mcp
namespace: regulatory-submissions
port: 8080
tools:
- name: get-510k-status
description: "Given a 510(k) submission number, return the current review status, reviewer assignment, and expected decision date. Use when regulatory affairs needs to check submission progress."
inputParameters:
- name: submission_number
in: body
type: string
description: "FDA 510(k) submission number, e.g. 'K231234'."
call: veeva-vault.get-submission
with:
submission_id: "{{submission_number}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: reviewer
type: string
mapping: "$.data.assigned_reviewer"
- name: expected_decision_date
type: string
mapping: "$.data.target_date"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: submissions
path: "/objects/submission__c/{{submission_id}}"
inputParameters:
- name: submission_id
in: path
operations:
- name: get-submission
method: GET
When a customer reports a diagnostic instrument issue, creates a service case, identifies the nearest field engineer, dispatches them, and updates the customer.
naftiko: "0.5"
info:
label: "Field Service Dispatch Orchestration"
description: "When a customer reports a diagnostic instrument issue, creates a service case, identifies the nearest field engineer, dispatches them, and updates the customer."
tags:
- service
- diagnostics
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: field-service
port: 8080
tools:
- name: dispatch-field-engineer
description: "Given a customer account ID and issue description, create a service case, find the nearest engineer, dispatch them, and notify the customer. Use when customer support escalates a field service need."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce customer account ID."
- name: issue_description
in: body
type: string
description: "Description of the instrument issue."
steps:
- name: create-case
type: call
call: salesforce.create-case
with:
account_id: "{{account_id}}"
subject: "Field service: {{issue_description}}"
type: "field_service"
- name: find-engineer
type: call
call: servicenow.find-available-resource
with:
skill: "diagnostics_instruments"
location: "{{account_id}}"
- name: create-work-order
type: call
call: servicenow.create-work-order
with:
case_ref: "{{create-case.case_number}}"
assigned_to: "{{find-engineer.engineer_id}}"
description: "{{issue_description}}"
- name: notify-customer
type: call
call: msteams.send-message
with:
channel_id: "customer-service"
text: "Field engineer {{find-engineer.engineer_name}} dispatched for case {{create-case.case_number}}. ETA: {{find-engineer.estimated_arrival}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: servicenow
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/table/cmn_schedule_span"
operations:
- name: find-available-resource
method: GET
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Coordinates a new FreeStyle Libre product launch by creating a Marketo campaign, updating Salesforce opportunity stages, and scheduling LinkedIn promotional content.
naftiko: "0.5"
info:
label: "FreeStyle Libre Device Launch Campaign"
description: "Coordinates a new FreeStyle Libre product launch by creating a Marketo campaign, updating Salesforce opportunity stages, and scheduling LinkedIn promotional content."
tags:
- marketing
- salesforce
- marketo
- linkedin
- medical-devices
capability:
exposes:
- type: mcp
namespace: product-launch
port: 8080
tools:
- name: setup-device-launch-campaign
description: "Given a product name, launch date, and target segment, create a Marketo email campaign, update related Salesforce opportunities to the pre-launch stage, and schedule a LinkedIn post for the launch date. Use when marketing a new medical device launch."
inputParameters:
- name: product_name
in: body
type: string
description: "Product name, e.g. 'FreeStyle Libre 3 Plus'."
- name: launch_date
in: body
type: string
description: "Product launch date in YYYY-MM-DD format."
- name: target_segment
in: body
type: string
description: "Target audience segment, e.g. 'Endocrinologists' or 'Diabetes Care'."
- name: linkedin_copy
in: body
type: string
description: "Copy text for the LinkedIn announcement post."
steps:
- name: create-marketo-campaign
type: call
call: marketo.create-campaign
with:
name: "{{product_name}} Launch — {{launch_date}}"
segment: "{{target_segment}}"
start_date: "{{launch_date}}"
- name: update-sf-opportunities
type: call
call: salesforce-opps.update-opportunities
with:
product_name: "{{product_name}}"
stage_name: "Pre-Launch"
- name: schedule-linkedin-post
type: call
call: linkedin-mkt.create-post
with:
text: "{{linkedin_copy}}"
scheduled_time: "{{launch_date}}"
consumes:
- type: http
namespace: marketo
baseUri: "https://abbott.mktorest.com/rest/v1"
authentication:
type: bearer
token: "$secrets.marketo_token"
resources:
- name: campaigns
path: "/campaigns.json"
operations:
- name: create-campaign
method: POST
- type: http
namespace: salesforce-opps
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: update-opportunities
method: PATCH
- type: http
namespace: linkedin-mkt
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: posts
path: "/ugcPosts"
operations:
- name: create-post
method: POST
Checks a GitHub repository for branch protection rules, required reviewers, and security scanning configuration.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Check"
description: "Checks a GitHub repository for branch protection rules, 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 GitHub repository name, return branch protection status, required reviewer count, and security scanning enablement. Use when engineering leads need to verify 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: required_reviewers
type: integer
mapping: "$.data.required_reviewers"
- 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 detects a critical CVE in a product codebase, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Alert Triage"
description: "When GitHub Advanced Security detects a critical CVE in a product codebase, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams."
tags:
- security
- github
- devops
- jira
- vulnerability
capability:
exposes:
- type: mcp
namespace: sec-vuln
port: 8080
tools:
- name: triage-security-alert
description: "Given a GitHub security alert with CVE, severity, and affected package, create a high-priority Jira security ticket, log a Datadog error event, and alert the cybersecurity Teams channel. Use when GitHub Advanced Security emits a critical alert on a product or clinical system repo."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository full name."
- name: cve_id
in: body
type: string
description: "CVE identifier."
- name: severity
in: body
type: string
description: "Severity: critical, high, medium, or low."
- name: package_name
in: body
type: string
description: "Affected package name."
- name: sec_channel_id
in: body
type: string
description: "Cybersecurity Teams channel ID."
steps:
- name: create-sec-ticket
type: call
call: jira-sec.create-issue
with:
project_key: "SEC"
issuetype: "Bug"
summary: "[{{severity}}] {{cve_id}} in {{repo}} — {{package_name}}"
description: "CVE: {{cve_id}} | Package: {{package_name}} | Severity: {{severity}} | Repo: {{repo}}"
priority: "Highest"
- name: log-dd-event
type: call
call: datadog-sec.create-event
with:
title: "Security vulnerability: {{cve_id}} in {{repo}}"
text: "Package {{package_name}} | Severity: {{severity}} | Jira: {{create-sec-ticket.key}}"
alert_type: "error"
- name: alert-security-team
type: call
call: msteams-sec.post-channel-message
with:
channel_id: "{{sec_channel_id}}"
text: "SECURITY: {{severity}} CVE {{cve_id}} in {{repo}} / {{package_name}} | Jira: {{create-sec-ticket.key}} | Datadog: {{log-dd-event.url}}"
consumes:
- type: http
namespace: jira-sec
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog-sec
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams-sec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/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, returning completion rates and overdue assignments.
naftiko: "0.5"
info:
label: "GMP Training Compliance Check"
description: "Checks GMP training compliance for a department by querying Workday Learning, returning completion rates and overdue assignments."
tags:
- quality
- compliance
- workday
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-gmp-compliance
description: "Given a department code, return the GMP training completion rate, number of overdue assignments, and list of non-compliant employees. Use when quality assurance needs training compliance 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"
- name: total_employees
type: integer
mapping: "$.data.total_employees"
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?department={{department}}&type={{training_type}}"
inputParameters:
- name: department
in: query
- name: training_type
in: query
operations:
- name: get-training-compliance
method: GET
Triggers an Informatica Cloud data integration job and returns the run status and processed record count.
naftiko: "0.5"
info:
label: "Informatica Data Integration Job Trigger"
description: "Triggers an Informatica Cloud data integration job and returns the run status and processed record count."
tags:
- data
- integration
- informatica
capability:
exposes:
- type: mcp
namespace: data-integration
port: 8080
tools:
- name: trigger-integration-job
description: "Given an Informatica task ID, trigger the data integration job and return the run ID and status. Use when data engineering needs to manually trigger ETL jobs."
inputParameters:
- name: task_id
in: body
type: string
description: "Informatica Cloud task identifier."
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
Submits a ServiceNow change request for planned IT maintenance, routes it through CAB approval, and notifies affected teams in Microsoft Teams.
naftiko: "0.5"
info:
label: "IT Change Management Request"
description: "Submits a ServiceNow change request for planned IT maintenance, routes it through CAB approval, and notifies affected teams in Microsoft Teams."
tags:
- itsm
- change-management
- servicenow
- approval
- it-ops
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: submit-change-request
description: "Given a change description, affected systems, and maintenance window, create a ServiceNow change request and notify the change advisory board Teams channel. Use when engineering teams plan maintenance affecting production systems."
inputParameters:
- name: short_description
in: body
type: string
description: "Brief description of the change."
- name: description
in: body
type: string
description: "Full change details including rollback plan."
- name: planned_start
in: body
type: string
description: "Planned start time in ISO 8601 format."
- name: planned_end
in: body
type: string
description: "Planned end time in ISO 8601 format."
- name: cab_channel_id
in: body
type: string
description: "CAB Teams channel ID."
steps:
- name: create-change
type: call
call: servicenow-chg.create-change-request
with:
short_description: "{{short_description}}"
description: "{{description}}"
start_date: "{{planned_start}}"
end_date: "{{planned_end}}"
type: "normal"
- name: notify-cab
type: call
call: msteams-cab.post-channel-message
with:
channel_id: "{{cab_channel_id}}"
text: "Change Request {{create-change.number}}: {{short_description}} | Window: {{planned_start}} to {{planned_end}} | Status: awaiting CAB approval"
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://abbott.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-request
method: POST
- type: http
namespace: msteams-cab
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When Datadog fires a critical alert on a clinical system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel.
naftiko: "0.5"
info:
label: "IT P1 Incident Triage and Escalation"
description: "When Datadog fires a critical alert on a clinical system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel."
tags:
- itsm
- incident-response
- datadog
- pagerduty
- servicenow
capability:
exposes:
- type: mcp
namespace: p1-triage
port: 8080
tools:
- name: handle-critical-alert
description: "Given a Datadog critical alert for a clinical or corporate system, create a P1 ServiceNow incident, trigger a PagerDuty page to the on-call engineer, and post an alert to the IT war-room Teams channel. Use when monitoring detects a critical system failure."
inputParameters:
- name: alert_id
in: body
type: string
description: "Datadog monitor alert ID."
- name: system_name
in: body
type: string
description: "Name of the affected system."
- name: alert_message
in: body
type: string
description: "Human-readable alert description."
- name: warroom_channel_id
in: body
type: string
description: "IT war-room Teams channel ID."
steps:
- name: create-p1-incident
type: call
call: servicenow-p1.create-incident
with:
short_description: "P1 Alert — {{system_name}}"
description: "Datadog alert {{alert_id}}: {{alert_message}}"
priority: "1"
category: "Critical_System"
- name: page-oncall
type: call
call: pagerduty.trigger-incident
with:
title: "P1 Critical Alert — {{system_name}}"
severity: "critical"
details: "ServiceNow INC: {{create-p1-incident.number}} | Alert: {{alert_id}}"
- name: post-warroom
type: call
call: msteams-p1.post-channel-message
with:
channel_id: "{{warroom_channel_id}}"
text: "P1 INCIDENT: {{system_name}} | INC: {{create-p1-incident.number}} | PagerDuty: {{page-oncall.incident_key}} | Alert: {{alert_message}}"
consumes:
- type: http
namespace: servicenow-p1
baseUri: "https://abbott.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: pagerduty
baseUri: "https://events.pagerduty.com/v2"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.pagerduty_token"
placement: header
resources:
- name: enqueue
path: "/enqueue"
operations:
- name: trigger-incident
method: POST
- type: http
namespace: msteams-p1
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Creates a new bug report in Jira with specified project, summary, description, and priority fields.
naftiko: "0.5"
info:
label: "Jira Bug Report Creation"
description: "Creates a new bug report in Jira with specified project, summary, description, and priority fields."
tags:
- devops
- engineering
- jira
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: create-bug-report
description: "Given a project key, summary, description, and priority, create a Jira bug issue and return the issue key. Use when engineering teams need to log a software defect."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key, e.g. 'LIBRE'."
- name: summary
in: body
type: string
description: "Bug summary."
- name: description
in: body
type: string
description: "Detailed bug description."
- name: priority
in: body
type: string
description: "Priority: Critical, High, Medium, Low."
call: jira.create-issue
with:
project: "{{project_key}}"
issuetype: "Bug"
summary: "{{summary}}"
description: "{{description}}"
priority: "{{priority}}"
outputParameters:
- name: issue_key
type: string
mapping: "$.key"
- name: issue_url
type: string
mapping: "$.self"
consumes:
- type: http
namespace: jira
baseUri: "https://abbott.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
At sprint start, syncs the Jira backlog prioritization to the Confluence planning page and posts the sprint goal to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Planning Board Sync"
description: "At sprint start, syncs the Jira backlog prioritization to the Confluence planning page and posts the sprint goal to the engineering Teams channel."
tags:
- devops
- jira
- confluence
- agile
- engineering
capability:
exposes:
- type: mcp
namespace: sprint-planning
port: 8080
tools:
- name: sync-sprint-plan
description: "Given a Jira sprint ID and Confluence page ID, retrieve the sprint's planned issues and update the Confluence sprint planning page with the current backlog. Post the sprint goal to the engineering Teams channel. Use at sprint kickoff."
inputParameters:
- name: sprint_id
in: body
type: string
description: "Jira sprint ID to sync."
- name: confluence_page_id
in: body
type: string
description: "Confluence page ID for the sprint planning document."
- name: eng_channel_id
in: body
type: string
description: "Engineering Teams channel ID."
steps:
- name: get-sprint-issues
type: call
call: jira-sprint.get-sprint-issues
with:
sprint_id: "{{sprint_id}}"
- name: update-confluence
type: call
call: confluence.update-page
with:
page_id: "{{confluence_page_id}}"
content: "Sprint {{sprint_id}} planned issues: {{get-sprint-issues.issue_keys}}"
- name: post-sprint-goal
type: call
call: msteams-sprint.post-channel-message
with:
channel_id: "{{eng_channel_id}}"
text: "Sprint {{sprint_id}} started. {{get-sprint-issues.total_count}} issues planned. Confluence updated: {{update-confluence.url}}"
consumes:
- type: http
namespace: jira-sprint
baseUri: "https://abbott.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: sprint-issues
path: "/sprint/{{sprint_id}}/issue"
inputParameters:
- name: sprint_id
in: path
operations:
- name: get-sprint-issues
method: GET
- type: http
namespace: confluence
baseUri: "https://abbott.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: pages
path: "/content/{{page_id}}"
inputParameters:
- name: page_id
in: path
operations:
- name: update-page
method: PUT
- type: http
namespace: msteams-sprint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates the release pipeline for FreeStyle Libre CGM firmware by running validation tests, creating release notes, updating the artifact repository, and notifying regulatory.
naftiko: "0.5"
info:
label: "Libre CGM Firmware Release Orchestration"
description: "Orchestrates the release pipeline for FreeStyle Libre CGM firmware by running validation tests, creating release notes, updating the artifact repository, and notifying regulatory."
tags:
- rd
- devops
- medical-device
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: firmware-release
port: 8080
tools:
- name: orchestrate-firmware-release
description: "Given a firmware version and release branch, trigger validation, generate release notes, publish artifacts, and notify regulatory. Use when R&D approves a firmware build for release."
inputParameters:
- name: firmware_version
in: body
type: string
description: "Firmware version string, e.g. 'v3.2.1'."
- name: release_branch
in: body
type: string
description: "Git branch name for the release."
steps:
- name: trigger-validation
type: call
call: github.create-workflow-dispatch
with:
repo: "abbott/libre-firmware"
workflow: "validation-suite.yml"
ref: "{{release_branch}}"
- name: create-release-notes
type: call
call: github.create-release
with:
repo: "abbott/libre-firmware"
tag: "{{firmware_version}}"
name: "FreeStyle Libre Firmware {{firmware_version}}"
- name: create-regulatory-task
type: call
call: servicenow.create-task
with:
short_description: "Regulatory review: Libre firmware {{firmware_version}}"
category: "regulatory_review"
assigned_group: "Regulatory_Affairs"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "libre-engineering"
text: "Firmware {{firmware_version}} release initiated. Validation running. Regulatory task: {{create-regulatory-task.number}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-dispatch
path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow
in: path
operations:
- name: create-workflow-dispatch
method: POST
- name: releases
path: "/repos/{{repo}}/releases"
inputParameters:
- name: repo
in: path
operations:
- name: create-release
method: POST
- type: http
namespace: servicenow
baseUri: "https://abbott.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 Abbott employer brand metrics from LinkedIn including follower count, engagement rate, and talent pipeline statistics.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Metrics Lookup"
description: "Retrieves Abbott employer brand metrics from LinkedIn including follower count, engagement rate, and talent pipeline statistics."
tags:
- hr
- marketing
- linkedin
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: get-employer-metrics
description: "Return current LinkedIn employer brand metrics including follower count, post engagement rate, and talent pipeline size. Use when HR or employer brand teams need performance data."
inputParameters:
- name: time_period
in: body
type: string
description: "Reporting period, e.g. 'last_30_days'."
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"
- name: talent_pipeline_size
type: integer
mapping: "$.data.talentPipelineSize"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: organization-stats
path: "/organizationPageStatistics"
operations:
- name: get-organization-stats
method: GET
Looks up a manufacturing batch record in SAP to return batch status, yield data, and quality release information.
naftiko: "0.5"
info:
label: "Manufacturing Batch Record Status Check"
description: "Looks up a manufacturing batch record in SAP to return batch status, yield 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 record status, yield percentage, and quality release status. Use when production teams need batch visibility."
inputParameters:
- name: batch_number
in: body
type: string
description: "SAP batch number, e.g. 'BATCH-2026-001234'."
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: quality_release
type: string
mapping: "$.d.QualityReleaseStatus"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-records
path: "/A_BatchRecord('{{batch_id}}')"
inputParameters:
- name: batch_id
in: path
operations:
- name: get-batch-record
method: GET
When a manufacturing line goes down, creates an incident, alerts the maintenance team, logs downtime in SAP, and updates the production schedule.
naftiko: "0.5"
info:
label: "Manufacturing Line Downtime Response"
description: "When a manufacturing line goes down, creates an incident, alerts the maintenance team, logs downtime in SAP, and updates the 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 a maintenance incident, notify the team, log downtime, and adjust production schedule. Use when manufacturing operations detects an unplanned line 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: Production line {{line_id}} is 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}}"
incident_ref: "{{create-incident.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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://abbott-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
Retrieves marketing campaign performance metrics from Marketo by campaign ID, returning send count, open rate, click rate, and conversions.
naftiko: "0.5"
info:
label: "Marketo Campaign Performance Lookup"
description: "Retrieves marketing campaign performance metrics from Marketo by campaign ID, returning send count, open rate, click rate, and conversions."
tags:
- marketing
- analytics
- marketo
capability:
exposes:
- type: mcp
namespace: campaign-analytics
port: 8080
tools:
- name: get-campaign-performance
description: "Given a Marketo campaign ID, return send count, open rate, click-through rate, and conversion count. Use when marketing teams need campaign performance data."
inputParameters:
- name: campaign_id
in: body
type: string
description: "Marketo campaign ID."
call: marketo.get-campaign-stats
with:
id: "{{campaign_id}}"
outputParameters:
- name: sends
type: integer
mapping: "$.result.sends"
- name: open_rate
type: number
mapping: "$.result.openRate"
- name: click_rate
type: number
mapping: "$.result.clickRate"
consumes:
- type: http
namespace: marketo
baseUri: "https://abbott.mktorest.com/rest"
authentication:
type: bearer
token: "$secrets.marketo_token"
resources:
- name: campaigns
path: "/v1/campaigns/{{id}}/stats.json"
inputParameters:
- name: id
in: path
operations:
- name: get-campaign-stats
method: GET
Enrolls a Salesforce lead in a Marketo nurture program based on product interest, and syncs engagement data back to Salesforce after 30 days.
naftiko: "0.5"
info:
label: "Marketo Lead Nurture Enrollment"
description: "Enrolls a Salesforce lead in a Marketo nurture program based on product interest, and syncs engagement data back to Salesforce after 30 days."
tags:
- marketing
- salesforce
- marketo
- lead-nurture
- crm
capability:
exposes:
- type: mcp
namespace: lead-nurture
port: 8080
tools:
- name: enroll-lead-in-nurture
description: "Given a Salesforce lead ID and Marketo program ID, retrieve the lead's details from Salesforce and enroll them in the specified Marketo nurture program. Use when marketing qualifies a lead for a product-specific nurture track."
inputParameters:
- name: salesforce_lead_id
in: body
type: string
description: "Salesforce lead record ID."
- name: marketo_program_id
in: body
type: string
description: "Marketo program ID for the nurture campaign."
steps:
- name: get-lead
type: call
call: salesforce-leads.get-lead
with:
lead_id: "{{salesforce_lead_id}}"
- name: enroll-marketo
type: call
call: marketo-nurture.add-to-program
with:
email: "{{get-lead.Email}}"
first_name: "{{get-lead.FirstName}}"
last_name: "{{get-lead.LastName}}"
program_id: "{{marketo_program_id}}"
consumes:
- type: http
namespace: salesforce-leads
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- type: http
namespace: marketo-nurture
baseUri: "https://abbott.mktorest.com/rest/v1"
authentication:
type: bearer
token: "$secrets.marketo_token"
resources:
- name: program-members
path: "/leads/programs/{{program_id}}.json"
inputParameters:
- name: program_id
in: path
operations:
- name: add-to-program
method: POST
When a medical device complaint is logged in Salesforce Service Cloud, creates a ServiceNow regulatory case, assigns a quality engineer, and sends a Teams notification to the vigilance team.
naftiko: "0.5"
info:
label: "Medical Device Complaint Case Routing"
description: "When a medical device complaint is logged in Salesforce Service Cloud, creates a ServiceNow regulatory case, assigns a quality engineer, and sends a Teams notification to the vigilance team."
tags:
- customer-service
- regulatory
- salesforce
- servicenow
- medical-devices
capability:
exposes:
- type: mcp
namespace: complaint-ops
port: 8080
tools:
- name: route-device-complaint
description: "Given a Salesforce case ID for a medical device complaint, create a linked ServiceNow regulatory investigation record, assign it to the quality engineering group, and alert the vigilance Teams channel. Use when a device complaint requiring regulatory review is received."
inputParameters:
- name: salesforce_case_id
in: body
type: string
description: "Salesforce case ID for the device complaint."
- name: device_model
in: body
type: string
description: "Medical device model or product number."
- name: complaint_type
in: body
type: string
description: "Type of complaint, e.g. 'malfunction', 'injury', 'death'."
- name: vigilance_channel_id
in: body
type: string
description: "Teams channel ID for the vigilance team."
steps:
- name: get-case
type: call
call: salesforce-cases.get-case
with:
case_id: "{{salesforce_case_id}}"
- name: create-reg-investigation
type: call
call: servicenow-vigilance.create-incident
with:
short_description: "Device complaint — {{device_model}} — {{complaint_type}}"
description: "Salesforce case: {{salesforce_case_id}} | Reporter: {{get-case.ContactName}} | Description: {{get-case.Description}}"
category: "regulatory_vigilance"
assigned_group: "Quality_Engineering"
- name: notify-vigilance
type: call
call: msteams-vigilance.post-channel-message
with:
channel_id: "{{vigilance_channel_id}}"
text: "Device Complaint: {{device_model}} — {{complaint_type}} | Salesforce: {{salesforce_case_id}} | ServiceNow INC: {{create-reg-investigation.number}}"
consumes:
- type: http
namespace: salesforce-cases
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: servicenow-vigilance
baseUri: "https://abbott.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-vigilance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates UDI registration for a medical device by generating the device identifier, submitting to GUDID, updating SAP material master, and notifying regulatory affairs.
naftiko: "0.5"
info:
label: "Medical Device UDI Registration Orchestration"
description: "Orchestrates UDI registration for a medical device by generating the device identifier, submitting to GUDID, updating SAP material master, and notifying regulatory affairs."
tags:
- regulatory
- manufacturing
- sap
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: udi-registration
port: 8080
tools:
- name: register-device-udi
description: "Given a product code and device description, generate the UDI, submit to GUDID, update SAP, and notify regulatory. Use when new medical devices need UDI registration."
inputParameters:
- name: product_code
in: body
type: string
description: "Abbott product code."
- name: device_description
in: body
type: string
description: "Device description for GUDID."
steps:
- name: create-udi-record
type: call
call: veeva-vault.create-udi
with:
product_code: "{{product_code}}"
description: "{{device_description}}"
- name: update-material-master
type: call
call: sap-erp.update-material
with:
material: "{{product_code}}"
udi: "{{create-udi-record.udi_di}}"
- name: notify-regulatory
type: call
call: msteams.send-message
with:
channel_id: "regulatory-affairs"
text: "UDI registered for {{product_code}}: {{create-udi-record.udi_di}}. GUDID submission: {{create-udi-record.gudid_status}}. SAP updated."
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: udi
path: "/objects/udi__c"
operations:
- name: create-udi
method: POST
- type: http
namespace: sap-erp
baseUri: "https://abbott-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: update-material
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
Triggers SAP S/4HANA month-end financial close, validates journal completeness, and notifies the finance team via Teams upon completion.
naftiko: "0.5"
info:
label: "Monthly Financial Period Close"
description: "Triggers SAP S/4HANA month-end financial close, validates journal completeness, and notifies the finance team via Teams upon completion."
tags:
- finance
- erp
- period-close
- sap
- accounting
capability:
exposes:
- type: mcp
namespace: finance-period-close
port: 8080
tools:
- name: trigger-period-close
description: "Given a fiscal period and company code, initiate the SAP S/4HANA period close sequence and post completion status to the finance Teams channel. Use at month end to automate the financial close workflow."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "Fiscal period in YYYYPP format, e.g. '202603'."
- name: company_code
in: body
type: string
description: "SAP company code, e.g. 'ABBT'."
- name: finance_channel_id
in: body
type: string
description: "Finance Teams channel ID."
steps:
- name: close-period
type: call
call: sap-fi-close.close-period
with:
fiscal_period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: validate-postings
type: call
call: sap-fi-journal.check-completeness
with:
fiscal_period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: notify-finance
type: call
call: msteams-finsclose.post-channel-message
with:
channel_id: "{{finance_channel_id}}"
text: "Period {{fiscal_period}} closed for company {{company_code}}. Journal status: {{validate-postings.status}} | Open items: {{validate-postings.open_count}}"
consumes:
- type: http
namespace: sap-fi-close
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FAR_PERIOD_CLOSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close
path: "/PeriodClose"
operations:
- name: close-period
method: POST
- type: http
namespace: sap-fi-journal
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FAR_JOURNAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: journal-validation
path: "/JournalEntryCompleteness"
inputParameters:
- name: fiscal_period
in: query
- name: company_code
in: query
operations:
- name: check-completeness
method: GET
- type: http
namespace: msteams-finsclose
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions their Okta account, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "New Hire Onboarding Orchestration"
description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions their Okta account, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- okta
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-employee-onboarding
description: "Given a Workday employee ID and start date, create a ServiceNow onboarding task, provision the employee's Okta account, and send a Teams welcome message. Use when HR confirms a new hire in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: create-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Onboarding: {{get-employee.first_name}} {{get-employee.last_name}}"
category: "hr_onboarding"
assigned_group: "IT_Onboarding"
- name: provision-okta
type: call
call: okta.create-user
with:
firstName: "{{get-employee.first_name}}"
lastName: "{{get-employee.last_name}}"
email: "{{get-employee.work_email}}"
login: "{{get-employee.work_email}}"
- name: send-welcome
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to Abbott, {{get-employee.first_name}}! Your IT onboarding ticket is {{create-ticket.number}}. Start date: {{start_date}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: okta
baseUri: "https://abbott.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Assesses new product launch readiness by checking regulatory clearance, supply chain readiness, marketing material approval, and sales team training completion.
naftiko: "0.5"
info:
label: "New Product Launch Readiness Orchestration"
description: "Assesses new product launch readiness by checking regulatory clearance, supply chain readiness, marketing material approval, and sales team training completion."
tags:
- manufacturing
- regulatory
- marketing
- veeva-vault
- sap
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: launch-readiness
port: 8080
tools:
- name: assess-launch-readiness
description: "Given a product code, check regulatory clearance, supply chain status, marketing readiness, and training completion. Use when product management assesses launch readiness."
inputParameters:
- name: product_code
in: body
type: string
description: "Abbott product code."
steps:
- name: check-regulatory
type: call
call: veeva-vault.get-clearance-status
with:
product_code: "{{product_code}}"
- name: check-supply-chain
type: call
call: sap-erp.get-material-availability
with:
material: "{{product_code}}"
- name: check-training
type: call
call: workday.get-training-status
with:
course: "product-launch-{{product_code}}"
- name: report-readiness
type: call
call: msteams.send-message
with:
channel_id: "product-launches"
text: "Launch readiness for {{product_code}}: Regulatory: {{check-regulatory.status}}. Supply: {{check-supply-chain.availability}}. Training: {{check-training.completion_rate}}% complete."
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
authentication:
type: bearer
token: "$secrets.veeva_vault_token"
resources:
- name: clearance
path: "/objects/clearance__c"
operations:
- name: get-clearance-status
method: GET
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: availability
path: "/A_MaterialAvailability('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-material-availability
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: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Manages a formula change for nutrition products by creating a change control, scheduling impact assessment, updating SAP BOM, and notifying regulatory and quality teams.
naftiko: "0.5"
info:
label: "Nutrition Formula Change Control Orchestration"
description: "Manages a formula change for nutrition products by creating a change control, scheduling impact assessment, updating SAP BOM, and notifying regulatory and quality teams."
tags:
- manufacturing
- quality
- regulatory
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: formula-change
port: 8080
tools:
- name: initiate-formula-change
description: "Given a product code and change description, create a change control, assess impact, update BOM, and notify stakeholders. Use when R&D or quality initiates a nutrition formula change."
inputParameters:
- name: product_code
in: body
type: string
description: "Abbott nutrition product code."
- name: change_description
in: body
type: string
description: "Description of the formula change."
steps:
- name: create-change-control
type: call
call: servicenow.create-change
with:
short_description: "Formula change: {{product_code}} - {{change_description}}"
category: "manufacturing"
assigned_group: "Quality_Change_Control"
- name: check-bom
type: call
call: sap-erp.get-bom
with:
material: "{{product_code}}"
- name: notify-stakeholders
type: call
call: msteams.send-message
with:
channel_id: "nutrition-quality"
text: "Formula change initiated for {{product_code}}: {{change_description}}. Change control: {{create-change-control.number}}. Current BOM components: {{check-bom.component_count}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_BOM_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: bom
path: "/A_BillOfMaterial('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-bom
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves Okta group membership for privileged groups, generates an access certification report in Power BI, and emails it to the security team for review.
naftiko: "0.5"
info:
label: "Okta Quarterly Access Certification"
description: "Retrieves Okta group membership for privileged groups, generates an access certification report in Power BI, and emails it to the security team for review."
tags:
- identity
- security
- okta
- compliance
- access-review
capability:
exposes:
- type: mcp
namespace: access-certification
port: 8080
tools:
- name: run-access-certification
description: "Given an Okta group ID and Power BI dataset ID, pull current group membership, trigger a Power BI report refresh, and email the access certification report to the security team. Use quarterly for privileged access compliance reviews."
inputParameters:
- name: okta_group_id
in: body
type: string
description: "Okta group ID to certify."
- name: pbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for access reports."
- name: security_team_email
in: body
type: string
description: "Security team email for the certification report."
steps:
- name: get-group-members
type: call
call: okta-cert.get-group-users
with:
group_id: "{{okta_group_id}}"
- name: refresh-access-pbi
type: call
call: powerbi-cert.trigger-refresh
with:
dataset_id: "{{pbi_dataset_id}}"
- name: send-cert-email
type: call
call: msgraph-cert.send-email
with:
to: "{{security_team_email}}"
subject: "Quarterly Access Certification — Okta Group {{okta_group_id}}"
body: "Group {{okta_group_id}} has {{get-group-members.total_count}} members. Review in Power BI and certify or revoke access."
consumes:
- type: http
namespace: okta-cert
baseUri: "https://abbott.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: group-users
path: "/groups/{{group_id}}/users"
inputParameters:
- name: group_id
in: path
operations:
- name: get-group-users
method: GET
- type: http
namespace: powerbi-cert
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msgraph-cert
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender}}/sendMail"
operations:
- name: send-email
method: POST
Retrieves an Okta user profile by email, returning account status, last login, MFA enrollment, and assigned applications.
naftiko: "0.5"
info:
label: "Okta User Status Check"
description: "Retrieves an Okta user profile by email, returning account status, last login, MFA enrollment, and assigned applications."
tags:
- security
- identity
- okta
capability:
exposes:
- type: mcp
namespace: identity-management
port: 8080
tools:
- name: get-user-status
description: "Given an employee email address, return the Okta account status, last login timestamp, and MFA enrollment state. Use when IT security needs to verify user access status."
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"
- name: mfa_enrolled
type: boolean
mapping: "$.mfa_enrolled"
consumes:
- type: http
namespace: okta
baseUri: "https://abbott.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 classify a regulatory document by type, region, and product category, returning structured metadata for filing.
naftiko: "0.5"
info:
label: "OpenAI Regulatory Document Classification"
description: "Uses OpenAI to classify a regulatory document by type, region, and product category, returning structured metadata for filing."
tags:
- regulatory
- ai
- openai
capability:
exposes:
- type: mcp
namespace: doc-classification
port: 8080
tools:
- name: classify-regulatory-document
description: "Given document text, classify the document type, applicable region, and product category using AI. Use when regulatory teams need to categorize incoming documents."
inputParameters:
- name: document_text
in: body
type: string
description: "Text content of the regulatory document."
call: openai.create-completion
with:
model: "gpt-4"
prompt: "Classify this regulatory document: {{document_text}}"
outputParameters:
- name: document_type
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, returning name, contact info, and rotation end time.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call engineer for a PagerDuty schedule, returning name, contact info, and rotation end time."
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 currently on-call engineer name, email, and rotation end time. Use when teams need to 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"
- name: rotation_end
type: string
mapping: "$.oncalls[0].end"
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
Generates a post-market surveillance report by aggregating complaint data, adverse event reports, and field actions from multiple systems into a consolidated regulatory report.
naftiko: "0.5"
info:
label: "Post-Market Surveillance Report Orchestration"
description: "Generates a post-market surveillance report by aggregating complaint data, adverse event reports, and field actions from multiple systems into a consolidated regulatory report."
tags:
- regulatory
- quality
- safety
- snowflake
- salesforce
- veeva-vault
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pms-reporting
port: 8080
tools:
- name: generate-pms-report
description: "Given a product code and reporting period, aggregate complaints, adverse events, and field actions into a post-market surveillance report. Use when regulatory affairs prepares periodic safety reports."
inputParameters:
- name: product_code
in: body
type: string
description: "Abbott product code."
- name: reporting_period
in: body
type: string
description: "Reporting period, e.g. 'Q1-2026'."
steps:
- name: get-complaint-data
type: call
call: snowflake.execute-query
with:
query_name: "pms_complaint_summary"
params: "{{product_code}},{{reporting_period}}"
- name: get-adverse-events
type: call
call: snowflake.execute-query
with:
query_name: "pms_adverse_event_summary"
params: "{{product_code}},{{reporting_period}}"
- name: create-report
type: call
call: veeva-vault.create-document
with:
doc_type: "pms_report"
product_code: "{{product_code}}"
period: "{{reporting_period}}"
- name: notify-regulatory
type: call
call: msteams.send-message
with:
channel_id: "regulatory-safety"
text: "PMS report generated for {{product_code}} ({{reporting_period}}). Complaints: {{get-complaint-data.total}}. Adverse events: {{get-adverse-events.total}}. Document: {{create-report.document_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.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://abbott-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 diagnostics division revenue dashboard in Power BI and returns the refresh status.
naftiko: "0.5"
info:
label: "Power BI Diagnostics Revenue Refresh"
description: "Triggers a refresh of the diagnostics division revenue dashboard in Power BI and returns the refresh status."
tags:
- analytics
- finance
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-diagnostics-dashboard
description: "Trigger a dataset refresh for the diagnostics revenue Power BI dashboard and return the refresh status. Use when finance needs updated revenue figures."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset identifier."
call: powerbi.trigger-refresh
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: refresh_id
type: string
mapping: "$.id"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
Triggers a Power BI dataset refresh for the executive KPI dashboard and posts a confirmation to the leadership Teams channel.
naftiko: "0.5"
info:
label: "Power BI Executive Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the executive KPI dashboard and posts a confirmation to the leadership Teams channel."
tags:
- analytics
- power-bi
- reporting
- executive
capability:
exposes:
- type: mcp
namespace: exec-reporting
port: 8080
tools:
- name: refresh-executive-dashboard
description: "Trigger a Power BI dataset refresh for the executive KPI dashboard and notify the leadership Teams channel when complete. Use each morning before leadership stand-ups to ensure dashboards reflect current data."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID for the executive KPI dashboard."
- name: leadership_channel_id
in: body
type: string
description: "Leadership Teams channel ID."
steps:
- name: refresh-pbi
type: call
call: powerbi-exec.trigger-refresh
with:
dataset_id: "{{dataset_id}}"
- name: notify-leadership
type: call
call: msteams-exec.post-channel-message
with:
channel_id: "{{leadership_channel_id}}"
text: "Executive KPI dashboard refresh triggered (dataset {{dataset_id}}). Refresh ID: {{refresh-pbi.refreshId}}"
consumes:
- type: http
namespace: powerbi-exec
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams-exec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Manages a product development phase gate review by collecting deliverable status, scheduling the review meeting, generating the gate package, and notifying the review board.
naftiko: "0.5"
info:
label: "Product Lifecycle Phase Gate Orchestration"
description: "Manages a product development phase gate review by collecting deliverable status, scheduling the review meeting, generating the gate package, and notifying the review board."
tags:
- rd
- quality
- manufacturing
- jira
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: phase-gate
port: 8080
tools:
- name: execute-phase-gate-review
description: "Given a project key and gate number, collect deliverable status, schedule the review, build the gate package, and notify the board. Use when R&D project management prepares for a phase gate review."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key."
- name: gate_number
in: body
type: string
description: "Phase gate number, e.g. 'Gate-3'."
steps:
- name: get-deliverable-status
type: call
call: jira.search-issues
with:
jql: "project={{project_key}} AND labels={{gate_number}}"
- name: create-review-task
type: call
call: servicenow.create-task
with:
short_description: "Phase gate review: {{project_key}} {{gate_number}}"
category: "rd_review"
assigned_group: "Product_Review_Board"
- name: notify-board
type: call
call: msteams.send-message
with:
channel_id: "product-review-board"
text: "{{gate_number}} review for {{project_key}} scheduled. Deliverables: {{get-deliverable-status.total}} total, {{get-deliverable-status.done}} complete. Review task: {{create-review-task.number}}"
consumes:
- type: http
namespace: jira
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: search
path: "/search"
operations:
- name: search-issues
method: GET
- type: http
namespace: servicenow
baseUri: "https://abbott.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 manufacturing quality deviation is detected, creates a ServiceNow quality incident, opens a Jira corrective action task, and notifies the quality assurance team in Teams.
naftiko: "0.5"
info:
label: "Product Quality Deviation Incident"
description: "When a manufacturing quality deviation is detected, creates a ServiceNow quality incident, opens a Jira corrective action task, and notifies the quality assurance team in Teams."
tags:
- quality
- manufacturing
- servicenow
- jira
- healthcare
capability:
exposes:
- type: mcp
namespace: quality-ops
port: 8080
tools:
- name: handle-quality-deviation
description: "Given a product lot number, deviation type, and site ID, create a ServiceNow quality incident record, open a Jira CAPA task for the quality engineering team, and alert the QA Teams channel. Use when a manufacturing deviation is identified during production or QC review."
inputParameters:
- name: lot_number
in: body
type: string
description: "Product lot number where the deviation was detected."
- name: deviation_type
in: body
type: string
description: "Type of deviation, e.g. 'out-of-specification', 'process-deviation'."
- name: site_id
in: body
type: string
description: "Manufacturing site identifier."
- name: qa_channel_id
in: body
type: string
description: "Quality assurance Teams channel ID."
steps:
- name: create-quality-incident
type: call
call: servicenow-quality.create-incident
with:
short_description: "Quality deviation — Lot {{lot_number}} — {{deviation_type}}"
category: "quality_deviation"
site_id: "{{site_id}}"
- name: create-capa
type: call
call: jira-quality.create-issue
with:
project_key: "CAPA"
issuetype: "Task"
summary: "CAPA for deviation — Lot {{lot_number}} at {{site_id}}"
description: "Deviation type: {{deviation_type}} | ServiceNow INC: {{create-quality-incident.number}}"
- name: alert-qa-team
type: call
call: msteams-quality.post-channel-message
with:
channel_id: "{{qa_channel_id}}"
text: "Quality Deviation: Lot {{lot_number}} at {{site_id}} — {{deviation_type}} | INC: {{create-quality-incident.number}} | CAPA Jira: {{create-capa.key}}"
consumes:
- type: http
namespace: servicenow-quality
baseUri: "https://abbott.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: jira-quality
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-quality
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates a medical device product registration by assembling documents from Veeva Vault, creating the submission package, filing in the regulatory system, and notifying stakeholders.
naftiko: "0.5"
info:
label: "Product Registration Submission Orchestration"
description: "Orchestrates a medical device product registration by assembling documents from Veeva Vault, creating the submission package, filing in the regulatory system, and notifying stakeholders."
tags:
- regulatory
- quality
- veeva-vault
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-registration
port: 8080
tools:
- name: submit-product-registration
description: "Given a product code and target market, assemble regulatory documents, create the submission, file it, and notify the team. Use when regulatory affairs initiates a new market registration."
inputParameters:
- name: product_code
in: body
type: string
description: "Abbott product code."
- name: target_market
in: body
type: string
description: "Target market country code, e.g. 'EU', 'JP', 'BR'."
steps:
- name: gather-documents
type: call
call: veeva-vault.query-documents
with:
product_code: "{{product_code}}"
doc_type: "registration"
- name: create-submission
type: call
call: veeva-vault.create-submission
with:
product_code: "{{product_code}}"
market: "{{target_market}}"
document_ids: "{{gather-documents.document_ids}}"
- name: create-tracking-task
type: call
call: servicenow.create-task
with:
short_description: "Product registration: {{product_code}} for {{target_market}}"
category: "regulatory_submission"
assigned_group: "Regulatory_Affairs"
reference: "{{create-submission.submission_id}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "regulatory-submissions"
text: "Product registration submitted for {{product_code}} in {{target_market}}. Submission: {{create-submission.submission_id}}. Task: {{create-tracking-task.number}}"
consumes:
- type: http
namespace: veeva-vault
baseUri: "https://abbott-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://abbott.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 corrective and preventive action record details from the quality management system by CAPA number.
naftiko: "0.5"
info:
label: "Quality CAPA Status Lookup"
description: "Retrieves corrective and preventive action record details 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 the current phase, root cause category, due date, and responsible owner. Use when quality teams need to 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://abbott.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 quality deviation is created, assigns an investigator, gathers batch data from SAP, creates investigation tasks, and sets review deadlines.
naftiko: "0.5"
info:
label: "Quality Deviation Investigation Orchestration"
description: "When a quality deviation is created, assigns an investigator, gathers batch data from SAP, creates investigation tasks, and sets review deadlines."
tags:
- quality
- manufacturing
- servicenow
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: deviation-investigation
port: 8080
tools:
- name: initiate-deviation-investigation
description: "Given a deviation number, assign an investigator, pull related batch data, create investigation tasks, and notify stakeholders. Use when quality assurance escalates a deviation for investigation."
inputParameters:
- name: deviation_number
in: body
type: string
description: "ServiceNow deviation record number."
steps:
- name: get-deviation
type: call
call: servicenow.get-deviation
with:
number: "{{deviation_number}}"
- name: get-batch-data
type: call
call: sap-erp.get-batch-record
with:
batch_id: "{{get-deviation.batch_number}}"
- name: create-investigation-task
type: call
call: servicenow.create-task
with:
short_description: "Investigate deviation {{deviation_number}} - Batch {{get-deviation.batch_number}}"
category: "quality_investigation"
assigned_group: "Quality_Investigation"
priority: "2"
- name: notify-quality
type: call
call: msteams.send-message
with:
channel_id: "quality-investigations"
text: "Investigation initiated for deviation {{deviation_number}}. Batch: {{get-deviation.batch_number}}. Yield: {{get-batch-data.yield_percentage}}%. Task: {{create-investigation-task.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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://abbott-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 financial results from SAP, pipeline data from Salesforce, headcount from Workday, and generating a consolidated Snowflake report.
naftiko: "0.5"
info:
label: "Quarterly Business Review Data Orchestration"
description: "Assembles QBR data by pulling financial results from SAP, pipeline data from Salesforce, headcount from Workday, and generating a consolidated Snowflake 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 division code and fiscal quarter, pull financials, pipeline, headcount, and generate a consolidated QBR report. Use when finance prepares quarterly business reviews."
inputParameters:
- name: division_code
in: body
type: string
description: "Abbott division code."
- name: fiscal_quarter
in: body
type: string
description: "Fiscal quarter, e.g. 'Q1-2026'."
steps:
- name: get-financials
type: call
call: sap-erp.get-pl-summary
with:
division: "{{division_code}}"
quarter: "{{fiscal_quarter}}"
- name: get-pipeline
type: call
call: salesforce.get-pipeline-summary
with:
division: "{{division_code}}"
quarter: "{{fiscal_quarter}}"
- name: get-headcount
type: call
call: workday.get-headcount
with:
division: "{{division_code}}"
- name: generate-report
type: call
call: snowflake.execute-query
with:
query_name: "qbr_consolidated_report"
params: "{{division_code}},{{fiscal_quarter}},{{get-financials.revenue}},{{get-pipeline.pipeline_value}},{{get-headcount.total}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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://abbott.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://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
When an R&D experiment completes, ingests results into Snowflake, triggers quality validation, generates summary statistics, and notifies the research team.
naftiko: "0.5"
info:
label: "R&D Experiment Data Pipeline Orchestration"
description: "When an R&D experiment completes, ingests results into Snowflake, triggers quality validation, generates summary statistics, and notifies the research team."
tags:
- rd
- analytics
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: rd-data-pipeline
port: 8080
tools:
- name: process-experiment-results
description: "Given an experiment ID and data file path, ingest results, validate quality, generate statistics, and notify researchers. Use when laboratory automation completes an experiment run."
inputParameters:
- name: experiment_id
in: body
type: string
description: "R&D experiment identifier."
- name: data_path
in: body
type: string
description: "S3 path to the experiment results file."
steps:
- name: ingest-data
type: call
call: snowflake.execute-query
with:
query_name: "ingest_experiment_data"
params: "{{experiment_id}},{{data_path}}"
- name: validate-quality
type: call
call: snowflake.execute-query
with:
query_name: "validate_experiment_quality"
params: "{{experiment_id}}"
- name: generate-statistics
type: call
call: snowflake.execute-query
with:
query_name: "experiment_summary_stats"
params: "{{experiment_id}}"
- name: notify-researchers
type: call
call: msteams.send-message
with:
channel_id: "rd-lab-results"
text: "Experiment {{experiment_id}} processed. Quality: {{validate-quality.pass_rate}}% pass rate. Mean result: {{generate-statistics.mean_value}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.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
When a product recall is initiated, creates a ServiceNow high-priority incident, notifies the recall coordinator team in Teams, and opens a Salesforce case for customer communication tracking.
naftiko: "0.5"
info:
label: "Recall Management Notification Workflow"
description: "When a product recall is initiated, creates a ServiceNow high-priority incident, notifies the recall coordinator team in Teams, and opens a Salesforce case for customer communication tracking."
tags:
- regulatory
- recall
- servicenow
- salesforce
- healthcare
capability:
exposes:
- type: mcp
namespace: recall-ops
port: 8080
tools:
- name: initiate-recall-workflow
description: "Given a product lot number, recall class, and affected market, create a P1 ServiceNow recall incident, open a Salesforce case for customer communication tracking, and notify the recall coordinator Teams channel. Use when a product recall decision is made."
inputParameters:
- name: product_name
in: body
type: string
description: "Product name subject to recall."
- name: lot_numbers
in: body
type: string
description: "Comma-separated list of affected lot numbers."
- name: recall_class
in: body
type: string
description: "FDA recall classification: I, II, or III."
- name: affected_markets
in: body
type: string
description: "Comma-separated list of affected markets/countries."
- name: recall_channel_id
in: body
type: string
description: "Recall coordinator Teams channel ID."
steps:
- name: create-recall-incident
type: call
call: servicenow-recall.create-incident
with:
short_description: "Product Recall — {{product_name}} — Class {{recall_class}}"
description: "Lots: {{lot_numbers}} | Markets: {{affected_markets}}"
priority: "1"
category: "Product_Recall"
- name: create-cx-case
type: call
call: salesforce-recall.create-case
with:
subject: "Recall notification — {{product_name}} Class {{recall_class}}"
description: "Recall initiated. Lots: {{lot_numbers}}. INC: {{create-recall-incident.number}}"
priority: "High"
- name: notify-recall-team
type: call
call: msteams-recall.post-channel-message
with:
channel_id: "{{recall_channel_id}}"
text: "PRODUCT RECALL: {{product_name}} Class {{recall_class}} | Lots: {{lot_numbers}} | Markets: {{affected_markets}} | INC: {{create-recall-incident.number}} | Case: {{create-cx-case.case_number}}"
consumes:
- type: http
namespace: servicenow-recall
baseUri: "https://abbott.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: salesforce-recall
baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-recall
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Prepares for a regulatory audit by gathering open CAPAs, pending deviations, training compliance status, and generating a consolidated 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 status, and generating a consolidated 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 open CAPAs, pending deviations, training compliance metrics, and generate a readiness report. Use when quality assurance prepares for FDA or ISO audits."
inputParameters:
- name: audit_type
in: body
type: string
description: "Type of audit: FDA, ISO, 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}},{{get-open-capas.count}},{{get-deviations.count}},{{get-training-compliance.compliance_rate}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner details.
naftiko: "0.5"
info:
label: "Salesforce Account Lookup"
description: "Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner details."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account
description: "Given a Salesforce account ID, return the account name, industry, annual revenue, and account owner. Use when sales teams need quick 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: industry
type: string
mapping: "$.Industry"
- name: annual_revenue
type: number
mapping: "$.AnnualRevenue"
- name: owner
type: string
mapping: "$.Owner.Name"
consumes:
- type: http
namespace: salesforce
baseUri: "https://abbott.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
Enriches a Salesforce healthcare customer account with ZoomInfo firmographic data and syncs the updated record to SAP for billing alignment.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Enrichment"
description: "Enriches a Salesforce healthcare customer account with ZoomInfo firmographic data and syncs the updated record to SAP for billing alignment."
tags:
- crm
- sales
- salesforce
- data-enrichment
- healthcare
capability:
exposes:
- type: mcp
namespace: crm-enrichment
port: 8080
tools:
- name: enrich-customer-account
description: "Given a Salesforce account ID and ZoomInfo company match key, fetch firmographic data from ZoomInfo, update the Salesforce account, and sync key fields to the SAP customer master. Use when account records need to be refreshed with current company data."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "Salesforce Account record ID."
- name: zoominfo_company_id
in: body
type: string
description: "ZoomInfo company ID for firmographic lookup."
steps:
- name: get-firmographics
type: call
call: zoominfo.get-company
with:
company_id: "{{zoominfo_company_id}}"
- name: update-sf-account
type: call
call: salesforce-acct.update-account
with:
account_id: "{{salesforce_account_id}}"
employees: "{{get-firmographics.employee_count}}"
annual_revenue: "{{get-firmographics.revenue}}"
industry: "{{get-firmographics.industry}}"
- name: sync-sap-customer
type: call
call: sap-erp-crm.update-customer
with:
account_id: "{{salesforce_account_id}}"
company_name: "{{get-firmographics.company_name}}"
industry: "{{get-firmographics.industry}}"
consumes:
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company/{{company_id}}"
inputParameters:
- name: company_id
in: path
operations:
- name: get-company
method: GET
- type: http
namespace: salesforce-acct
baseUri: "https://abbott.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: update-account
method: PATCH
- type: http
namespace: sap-erp-crm
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/BUSINESS_PARTNER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_BusinessPartner/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-customer
method: PATCH
When a Salesforce opportunity is closed-won, creates an SAP sales order, updates the CRM record, and notifies the fulfillment team.
naftiko: "0.5"
info:
label: "Salesforce Opportunity to Order Orchestration"
description: "When a Salesforce opportunity is closed-won, creates an SAP sales order, updates the CRM record, and notifies the fulfillment team."
tags:
- sales
- erp
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: opportunity-to-order
port: 8080
tools:
- name: convert-opportunity-to-order
description: "Given a Salesforce opportunity ID, create a sales order in SAP, update the opportunity with the order number, and notify fulfillment. Use when sales closes a deal."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
steps:
- name: get-opportunity
type: call
call: salesforce.get-opportunity
with:
opp_id: "{{opportunity_id}}"
- name: create-sales-order
type: call
call: sap-erp.create-order
with:
customer: "{{get-opportunity.account_sap_id}}"
material: "{{get-opportunity.product_code}}"
quantity: "{{get-opportunity.quantity}}"
amount: "{{get-opportunity.amount}}"
- name: update-opportunity
type: call
call: salesforce.update-opportunity
with:
opp_id: "{{opportunity_id}}"
sap_order_number: "{{create-sales-order.order_number}}"
- name: notify-fulfillment
type: call
call: msteams.send-message
with:
channel_id: "order-fulfillment"
text: "New SAP order {{create-sales-order.order_number}} from opportunity {{opportunity_id}}. Customer: {{get-opportunity.account_name}}. Amount: {{get-opportunity.amount}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://abbott.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: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: orders
path: "/A_SalesOrder"
operations:
- name: create-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners via Microsoft 365.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Expiry Alerts"
description: "Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners via Microsoft 365."
tags:
- procurement
- contract-management
- sap-ariba
- jira
- finance
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: alert-expiring-contracts
description: "Given a look-ahead window, fetch expiring contracts from SAP Ariba, create a Jira renewal task for each contract, and email the contract owner. Use monthly to proactively manage supplier contract renewals."
inputParameters:
- name: days_ahead
in: body
type: integer
description: "Number of days ahead to scan for expiring contracts."
- name: jira_project_key
in: body
type: string
description: "Jira project key for procurement renewal tasks."
steps:
- name: get-expiring
type: call
call: ariba-renewal.get-expiring-contracts
with:
days_ahead: "{{days_ahead}}"
- name: create-jira-task
type: call
call: jira-contracts.create-issue
with:
project_key: "{{jira_project_key}}"
issuetype: "Task"
summary: "Contract renewals due within {{days_ahead}} days"
description: "Expiring contracts: {{get-expiring.contract_ids}}"
consumes:
- type: http
namespace: ariba-renewal
baseUri: "https://openapi.ariba.com/api/contract/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts"
inputParameters:
- name: days_ahead
in: query
operations:
- name: get-expiring-contracts
method: GET
- type: http
namespace: jira-contracts
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Creates a new sourcing event in SAP Ariba for competitive bidding, returning the event ID and supplier invitation status.
naftiko: "0.5"
info:
label: "SAP Ariba Sourcing Event Creation"
description: "Creates a new sourcing event in SAP Ariba for competitive bidding, returning the event ID and supplier invitation status."
tags:
- procurement
- sap-ariba
capability:
exposes:
- type: mcp
namespace: strategic-sourcing
port: 8080
tools:
- name: create-sourcing-event
description: "Given a sourcing category and description, create an SAP Ariba sourcing event and return the event ID. Use when procurement initiates a competitive bidding process."
inputParameters:
- name: category
in: body
type: string
description: "Sourcing category."
- name: description
in: body
type: string
description: "Sourcing event description."
- name: budget_amount
in: body
type: number
description: "Budget amount for the sourcing event."
call: ariba.create-event
with:
category: "{{category}}"
description: "{{description}}"
budget: "{{budget_amount}}"
outputParameters:
- name: event_id
type: string
mapping: "$.data.eventId"
- name: status
type: string
mapping: "$.data.status"
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 travel request from SAP Concur by request ID, returning trip details, estimated cost, and approval status.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Lookup"
description: "Retrieves a travel request from SAP Concur by request ID, returning trip details, estimated cost, and approval status."
tags:
- finance
- travel
- sap-concur
capability:
exposes:
- type: mcp
namespace: travel-management
port: 8080
tools:
- name: get-travel-request
description: "Given a Concur travel request ID, return the trip destination, dates, estimated cost, and approval status. Use when employees need travel request visibility."
inputParameters:
- name: request_id
in: body
type: string
description: "SAP Concur travel request ID."
call: concur.get-request
with:
id: "{{request_id}}"
outputParameters:
- name: destination
type: string
mapping: "$.MainDestination"
- name: start_date
type: string
mapping: "$.StartDate"
- name: total_estimated_amount
type: number
mapping: "$.TotalEstimatedAmount"
- 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, returning planned budget, actual spend, and variance.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Lookup"
description: "Retrieves budget vs actual figures for an SAP cost center, returning planned budget, actual spend, and variance."
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 the planned budget, actual spend, and variance. Use when finance needs budget performance data."
inputParameters:
- name: cost_center
in: body
type: string
description: "SAP cost center code."
- name: fiscal_period
in: body
type: string
description: "Fiscal period, e.g. '2026-03'."
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"
- name: variance
type: number
mapping: "$.d.Variance"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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, updating inventory and triggering quality inspection if required.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts a goods receipt in SAP for an inbound delivery, updating inventory and triggering quality inspection if required."
tags:
- supply-chain
- manufacturing
- 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 and return the material document number. Use when warehouse teams confirm 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"
- name: posting_date
type: string
mapping: "$.d.PostingDate"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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 specified 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 specified 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 the unrestricted stock, reserved quantity, and reorder point status. Use when supply chain needs to check 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, e.g. '1000'."
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"
- name: reorder_point
type: number
mapping: "$.d.ReorderPoint"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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 Plant Maintenance for manufacturing equipment.
naftiko: "0.5"
info:
label: "SAP Maintenance Order Creation"
description: "Creates a preventive maintenance order in SAP Plant Maintenance for 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 and return the order number. Use when maintenance schedules trigger planned equipment servicing."
inputParameters:
- name: equipment_id
in: body
type: string
description: "SAP equipment ID."
- name: maintenance_type
in: body
type: string
description: "Maintenance 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"
- name: planned_date
type: string
mapping: "$.d.PlannedStartDate"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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, returning description, unit of measure, material group, and plant assignments.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP by material number, returning description, unit of measure, material group, and plant assignments."
tags:
- supply-chain
- erp
- sap
capability:
exposes:
- type: mcp
namespace: material-master
port: 8080
tools:
- name: get-material-master
description: "Given a SAP material number, return the material description, base unit of measure, material group, and assigned plants. 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"
- name: material_group
type: string
mapping: "$.d.MaterialGroup"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material}}')"
inputParameters:
- name: material
in: path
operations:
- name: get-material
method: GET
Retrieves a production order from SAP by order number, returning status, planned quantity, actual output, and scheduled completion date.
naftiko: "0.5"
info:
label: "SAP Production Order Status Lookup"
description: "Retrieves a production order from SAP by order number, returning status, planned quantity, actual output, and scheduled completion date."
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 the order status, planned vs actual quantity, and scheduled dates. Use when manufacturing planners need production 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"
- name: scheduled_end
type: string
mapping: "$.d.ScheduledEndDate"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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 SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items.
naftiko: "0.5"
info:
label: "SAP Purchase Order Status Lookup"
description: "Looks up an SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items."
tags:
- finance
- procurement
- erp
- sap
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and open line items. Use when procurement teams need to check the status of an outstanding PO."
inputParameters:
- name: po_number
in: body
type: string
description: "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_amount
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves quality inspection lot details from SAP by inspection lot number, returning inspection results, usage decision, and defect counts.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Lot Lookup"
description: "Retrieves quality inspection lot details from SAP by inspection lot number, returning inspection 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 SAP inspection lot number, return the inspection status, usage decision, and defect counts. Use when quality teams need to review 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"
- name: defect_count
type: integer
mapping: "$.d.DefectCount"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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, returning payment date, amount, and clearing document.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Status Lookup"
description: "Queries SAP for vendor payment status by invoice number, returning payment date, amount, and clearing document."
tags:
- finance
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: vendor-payments
port: 8080
tools:
- name: get-payment-status
description: "Given an SAP invoice number, return the payment status, payment date, amount paid, and clearing document number. Use when accounts payable needs to verify vendor payment status."
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"
- name: amount_paid
type: number
mapping: "$.d.AmountPaid"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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 affected endpoint, notifies the SOC team, and logs the event for compliance.
naftiko: "0.5"
info:
label: "Security Incident Response Orchestration"
description: "When a critical security alert fires, creates a security incident, isolates the affected endpoint, notifies the SOC team, and logs the event for compliance."
tags:
- security
- it
- crowdstrike
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-incident-response
port: 8080
tools:
- name: respond-to-security-incident
description: "Given a CrowdStrike detection ID and hostname, create a security incident, isolate the endpoint, notify the SOC, and log for compliance. Use when SOC analysts confirm 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-center"
text: "CRITICAL: Security incident {{create-sec-incident.number}} - Host {{hostname}} isolated. Detection: {{detection_id}}. Containment status: {{isolate-endpoint.status}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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, priority, and assignment details for a ServiceNow incident by ticket number.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves the current status, priority, 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 the current state, priority, assigned group, and short description. Use when IT support needs to check ticket status."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number, e.g. 'INC0012345'."
call: servicenow.get-incident
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
- name: assigned_to
type: string
mapping: "$.result.assigned_to.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://abbott.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 Abbott SharePoint document libraries by keyword, returning matching document titles, authors, and URLs.
naftiko: "0.5"
info:
label: "SharePoint Document Library Search"
description: "Searches Abbott SharePoint document libraries by keyword, returning matching document titles, authors, and URLs."
tags:
- documentation
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-search
port: 8080
tools:
- name: search-sharepoint-docs
description: "Given a search query and optional site name, return matching documents with titles, authors, and links. Use when employees need to find documents across SharePoint."
inputParameters:
- name: query
in: body
type: string
description: "Search keywords."
- name: site_name
in: body
type: string
description: "Optional SharePoint site name to scope the search."
call: sharepoint.search
with:
querytext: "{{query}}"
site: "{{site_name}}"
outputParameters:
- name: result_count
type: integer
mapping: "$.PrimaryQueryResult.RelevantResults.TotalRows"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://abbott.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
Executes a predefined clinical analytics query in Snowflake, returning aggregated patient outcome metrics for a given study.
naftiko: "0.5"
info:
label: "Snowflake Clinical Data Query"
description: "Executes a predefined clinical analytics query in Snowflake, returning aggregated patient outcome metrics for a given study."
tags:
- clinical
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: clinical-analytics
port: 8080
tools:
- name: query-clinical-metrics
description: "Given a study ID, return aggregated patient outcome metrics from the clinical data warehouse. Use when clinical data scientists need study-level analytics."
inputParameters:
- name: study_id
in: body
type: string
description: "Clinical study identifier."
call: snowflake.execute-query
with:
query_name: "clinical_outcomes_summary"
params: "{{study_id}}"
outputParameters:
- name: total_patients
type: integer
mapping: "$.data[0].total_patients"
- name: primary_endpoint_met
type: boolean
mapping: "$.data[0].primary_endpoint_met"
- name: adverse_event_rate
type: number
mapping: "$.data[0].ae_rate"
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: queries
path: "/statements"
operations:
- name: execute-query
method: POST
Monitors Snowflake data pipeline task failures for the clinical and commercial data warehouse, logs anomalies to Datadog, and creates Jira tickets for the data engineering team.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Monitoring"
description: "Monitors Snowflake data pipeline task failures for the clinical and commercial data warehouse, logs anomalies to Datadog, and creates Jira tickets for the data engineering team."
tags:
- data
- snowflake
- datadog
- analytics
- monitoring
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: check-data-pipeline-health
description: "Query Snowflake task execution history for failures, log each failure as a Datadog error event, and open a Jira data engineering ticket for any pipeline that has failed consecutively. Use daily to verify Abbott's clinical and commercial data pipelines are healthy."
inputParameters:
- name: lookback_hours
in: body
type: integer
description: "Hours of pipeline history to scan for failures."
- name: jira_project_key
in: body
type: string
description: "Jira project key for data engineering tickets."
steps:
- name: get-failed-tasks
type: call
call: snowflake.get-task-history
with:
lookback_hours: "{{lookback_hours}}"
state: "FAILED"
- name: log-to-datadog
type: call
call: datadog-dq.create-event
with:
title: "Snowflake pipeline failures"
text: "Failed tasks: {{get-failed-tasks.task_names}}"
alert_type: "error"
- name: create-jira-ticket
type: call
call: jira-data.create-issue
with:
project_key: "{{jira_project_key}}"
issuetype: "Bug"
summary: "Pipeline failures — {{get-failed-tasks.task_count}} Snowflake tasks"
description: "Tasks: {{get-failed-tasks.task_names}} | Datadog: {{log-to-datadog.url}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/CLINICAL_DW/schemas/PUBLIC/tasks/history"
inputParameters:
- name: lookback_hours
in: query
- name: state
in: query
operations:
- name: get-task-history
method: GET
- type: http
namespace: datadog-dq
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-data
baseUri: "https://abbott.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Validates incoming SAP Ariba invoices against open purchase orders and routes exceptions to the accounts payable team for resolution.
naftiko: "0.5"
info:
label: "Supplier Ariba Invoice Validation and Approval"
description: "Validates incoming SAP Ariba invoices against open purchase orders and routes exceptions to the accounts payable team for resolution."
tags:
- finance
- procurement
- sap-ariba
- accounts-payable
- erp
capability:
exposes:
- type: mcp
namespace: ap-procurement
port: 8080
tools:
- name: validate-supplier-invoice
description: "Given an SAP Ariba invoice ID and corresponding PO number, retrieve both documents, compare totals, and create a ServiceNow approval task if a mismatch is detected. Use when processing incoming supplier invoices requiring three-way match validation."
inputParameters:
- name: invoice_id
in: body
type: string
description: "SAP Ariba invoice ID."
- name: po_number
in: body
type: string
description: "SAP purchase order number for three-way match."
steps:
- name: get-invoice
type: call
call: ariba.get-invoice
with:
invoice_id: "{{invoice_id}}"
- name: get-po
type: call
call: sap-po.get-purchase-order
with:
po_number: "{{po_number}}"
- name: create-approval
type: call
call: servicenow-ap.create-task
with:
short_description: "Invoice validation: {{invoice_id}} vs PO {{po_number}}"
description: "Invoice total: {{get-invoice.total_amount}} | PO total: {{get-po.total_amount}} | Vendor: {{get-invoice.vendor_name}}"
assigned_group: "AP_Approvals"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/invoice/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: invoices
path: "/invoices/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: sap-po
baseUri: "https://abbott-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-purchase-order
method: GET
- type: http
namespace: servicenow-ap
baseUri: "https://abbott.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
Generates a supplier quality scorecard by pulling rejection rates from SAP, audit findings from ServiceNow, and delivery performance from the procurement system.
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 from the procurement system."
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 to produce a quality scorecard. Use when procurement or quality teams evaluate 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: get-delivery-performance
type: call
call: sap-erp.get-delivery-metrics
with:
vendor_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}},{{get-delivery-performance.on_time_rate}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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
- name: delivery
path: "/A_VendorDelivery(Vendor='{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-delivery-metrics
method: GET
- type: http
namespace: servicenow
baseUri: "https://abbott.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://abbott.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 disruption is detected, identifies impacted purchase orders, notifies procurement, creates alternative sourcing tasks, and updates production schedules.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Response Orchestration"
description: "When a supply chain disruption is detected, identifies impacted purchase orders, notifies procurement, creates alternative sourcing tasks, and updates production schedules."
tags:
- supply-chain
- procurement
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-disruption
port: 8080
tools:
- name: respond-to-disruption
description: "Given a supplier ID and disruption type, identify impacted POs, alert procurement, create sourcing tasks, and adjust production. Use when supply chain detects a material disruption."
inputParameters:
- name: supplier_id
in: body
type: string
description: "SAP supplier/vendor number."
- name: disruption_type
in: body
type: string
description: "Type of disruption: delay, quality_issue, force_majeure."
steps:
- name: get-impacted-pos
type: call
call: sap-erp.query-open-pos
with:
vendor_id: "{{supplier_id}}"
status: "open"
- name: create-sourcing-task
type: call
call: servicenow.create-task
with:
short_description: "Alternative sourcing needed: {{disruption_type}} from vendor {{supplier_id}}"
category: "procurement"
priority: "1"
assigned_group: "Strategic_Sourcing"
- name: notify-procurement
type: call
call: msteams.send-message
with:
channel_id: "supply-chain-ops"
text: "SUPPLY DISRUPTION: Vendor {{supplier_id}} - {{disruption_type}}. Impacted POs: {{get-impacted-pos.count}}. Sourcing task: {{create-sourcing-task.number}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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://abbott.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 refresh of the quality metrics Tableau dashboard and returns the extraction completion status.
naftiko: "0.5"
info:
label: "Tableau Quality Dashboard Refresh"
description: "Triggers a refresh of the quality metrics Tableau dashboard and returns the extraction completion status."
tags:
- quality
- analytics
- tableau
capability:
exposes:
- type: mcp
namespace: quality-analytics
port: 8080
tools:
- name: refresh-quality-dashboard
description: "Given a Tableau workbook name, trigger a data extract refresh and return the job status. Use when quality teams need updated dashboard 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"
- name: status
type: string
mapping: "$.job.status"
consumes:
- type: http
namespace: tableau
baseUri: "https://abbott.online.tableau.com/api/3.19"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: workbooks
path: "/sites/{{site_id}}/workbooks/{{workbook}}/refresh"
inputParameters:
- name: workbook
in: path
operations:
- name: trigger-refresh
method: POST
Provisions a new cloud environment by triggering a Terraform run, configuring Datadog monitoring, creating a ServiceNow CMDB record, and notifying the DevOps team.
naftiko: "0.5"
info:
label: "Terraform Environment Provisioning Orchestration"
description: "Provisions a new cloud environment by triggering a Terraform run, configuring Datadog monitoring, creating a ServiceNow CMDB record, and notifying the DevOps team."
tags:
- devops
- cloud
- terraform
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: env-provisioning
port: 8080
tools:
- name: provision-environment
description: "Given an environment name and Terraform workspace, run the infrastructure plan, configure monitoring, register in CMDB, and notify DevOps. Use when engineering needs a new cloud environment."
inputParameters:
- name: environment_name
in: body
type: string
description: "Name for the new environment."
- name: workspace_id
in: body
type: string
description: "Terraform Cloud 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"
type: "service check"
query: "service:{{environment_name}}"
- name: create-cmdb-record
type: call
call: servicenow.create-ci
with:
name: "{{environment_name}}"
category: "cloud_environment"
terraform_run: "{{trigger-terraform.run_id}}"
- name: notify-devops
type: call
call: msteams.send-message
with:
channel_id: "devops-infra"
text: "Environment {{environment_name}} provisioning started. Terraform run: {{trigger-terraform.run_id}}. CMDB: {{create-cmdb-record.sys_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://abbott.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
Triggers a Terraform Cloud workspace run to provision new environment infrastructure, notifies the DevOps team via Teams upon completion.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Provisioning"
description: "Triggers a Terraform Cloud workspace run to provision new environment infrastructure, notifies the DevOps team via Teams upon completion."
tags:
- devops
- terraform
- cloud
- infrastructure
- provisioning
capability:
exposes:
- type: mcp
namespace: tf-provisioning
port: 8080
tools:
- name: provision-environment
description: "Given a Terraform Cloud workspace ID and environment label, trigger a plan-and-apply run to provision cloud infrastructure. Notify the DevOps Teams channel with run status. Use when standing up new environments for product development or clinical systems."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Terraform Cloud workspace ID."
- name: environment_label
in: body
type: string
description: "Human-readable environment label, e.g. 'freestyle-libre-staging'."
- name: devops_channel_id
in: body
type: string
description: "DevOps Teams channel ID."
steps:
- name: trigger-tf-run
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
message: "Provisioning {{environment_label}}"
auto_apply: "true"
- name: notify-devops
type: call
call: msteams-tf.post-channel-message
with:
channel_id: "{{devops_channel_id}}"
text: "Terraform run triggered for {{environment_label}} (workspace {{workspace_id}}). Run ID: {{trigger-tf-run.data.id}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: msteams-tf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a regulatory or quality document from Veeva Vault by document number, returning metadata, version, and approval status.
naftiko: "0.5"
info:
label: "Veeva Vault Document Retrieval"
description: "Retrieves a regulatory or quality document from Veeva Vault by document number, returning metadata, version, and approval status."
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 the document metadata, current version, lifecycle state, and approval status. Use when teams need to 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://abbott-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
Performs a vendor risk assessment by querying SAP for financial data, checking compliance records in ServiceNow, scoring the vendor, and creating an assessment report.
naftiko: "0.5"
info:
label: "Vendor Risk Assessment Orchestration"
description: "Performs a vendor risk assessment by querying SAP for financial data, checking compliance records in ServiceNow, scoring the vendor, and creating an assessment report."
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 a risk score. Use when procurement needs to evaluate vendor risk before contract renewal."
inputParameters:
- name: vendor_id
in: body
type: string
description: "SAP vendor number."
steps:
- name: get-vendor-financials
type: call
call: sap-erp.get-vendor-master
with:
vendor_id: "{{vendor_id}}"
- name: get-compliance-records
type: call
call: servicenow.query-vendor-compliance
with:
vendor_id: "{{vendor_id}}"
- name: calculate-risk-score
type: call
call: snowflake.execute-query
with:
query_name: "vendor_risk_score"
params: "{{vendor_id}},{{get-vendor-financials.payment_terms}},{{get-compliance-records.open_findings}}"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://abbott-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://abbott.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://abbott.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Retrieves an employee's benefits enrollment status from Workday, returning current plan selections, coverage levels, and enrollment deadlines.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Status"
description: "Retrieves an employee's benefits enrollment status from Workday, returning current plan selections, coverage levels, and enrollment deadlines."
tags:
- hr
- benefits
- workday
capability:
exposes:
- type: mcp
namespace: benefits-enrollment
port: 8080
tools:
- name: get-benefits-status
description: "Given a Workday worker ID, return the employee's current benefits elections, coverage levels, and open enrollment deadline. Use when HR or employees need benefits information."
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: dental_plan
type: string
mapping: "$.data.dental_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 ratings from Workday, generating recommendations, notifying managers, and creating approval tasks.
naftiko: "0.5"
info:
label: "Workday Compensation Review Orchestration"
description: "Launches a compensation review cycle by pulling performance ratings from Workday, generating recommendations, notifying managers, and creating approval tasks."
tags:
- hr
- finance
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: comp-review
port: 8080
tools:
- name: launch-comp-review
description: "Given a department code and review cycle name, pull performance data, generate comp recommendations, notify managers, and create approval workflows. Use when HR launches annual compensation reviews."
inputParameters:
- name: department_code
in: body
type: string
description: "Workday department code."
- name: cycle_name
in: body
type: string
description: "Compensation review cycle name."
steps:
- name: get-performance-data
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}}"
performance_data: "{{get-performance-data.ratings}}"
- name: create-approval-task
type: call
call: servicenow.create-task
with:
short_description: "Compensation review approval: {{department_code}} - {{cycle_name}}"
assigned_group: "HR_Compensation"
category: "hr_compensation"
- name: notify-managers
type: call
call: msteams.send-message
with:
channel_id: "hr-compensation"
text: "Compensation review cycle '{{cycle_name}}' launched for department {{department_code}}. {{generate-recommendations.count}} recommendations generated. Approval task: {{create-approval-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://abbott.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, manager, 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, manager, 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 the employee name, department, title, manager, and work 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"
- name: manager
type: string
mapping: "$.data.manager_name"
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 current headcount and payroll cost totals from Workday by business unit and cost center for finance reporting.
naftiko: "0.5"
info:
label: "Workday Headcount and Payroll Snapshot"
description: "Retrieves current headcount and payroll cost totals from Workday by business unit and cost center for finance reporting."
tags:
- hr
- finance
- payroll
- workday
- headcount
capability:
exposes:
- type: mcp
namespace: hr-finance
port: 8080
tools:
- name: get-headcount-snapshot
description: "Returns headcount and payroll cost data grouped by business unit and cost center from Workday. Use for monthly finance reviews and headcount planning."
inputParameters:
- name: as_of_date
in: body
type: string
description: "Snapshot date in YYYY-MM-DD format."
call: workday-hcm.get-headcount-report
with:
effective_date: "{{as_of_date}}"
outputParameters:
- name: total_headcount
type: string
mapping: "$.Report_Entry[0].Total_Headcount"
- name: total_payroll_cost
type: string
mapping: "$.Report_Entry[0].Total_Payroll_Cost"
consumes:
- type: http
namespace: workday-hcm
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount-report
path: "/reports/headcount_by_cost_center"
inputParameters:
- name: effective_date
in: query
operations:
- name: get-headcount-report
method: GET
Retrieves a summary of open job requisitions from Workday by department, returning requisition count, average days open, and hiring manager details.
naftiko: "0.5"
info:
label: "Workday Open Requisition Report"
description: "Retrieves a summary of open job requisitions from Workday by department, returning requisition count, average days open, and hiring manager details."
tags:
- hr
- recruiting
- workday
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: get-open-requisitions
description: "Given a department code, return the count of open requisitions, average days open, and breakdown by hiring manager. Use when HR or leadership needs recruiting pipeline 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