IQVIA Capabilities
Naftiko 0.5 capability definitions for IQVIA - 100 capabilities showing integration workflows and service orchestrations.
Checks AWS CloudFormation stacks in clinical environments for configuration drift and creates a ServiceNow change request for each stack with detected drift.
naftiko: "0.5"
info:
label: "AWS CloudFormation Stack Drift to ServiceNow Change"
description: "Checks AWS CloudFormation stacks in clinical environments for configuration drift and creates a ServiceNow change request for each stack with detected drift."
tags:
- cloud
- infrastructure
- aws
- servicenow
- governance
- drift-detection
capability:
exposes:
- type: mcp
namespace: stack-governance
port: 8080
tools:
- name: audit-cloudformation-drift
description: "Given an AWS CloudFormation stack name and region, detect drift status and create a ServiceNow change request for any stack showing resource drift from its template."
inputParameters:
- name: stack_name
in: body
type: string
description: "AWS CloudFormation stack name to check for drift."
- name: aws_region
in: body
type: string
description: "AWS region where the stack is deployed."
steps:
- name: detect-drift
type: call
call: "cloudformation.detect-stack-drift"
with:
StackName: "{{stack_name}}"
region: "{{aws_region}}"
- name: create-change-request
type: call
call: "servicenow-cf.create-change"
with:
short_description: "CloudFormation drift: {{stack_name}} in {{aws_region}}"
type: "standard"
description: "Stack {{stack_name}} has drifted from its CloudFormation template. Drift status: {{detect-drift.StackDriftStatus}}"
consumes:
- type: http
namespace: cloudformation
baseUri: "https://cloudformation.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_token"
resources:
- name: stacks
path: "/?Action=DetectStackDrift&StackName={{StackName}}"
inputParameters:
- name: StackName
in: query
operations:
- name: detect-stack-drift
method: POST
- type: http
namespace: servicenow-cf
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
Checks AWS CloudWatch alarm status.
naftiko: "0.5"
info:
label: "AWS CloudWatch Alarm Status"
description: "Checks AWS CloudWatch alarm status."
tags:
- observability
- aws
capability:
exposes:
- type: mcp
namespace: cloud-monitoring
port: 8080
tools:
- name: check-alarm
description: "Check CloudWatch alarm."
inputParameters:
- name: alarm_name
in: body
type: string
description: "Alarm name."
call: "cloudwatch.describe-alarm"
with:
alarm_name: "{{alarm_name}}"
outputParameters:
- name: state
type: string
mapping: "$.MetricAlarms[0].StateValue"
consumes:
- type: http
namespace: cloudwatch
baseUri: "https://monitoring.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_token"
resources:
- name: alarms
path: "/"
operations:
- name: describe-alarm
method: POST
When an AWS CloudWatch alarm triggers for a clinical data application, creates a P2 ServiceNow incident and sends a Datadog synthetic check to verify application availability.
naftiko: "0.5"
info:
label: "AWS CloudWatch Clinical Application Alert to ServiceNow"
description: "When an AWS CloudWatch alarm triggers for a clinical data application, creates a P2 ServiceNow incident and sends a Datadog synthetic check to verify application availability."
tags:
- cloud
- observability
- aws
- servicenow
- datadog
- clinical-systems
capability:
exposes:
- type: mcp
namespace: cloud-clinical-ops
port: 8080
tools:
- name: handle-cloudwatch-alarm
description: "Given an AWS CloudWatch alarm name and affected application name, verify the alarm state, create a ServiceNow incident, and trigger a Datadog synthetic check to confirm application status."
inputParameters:
- name: alarm_name
in: body
type: string
description: "AWS CloudWatch alarm name."
- name: application_name
in: body
type: string
description: "Name of the affected clinical application."
steps:
- name: get-alarm-state
type: call
call: "cloudwatch.get-alarm"
with:
AlarmName: "{{alarm_name}}"
- name: create-incident
type: call
call: "servicenow-cw.create-incident"
with:
short_description: "AWS alarm: {{alarm_name}} — {{application_name}}"
category: "cloud_infrastructure"
urgency: "2"
description: "Alarm state: {{get-alarm-state.StateValue}} | Application: {{application_name}}"
- name: trigger-synthetic
type: call
call: "datadog-synth.trigger-test"
with:
public_id: "$secrets.dd_synthetic_test_id"
consumes:
- type: http
namespace: cloudwatch
baseUri: "https://monitoring.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_token"
resources:
- name: alarms
path: "/?Action=DescribeAlarms&AlarmNames.member.1={{AlarmName}}"
inputParameters:
- name: AlarmName
in: query
operations:
- name: get-alarm
method: GET
- type: http
namespace: servicenow-cw
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: datadog-synth
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: synthetics
path: "/synthetics/tests/trigger/ci"
operations:
- name: trigger-test
method: POST
Handles cost anomalies by querying Snowflake, creating ServiceNow tickets, and alerting FinOps via Teams.
naftiko: "0.5"
info:
label: "AWS Infrastructure Cost Anomaly Handler"
description: "Handles cost anomalies by querying Snowflake, creating ServiceNow tickets, and alerting FinOps via Teams."
tags:
- finops
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: aws-ops
port: 8080
tools:
- name: aws-infrastructure-cost-anomaly-handler
description: "Handles cost anomalies by querying Snowflake, creating ServiceNow tickets, and alerting FinOps via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "AWS Infrastructure Cost Anomaly Handler action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "AWS Infrastructure Cost Anomaly Handler completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks S3 bucket size and object count.
naftiko: "0.5"
info:
label: "AWS S3 Bucket Size Check"
description: "Checks S3 bucket size and object count."
tags:
- data-engineering
- aws
capability:
exposes:
- type: mcp
namespace: cloud-storage
port: 8080
tools:
- name: check-bucket-size
description: "Check S3 bucket."
inputParameters:
- name: bucket_name
in: body
type: string
description: "Bucket name."
call: "s3.get-bucket-metrics"
with:
bucket: "{{bucket_name}}"
outputParameters:
- name: size_bytes
type: integer
mapping: "$.size"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_token"
resources:
- name: buckets
path: "/{{bucket_name}}"
inputParameters:
- name: bucket_name
in: path
operations:
- name: get-bucket-metrics
method: GET
Enumerates S3 bucket policies for IQVIA clinical data lake buckets and creates a ServiceNow security task for any bucket found with public or cross-account access.
naftiko: "0.5"
info:
label: "AWS S3 Clinical Data Lake Access Audit"
description: "Enumerates S3 bucket policies for IQVIA clinical data lake buckets and creates a ServiceNow security task for any bucket found with public or cross-account access."
tags:
- cloud
- security
- aws
- servicenow
- clinical-systems
- access-review
capability:
exposes:
- type: mcp
namespace: data-lake-security
port: 8080
tools:
- name: audit-clinical-data-lake
description: "Given an AWS region, enumerate clinical data lake S3 buckets for policy violations and create a ServiceNow security task for each non-compliant bucket detected."
inputParameters:
- name: aws_region
in: body
type: string
description: "AWS region to audit, e.g. us-east-1."
steps:
- name: list-buckets
type: call
call: "aws-s3.list-buckets"
with:
region: "{{aws_region}}"
- name: create-sec-task
type: call
call: "servicenow-s3.create-task"
with:
short_description: "Clinical data lake access audit: {{aws_region}} — policy violations detected"
category: "data_security"
assignment_group: "Cloud_Security"
description: "Non-compliant buckets: {{list-buckets.non_compliant_count}} in region {{aws_region}}"
consumes:
- type: http
namespace: aws-s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_token"
resources:
- name: buckets
path: "/"
operations:
- name: list-buckets
method: GET
- type: http
namespace: servicenow-s3
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Audits data lake governance using Snowflake, ServiceNow findings, and Teams alerts.
naftiko: "0.5"
info:
label: "AWS S3 Data Lake Governance Check"
description: "Audits data lake governance using Snowflake, ServiceNow findings, and Teams alerts."
tags:
- data-governance
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: aws-ops
port: 8080
tools:
- name: aws-s3-data-lake-governance-check
description: "Audits data lake governance using Snowflake, ServiceNow findings, and Teams alerts."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "AWS S3 Data Lake Governance Check action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "AWS S3 Data Lake Governance Check completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Validates data deliveries by running Snowflake checks, logging results, and notifying via Teams.
naftiko: "0.5"
info:
label: "Clinical Data Delivery Validation"
description: "Validates data deliveries by running Snowflake checks, logging results, and notifying via Teams."
tags:
- clinical
- data-quality
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-data-delivery-validation
description: "Validates data deliveries by running Snowflake checks, logging results, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Data Delivery Validation completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Masks clinical data using Snowflake transforms and logs in ServiceNow.
naftiko: "0.5"
info:
label: "Clinical Data Masking Workflow"
description: "Masks clinical data using Snowflake transforms and logs in ServiceNow."
tags:
- compliance
- clinical
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-data-masking-workflow
description: "Masks clinical data using Snowflake transforms and logs in ServiceNow."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Clinical Data Masking Workflow action required"
category: "automated"
assigned_group: "Operations"
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.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
Refreshes quality KPIs from Snowflake, triggers Power BI, and notifies via Teams.
naftiko: "0.5"
info:
label: "Clinical Data Quality KPI Dashboard"
description: "Refreshes quality KPIs from Snowflake, triggers Power BI, and notifies via Teams."
tags:
- clinical
- data-quality
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-data-quality-kpi-dashboard
description: "Refreshes quality KPIs from Snowflake, triggers Power BI, and notifies via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Data Quality KPI Dashboard completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks DTAs in Snowflake, updates SharePoint, and notifies legal via Teams.
naftiko: "0.5"
info:
label: "Clinical Data Transfer Agreement Tracker"
description: "Tracks DTAs in Snowflake, updates SharePoint, and notifies legal via Teams."
tags:
- clinical
- compliance
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-data-transfer-agreement-tracker
description: "Tracks DTAs in Snowflake, updates SharePoint, and notifies legal via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Data Transfer Agreement Tracker completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Exports patient data from Snowflake and logs in ServiceNow.
naftiko: "0.5"
info:
label: "Clinical Patient Data Export Workflow"
description: "Exports patient data from Snowflake and logs in ServiceNow."
tags:
- clinical
- data-management
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-patient-data-export-workflow
description: "Exports patient data from Snowflake and logs in ServiceNow."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Clinical Patient Data Export Workflow action required"
category: "automated"
assigned_group: "Operations"
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.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
Handles deviations by logging in Snowflake, creating Jira tickets, and alerting via Teams.
naftiko: "0.5"
info:
label: "Clinical Protocol Deviation Handler"
description: "Handles deviations by logging in Snowflake, creating Jira tickets, and alerting via Teams."
tags:
- clinical
- quality
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-protocol-deviation-handler
description: "Handles deviations by logging in Snowflake, creating Jira tickets, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Clinical Protocol Deviation Handler follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Protocol Deviation Handler completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: jira
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks enrollment from Snowflake, refreshes Power BI, and posts to Teams.
naftiko: "0.5"
info:
label: "Clinical Site Enrollment Tracker"
description: "Tracks enrollment from Snowflake, refreshes Power BI, and posts to Teams."
tags:
- clinical
- analytics
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-site-enrollment-tracker
description: "Tracks enrollment from Snowflake, refreshes Power BI, and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Site Enrollment Tracker completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Refreshes site metrics by querying Snowflake, triggering Power BI, and posting to Teams.
naftiko: "0.5"
info:
label: "Clinical Site Performance Dashboard"
description: "Refreshes site metrics by querying Snowflake, triggering Power BI, and posting to Teams."
tags:
- clinical
- analytics
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-site-performance-dashboard
description: "Refreshes site metrics by querying Snowflake, triggering Power BI, and posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Site Performance Dashboard completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates close-out by archiving Snowflake data, updating SharePoint, and notifying via Teams.
naftiko: "0.5"
info:
label: "Clinical Study Close-Out Orchestrator"
description: "Orchestrates close-out by archiving Snowflake data, updating SharePoint, and notifying via Teams."
tags:
- clinical
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-study-close-out-orchestrator
description: "Orchestrates close-out by archiving Snowflake data, updating SharePoint, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Study Close-Out Orchestrator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Ingests clinical data by loading to Snowflake, running quality checks, and notifying data management via Teams.
naftiko: "0.5"
info:
label: "Clinical Trial Data Ingestion Orchestrator"
description: "Ingests clinical data by loading to Snowflake, running quality checks, and notifying data management via Teams."
tags:
- clinical
- data-engineering
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: clinical-ops
port: 8080
tools:
- name: clinical-trial-data-ingestion-orchestrator
description: "Ingests clinical data by loading to Snowflake, running quality checks, and notifying data management via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Clinical Trial Data Ingestion Orchestrator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new clinical trial site is activated in the study management system, provisions the site in ServiceNow, sends a Microsoft Teams welcome message to the site coordinator, and creates a SharePoint data-sharing folder.
naftiko: "0.5"
info:
label: "Clinical Trial Site Activation Onboarding"
description: "When a new clinical trial site is activated in the study management system, provisions the site in ServiceNow, sends a Microsoft Teams welcome message to the site coordinator, and creates a SharePoint data-sharing folder."
tags:
- hr
- onboarding
- clinical-trials
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: site-onboarding
port: 8080
tools:
- name: trigger-site-activation
description: "Given a site activation record with site ID, coordinator email, and study protocol ID, provision a ServiceNow onboarding task, notify the coordinator via Teams, and create a SharePoint document folder."
inputParameters:
- name: site_id
in: body
type: string
description: "Clinical trial site identifier."
- name: coordinator_email
in: body
type: string
description: "Site coordinator email address."
- name: protocol_id
in: body
type: string
description: "Study protocol identifier."
steps:
- name: create-onboard-task
type: call
call: "servicenow.create-task"
with:
short_description: "Site activation: {{site_id}} for protocol {{protocol_id}}"
category: "clinical_operations"
assignment_group: "Clinical_IT"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{coordinator_email}}"
message: "Welcome to IQVIA Clinical Operations! Your site {{site_id}} has been activated for protocol {{protocol_id}}. Task: {{create-onboard-task.number}}"
- name: create-site-folder
type: call
call: "graph-sp.create-folder"
with:
site_id: "iqvia-clinical-data"
folder_name: "{{protocol_id}}_{{site_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
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.graph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: graph-sp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: folders
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-folder
method: POST
Generates audit trails from Snowflake, assembles SharePoint reports, and notifies via Teams.
naftiko: "0.5"
info:
label: "Compliance Audit Trail Generator"
description: "Generates audit trails from Snowflake, assembles SharePoint reports, and notifies via Teams."
tags:
- compliance
- audit
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance-ops
port: 8080
tools:
- name: compliance-audit-trail-generator
description: "Generates audit trails from Snowflake, assembles SharePoint reports, and notifies via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Compliance Audit Trail Generator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Lists pages in a Confluence space.
naftiko: "0.5"
info:
label: "Confluence Space Page Listing"
description: "Lists pages in a Confluence space."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: km-pages
port: 8080
tools:
- name: list-pages
description: "List Confluence pages."
inputParameters:
- name: space_key
in: body
type: string
description: "Space key."
call: "confluence.list-pages"
with:
space_key: "{{space_key}}"
outputParameters:
- name: pages
type: array
mapping: "$.results"
consumes:
- type: http
namespace: confluence
baseUri: "https://iqvia.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: space-content
path: "/space/{{space_key}}/content"
inputParameters:
- name: space_key
in: path
operations:
- name: list-pages
method: GET
Reconciles access across Workday, ServiceNow, and Snowflake.
naftiko: "0.5"
info:
label: "Cross-System User Access Reconciliation"
description: "Reconciles access across Workday, ServiceNow, and Snowflake."
tags:
- security
- identity
- workday
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: cross-ops
port: 8080
tools:
- name: cross-system-user-access-reconciliation
description: "Reconciles access across Workday, ServiceNow, and Snowflake."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Cross-System User Access Reconciliation action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.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: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Checks pipeline health from Snowflake logs, creating ServiceNow alerts and notifying via Teams.
naftiko: "0.5"
info:
label: "Data Pipeline Orchestration Health Check"
description: "Checks pipeline health from Snowflake logs, creating ServiceNow alerts and notifying via Teams."
tags:
- data-engineering
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: data-pipeline-orchestration-health-check
description: "Checks pipeline health from Snowflake logs, creating ServiceNow alerts and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Data Pipeline Orchestration Health Check action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Data Pipeline Orchestration Health Check completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Processes anonymization by executing Snowflake transforms, logging in ServiceNow, and confirming via Teams.
naftiko: "0.5"
info:
label: "Data Privacy Anonymization Workflow"
description: "Processes anonymization by executing Snowflake transforms, logging in ServiceNow, and confirming via Teams."
tags:
- compliance
- privacy
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: data-privacy-anonymization-workflow
description: "Processes anonymization by executing Snowflake transforms, logging in ServiceNow, and confirming via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Data Privacy Anonymization Workflow action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Data Privacy Anonymization Workflow completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks P99 latency for a clinical API from Datadog.
naftiko: "0.5"
info:
label: "Datadog API Latency Check"
description: "Checks P99 latency for a clinical API from Datadog."
tags:
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: observability-api
port: 8080
tools:
- name: check-api-latency
description: "Check API latency."
inputParameters:
- name: service_name
in: body
type: string
description: "Service name."
call: "datadog.get-metrics"
with:
service: "{{service_name}}"
outputParameters:
- name: p99_latency
type: string
mapping: "$.series[0].pointlist[-1][1]"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: query
path: "/query"
operations:
- name: get-metrics
method: GET
Detects cloud infrastructure cost anomalies via Datadog metrics and routes a ServiceNow FinOps review task to the cloud governance team when daily spend exceeds budget thresholds.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Cost Anomaly to ServiceNow FinOps"
description: "Detects cloud infrastructure cost anomalies via Datadog metrics and routes a ServiceNow FinOps review task to the cloud governance team when daily spend exceeds budget thresholds."
tags:
- cloud
- finops
- datadog
- servicenow
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: detect-cloud-cost-anomaly
description: "Given a Datadog cost anomaly monitor ID and environment tag, check current cloud spend metrics and create a ServiceNow FinOps review task if the anomaly threshold is exceeded."
inputParameters:
- name: cost_monitor_id
in: body
type: string
description: "Datadog monitor ID tracking cloud cost anomalies."
- name: environment
in: body
type: string
description: "Cloud environment tag, e.g. prod, staging."
steps:
- name: check-cost-monitor
type: call
call: "datadog-cost.get-monitor"
with:
monitor_id: "{{cost_monitor_id}}"
- name: create-finops-task
type: call
call: "servicenow-finops.create-task"
with:
short_description: "Cloud cost anomaly: {{environment}} — monitor {{cost_monitor_id}} triggered"
category: "finops"
assignment_group: "Cloud_FinOps"
description: "Environment: {{environment}} | Monitor state: {{check-cost-monitor.overall_state}}"
consumes:
- type: http
namespace: datadog-cost
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow-finops
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Searches Datadog logs by query.
naftiko: "0.5"
info:
label: "Datadog Log Search"
description: "Searches Datadog logs by query."
tags:
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: observability-logs
port: 8080
tools:
- name: search-logs
description: "Search Datadog logs."
inputParameters:
- name: query
in: body
type: string
description: "Log query."
call: "datadog.search-logs"
with:
query: "{{query}}"
outputParameters:
- name: logs
type: array
mapping: "$.data"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: logs
path: "/logs/events/search"
operations:
- name: search-logs
method: POST
Escalates SLA breaches from Datadog, creates ServiceNow incidents, and alerts via Teams.
naftiko: "0.5"
info:
label: "Datadog SLA Breach Escalation"
description: "Escalates SLA breaches from Datadog, creates ServiceNow incidents, and alerts via Teams."
tags:
- observability
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: datadog-ops
port: 8080
tools:
- name: datadog-sla-breach-escalation
description: "Escalates SLA breaches from Datadog, creates ServiceNow incidents, and alerts via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: check-monitors
type: call
call: "datadog.get-monitors"
with:
tags: "service:{{service_name}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Datadog SLA Breach Escalation action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Datadog SLA Breach Escalation completed successfully."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-monitors
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors Datadog SLO burn rate for IQVIA clinical data APIs and creates a P1 ServiceNow incident when error budget consumption exceeds the fast-burn threshold.
naftiko: "0.5"
info:
label: "Datadog SLO Burn Rate Alert for Clinical API"
description: "Monitors Datadog SLO burn rate for IQVIA clinical data APIs and creates a P1 ServiceNow incident when error budget consumption exceeds the fast-burn threshold."
tags:
- observability
- itsm
- datadog
- servicenow
- clinical-systems
- slo
capability:
exposes:
- type: mcp
namespace: clinical-slo
port: 8080
tools:
- name: handle-api-slo-breach
description: "Given a Datadog SLO ID for a clinical API and a burn rate threshold, check the error budget consumption rate and open a P1 ServiceNow incident if the threshold is breached."
inputParameters:
- name: slo_id
in: body
type: string
description: "Datadog SLO ID for the clinical API."
- name: api_name
in: body
type: string
description: "Name of the clinical API for incident context."
- name: burn_threshold
in: body
type: number
description: "Burn rate multiplier above which to open an incident."
steps:
- name: get-slo-status
type: call
call: "datadog-slo.get-slo"
with:
slo_id: "{{slo_id}}"
- name: create-p1-incident
type: call
call: "servicenow-slo.create-incident"
with:
short_description: "SLO breach: {{api_name}} error budget burning at {{burn_threshold}}x"
urgency: "1"
impact: "1"
category: "clinical_api"
description: "SLO: {{slo_id}} | API: {{api_name}} | Status: {{get-slo-status.overall_status}}"
consumes:
- type: http
namespace: datadog-slo
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo/{{slo_id}}"
inputParameters:
- name: slo_id
in: path
operations:
- name: get-slo
method: GET
- type: http
namespace: servicenow-slo
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Provisions new hire access across Workday, ServiceNow, and confirms via Teams.
naftiko: "0.5"
info:
label: "Employee Onboarding Access Provisioning"
description: "Provisions new hire access across Workday, ServiceNow, and confirms via Teams."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-ops
port: 8080
tools:
- name: employee-onboarding-access-provisioning
description: "Provisions new hire access across Workday, ServiceNow, and confirms via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Employee Onboarding Access Provisioning action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Employee Onboarding Access Provisioning completed successfully."
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Updates access after role changes using Workday data, ServiceNow groups, and Teams confirmation.
naftiko: "0.5"
info:
label: "Employee Role Change Access Update"
description: "Updates access after role changes using Workday data, ServiceNow groups, and Teams confirmation."
tags:
- hr
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: employee-ops
port: 8080
tools:
- name: employee-role-change-access-update
description: "Updates access after role changes using Workday data, ServiceNow groups, and Teams confirmation."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Employee Role Change Access Update action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Employee Role Change Access Update completed successfully."
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Analyzes API usage from Datadog, loading to Snowflake, and generating Power BI dashboards.
naftiko: "0.5"
info:
label: "Enterprise API Usage Analytics"
description: "Analyzes API usage from Datadog, loading to Snowflake, and generating Power BI dashboards."
tags:
- platform-engineering
- datadog
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: enterprise-ops
port: 8080
tools:
- name: enterprise-api-usage-analytics
description: "Analyzes API usage from Datadog, loading to Snowflake, and generating Power BI dashboards."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: check-monitors
type: call
call: "datadog.get-monitors"
with:
tags: "service:{{service_name}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-monitors
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
Optimizes licenses from Snowflake data, creating ServiceNow recommendations and notifying FinOps via Teams.
naftiko: "0.5"
info:
label: "Enterprise License Usage Optimizer"
description: "Optimizes licenses from Snowflake data, creating ServiceNow recommendations and notifying FinOps via Teams."
tags:
- finops
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: enterprise-ops
port: 8080
tools:
- name: enterprise-license-usage-optimizer
description: "Optimizes licenses from Snowflake data, creating ServiceNow recommendations and notifying FinOps via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Enterprise License Usage Optimizer action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Enterprise License Usage Optimizer completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates month-end close with Snowflake reconciliations and notifies finance via Teams.
naftiko: "0.5"
info:
label: "Financial Month-End Close Orchestrator"
description: "Orchestrates month-end close with Snowflake reconciliations and notifies finance via Teams."
tags:
- finance
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: financial-ops
port: 8080
tools:
- name: financial-month-end-close-orchestrator
description: "Orchestrates month-end close with Snowflake reconciliations and notifies finance via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Financial Month-End Close Orchestrator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks latest CI build status.
naftiko: "0.5"
info:
label: "GitHub Actions Build Status"
description: "Checks latest CI build status."
tags:
- devops
- github-actions
capability:
exposes:
- type: mcp
namespace: devops-ci
port: 8080
tools:
- name: check-build-status
description: "Check build status."
inputParameters:
- name: repo
in: body
type: string
description: "Repository (org/repo)."
call: "github.get-workflow-runs"
with:
repo: "{{repo}}"
outputParameters:
- name: status
type: string
mapping: "$.workflow_runs[0].conclusion"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs"
inputParameters:
- name: repo
in: path
operations:
- name: get-workflow-runs
method: GET
When a GitHub Actions workflow fails on a protected branch, creates a Jira bug in the appropriate project and sends a Microsoft Teams alert to the engineering channel.
naftiko: "0.5"
info:
label: "GitHub Actions Pipeline Failure to Jira Bug"
description: "When a GitHub Actions workflow fails on a protected branch, creates a Jira bug in the appropriate project and sends a Microsoft Teams alert to the engineering channel."
tags:
- devops
- cicd
- github
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-ci
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow run failure with repo name, branch, and commit SHA, create a Jira bug and send a Teams notification with failure context."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository full name, e.g. iqvia/my-service."
- name: branch
in: body
type: string
description: "Branch where the pipeline failed."
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: commit_sha
in: body
type: string
description: "SHA of the failing commit."
steps:
- name: get-run
type: call
call: "github.get-workflow-run"
with:
owner: "iqvia"
repo: "{{repo}}"
run_id: "{{run_id}}"
- name: create-jira-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}} — {{get-run.name}}"
description: "Run: {{run_id}} | Commit: {{commit_sha}} | Conclusion: {{get-run.conclusion}}"
- name: notify-teams
type: call
call: "msteams-eng.post-message"
with:
channel_id: "$secrets.eng_teams_channel_id"
message: "CI Failure: {{repo}} | Branch: {{branch}} | Jira: {{create-jira-bug.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{owner}}/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: jira
baseUri: "https://iqvia.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-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Tracks deployments from GitHub Actions, updates ServiceNow, and notifies DevOps via Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Deployment Tracker"
description: "Tracks deployments from GitHub Actions, updates ServiceNow, and notifies DevOps via Teams."
tags:
- devops
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: github-ops
port: 8080
tools:
- name: github-cicd-deployment-tracker
description: "Tracks deployments from GitHub Actions, updates ServiceNow, and notifies DevOps via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-repo-info
type: call
call: "github.get-repo"
with:
repo: "{{repo_name}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "GitHub CI/CD Deployment Tracker action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "GitHub CI/CD Deployment Tracker completed successfully."
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
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Enforces quality gates from GitHub PRs, Snowflake metrics, and Jira issues.
naftiko: "0.5"
info:
label: "GitHub Code Quality Gate Enforcer"
description: "Enforces quality gates from GitHub PRs, Snowflake metrics, and Jira issues."
tags:
- devops
- github
- snowflake
- jira
capability:
exposes:
- type: mcp
namespace: github-ops
port: 8080
tools:
- name: github-code-quality-gate-enforcer
description: "Enforces quality gates from GitHub PRs, Snowflake metrics, and Jira issues."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-repo-info
type: call
call: "github.get-repo"
with:
repo: "{{repo_name}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "GitHub Code Quality Gate Enforcer follow-up"
issue_type: "Task"
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
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: jira
baseUri: "https://iqvia.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
Scans GitHub repositories containing clinical or regulatory data for secret exposure and compliance violations. Creates ServiceNow security incidents for any violations found.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Scan for Regulatory Data"
description: "Scans GitHub repositories containing clinical or regulatory data for secret exposure and compliance violations. Creates ServiceNow security incidents for any violations found."
tags:
- security
- devops
- github
- servicenow
- compliance
- clinical-systems
capability:
exposes:
- type: mcp
namespace: repo-compliance
port: 8080
tools:
- name: scan-repo-compliance
description: "Given a GitHub repository name and a compliance topic tag, retrieve repository secret scanning alerts and create a ServiceNow security incident for each critical exposure detected."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository name within the iqvia org."
- name: compliance_topic
in: body
type: string
description: "Compliance topic tag to validate, e.g. clinical-data, phi-data."
steps:
- name: get-secret-alerts
type: call
call: "github-sec.get-secret-alerts"
with:
owner: "iqvia"
repo: "{{repo}}"
- name: create-sec-incident
type: call
call: "servicenow-compliance.create-incident"
with:
short_description: "Secret exposure in {{repo}}: {{compliance_topic}} compliance violation"
category: "security"
urgency: "1"
description: "Repo: {{repo}} | Alert count: {{get-secret-alerts.total_count}} | Topic: {{compliance_topic}}"
consumes:
- type: http
namespace: github-sec
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: secret-alerts
path: "/repos/{{owner}}/{{repo}}/secret-scanning/alerts"
inputParameters:
- name: owner
in: path
- name: repo
in: path
operations:
- name: get-secret-alerts
method: GET
- type: http
namespace: servicenow-compliance
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Scans repos for compliance using GitHub settings, Snowflake logs, and Jira findings.
naftiko: "0.5"
info:
label: "GitHub Repository Compliance Scanner"
description: "Scans repos for compliance using GitHub settings, Snowflake logs, and Jira findings."
tags:
- security
- compliance
- github
- snowflake
- jira
capability:
exposes:
- type: mcp
namespace: github-ops
port: 8080
tools:
- name: github-repository-compliance-scanner
description: "Scans repos for compliance using GitHub settings, Snowflake logs, and Jira findings."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-repo-info
type: call
call: "github.get-repo"
with:
repo: "{{repo_name}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "GitHub Repository Compliance Scanner follow-up"
issue_type: "Task"
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
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: jira
baseUri: "https://iqvia.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
Syncs email metrics from HubSpot to Snowflake, refreshes Power BI, and notifies via Teams.
naftiko: "0.5"
info:
label: "HubSpot Email Campaign Performance Sync"
description: "Syncs email metrics from HubSpot to Snowflake, refreshes Power BI, and notifies via Teams."
tags:
- marketing
- hubspot
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hubspot-ops
port: 8080
tools:
- name: hubspot-email-campaign-performance-sync
description: "Syncs email metrics from HubSpot to Snowflake, refreshes Power BI, and notifies via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: search-contacts
type: call
call: "hubspot.search"
with:
query: "{{search_term}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "HubSpot Email Campaign Performance Sync completed successfully."
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts"
operations:
- name: search
method: POST
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves lead score from HubSpot.
naftiko: "0.5"
info:
label: "HubSpot Lead Score Lookup"
description: "Retrieves lead score from HubSpot."
tags:
- marketing
- hubspot
capability:
exposes:
- type: mcp
namespace: marketing-leads
port: 8080
tools:
- name: get-lead-score
description: "Look up HubSpot lead score."
inputParameters:
- name: contact_id
in: body
type: string
description: "Contact ID."
call: "hubspot.get-contact"
with:
contact_id: "{{contact_id}}"
outputParameters:
- name: score
type: string
mapping: "$.properties.hubspotscore"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts/{{contact_id}}"
inputParameters:
- name: contact_id
in: path
operations:
- name: get-contact
method: GET
Fetches HubSpot email campaign metrics for a pharmaceutical product campaign and logs the performance digest as a Salesforce activity on the product campaign record.
naftiko: "0.5"
info:
label: "HubSpot Marketing Campaign Performance to Salesforce"
description: "Fetches HubSpot email campaign metrics for a pharmaceutical product campaign and logs the performance digest as a Salesforce activity on the product campaign record."
tags:
- marketing
- sales
- hubspot
- salesforce
- pharma
- reporting
capability:
exposes:
- type: mcp
namespace: pharma-marketing
port: 8080
tools:
- name: sync-campaign-metrics
description: "Given a HubSpot campaign ID and Salesforce campaign ID, retrieve email send, open, and click metrics from HubSpot and create a performance activity record on the Salesforce campaign."
inputParameters:
- name: hubspot_campaign_id
in: body
type: string
description: "HubSpot email campaign ID."
- name: sf_campaign_id
in: body
type: string
description: "Salesforce campaign record ID."
steps:
- name: get-hs-stats
type: call
call: "hubspot-stats.get-campaign-stats"
with:
campaignId: "{{hubspot_campaign_id}}"
- name: log-sf-activity
type: call
call: "salesforce-task.create-task"
with:
WhatId: "{{sf_campaign_id}}"
Subject: "Campaign Performance Digest — {{hubspot_campaign_id}}"
Description: "Sent: {{get-hs-stats.sent}} | Opens: {{get-hs-stats.opens}} | Clicks: {{get-hs-stats.clicks}} | Unsubscribes: {{get-hs-stats.unsubscribes}}"
consumes:
- type: http
namespace: hubspot-stats
baseUri: "https://api.hubapi.com/marketing/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: campaign-stats
path: "/emails/statistics/list"
inputParameters:
- name: campaignId
in: query
operations:
- name: get-campaign-stats
method: GET
- type: http
namespace: salesforce-task
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
Syncs leads from HubSpot to Salesforce, logs in Snowflake, and notifies sales via Teams.
naftiko: "0.5"
info:
label: "HubSpot to Salesforce Lead Sync"
description: "Syncs leads from HubSpot to Salesforce, logs in Snowflake, and notifies sales via Teams."
tags:
- marketing
- commercial
- hubspot
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hubspot-ops
port: 8080
tools:
- name: hubspot-to-salesforce-lead-sync
description: "Syncs leads from HubSpot to Salesforce, logs in Snowflake, and notifies sales via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: search-contacts
type: call
call: "hubspot.search"
with:
query: "{{search_term}}"
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "HubSpot to Salesforce Lead Sync completed successfully."
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts"
operations:
- name: search
method: POST
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates DR tests using ServiceNow runbooks, Snowflake validation, and Teams reporting.
naftiko: "0.5"
info:
label: "IT Disaster Recovery Test Orchestrator"
description: "Orchestrates DR tests using ServiceNow runbooks, Snowflake validation, and Teams reporting."
tags:
- infrastructure
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-disaster-recovery-test-orchestrator
description: "Orchestrates DR tests using ServiceNow runbooks, Snowflake validation, and Teams reporting."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Disaster Recovery Test Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "IT Disaster Recovery Test Orchestrator completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.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: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Responds to security incidents by creating ServiceNow tickets, checking Datadog, and alerting via Teams.
naftiko: "0.5"
info:
label: "IT Security Incident Response Orchestrator"
description: "Responds to security incidents by creating ServiceNow tickets, checking Datadog, and alerting via Teams."
tags:
- security
- servicenow
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-security-incident-response-orchestrator
description: "Responds to security incidents by creating ServiceNow tickets, checking Datadog, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Security Incident Response Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: check-monitors
type: call
call: "datadog.get-monitors"
with:
tags: "service:{{service_name}}"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "IT Security Incident Response Orchestrator completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.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: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-monitors
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Processes catalog requests via ServiceNow and confirms via Teams.
naftiko: "0.5"
info:
label: "IT Service Catalog Request Orchestrator"
description: "Processes catalog requests via ServiceNow and confirms via Teams."
tags:
- it-service-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: it-service-catalog-request-orchestrator
description: "Processes catalog requests via ServiceNow and confirms via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT Service Catalog Request Orchestrator action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "IT Service Catalog Request Orchestrator completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Extracts defect and bug metrics from Jira for a given project and refreshes a Power BI quality dashboard for engineering and QA leadership.
naftiko: "0.5"
info:
label: "Jira Defect Rate Report to Power BI"
description: "Extracts defect and bug metrics from Jira for a given project and refreshes a Power BI quality dashboard for engineering and QA leadership."
tags:
- devops
- analytics
- jira
- power-bi
- quality
- reporting
capability:
exposes:
- type: mcp
namespace: quality-reporting
port: 8080
tools:
- name: refresh-defect-rate-report
description: "Given a Jira project key and a Power BI dataset ID, count open bugs and escaped defects from Jira and push a dataset refresh to the Power BI quality dashboard."
inputParameters:
- name: jira_project_key
in: body
type: string
description: "Jira project key to analyze for defects, e.g. CLINICAL."
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for the quality dashboard."
steps:
- name: get-bug-count
type: call
call: "jira-quality.count-bugs"
with:
project: "{{jira_project_key}}"
issuetype: "Bug"
status: "Open"
- name: refresh-pbi
type: call
call: "powerbi-quality.refresh-dataset"
with:
datasetId: "{{powerbi_dataset_id}}"
consumes:
- type: http
namespace: jira-quality
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/search"
inputParameters:
- name: jql
in: query
operations:
- name: count-bugs
method: GET
- type: http
namespace: powerbi-quality
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{datasetId}}/refreshes"
inputParameters:
- name: datasetId
in: path
operations:
- name: refresh-dataset
method: POST
Retrieves defect status from Jira.
naftiko: "0.5"
info:
label: "Jira Defect Status Lookup"
description: "Retrieves defect status from Jira."
tags:
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: pm-defects
port: 8080
tools:
- name: get-defect-status
description: "Look up Jira defect."
inputParameters:
- name: issue_key
in: body
type: string
description: "Issue key."
call: "jira.get-issue"
with:
issue_key: "{{issue_key}}"
outputParameters:
- name: status
type: string
mapping: "$.fields.status.name"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- type: http
namespace: jira
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
After a Jira sprint closes, generates a velocity and defect-rate digest and posts it to the engineering Microsoft Teams channel for retrospective planning.
naftiko: "0.5"
info:
label: "Jira Sprint Retrospective Digest to Microsoft Teams"
description: "After a Jira sprint closes, generates a velocity and defect-rate digest and posts it to the engineering Microsoft Teams channel for retrospective planning."
tags:
- devops
- reporting
- jira
- microsoft-teams
- analytics
capability:
exposes:
- type: mcp
namespace: sprint-reporting
port: 8080
tools:
- name: post-sprint-retrospective
description: "Given a Jira board ID and sprint ID, retrieve completed issues and defect counts and post a retrospective digest to the designated Microsoft Teams engineering channel."
inputParameters:
- name: board_id
in: body
type: string
description: "Jira board ID."
- name: sprint_id
in: body
type: string
description: "Jira sprint ID to report on."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the retrospective post."
steps:
- name: get-sprint-issues
type: call
call: "jira-sprint.get-sprint-issues"
with:
boardId: "{{board_id}}"
sprintId: "{{sprint_id}}"
- name: post-retro
type: call
call: "msteams-retro.post-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Sprint Retrospective: Completed: {{get-sprint-issues.done_count}} | Bugs: {{get-sprint-issues.bug_count}} | Velocity: {{get-sprint-issues.story_points}}"
consumes:
- type: http
namespace: jira-sprint
baseUri: "https://iqvia.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: sprint-issues
path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
inputParameters:
- name: boardId
in: path
- name: sprintId
in: path
operations:
- name: get-sprint-issues
method: GET
- type: http
namespace: msteams-retro
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Generates retro reports from Jira metrics, Snowflake data, and posts to Teams.
naftiko: "0.5"
info:
label: "Jira Sprint Retrospective Report"
description: "Generates retro reports from Jira metrics, Snowflake data, and posts to Teams."
tags:
- project-management
- jira
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: jira-ops
port: 8080
tools:
- name: jira-sprint-retrospective-report
description: "Generates retro reports from Jira metrics, Snowflake data, and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Jira Sprint Retrospective Report follow-up"
issue_type: "Task"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Jira Sprint Retrospective Report completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Bridges bugs from Jira to ServiceNow and notifies ops via Teams.
naftiko: "0.5"
info:
label: "Jira to ServiceNow Bug Bridge"
description: "Bridges bugs from Jira to ServiceNow and notifies ops via Teams."
tags:
- devops
- jira
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: jira-ops
port: 8080
tools:
- name: jira-to-servicenow-bug-bridge
description: "Bridges bugs from Jira to ServiceNow and notifies ops via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Jira to ServiceNow Bug Bridge follow-up"
issue_type: "Task"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Jira to ServiceNow Bug Bridge action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Jira to ServiceNow Bug Bridge completed successfully."
consumes:
- type: http
namespace: jira
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Pulls new LinkedIn recruiter candidate applications for a life sciences role and creates candidate records in Workday HCM for recruiter review and disposition.
naftiko: "0.5"
info:
label: "LinkedIn Talent Sourcing to Workday Candidate Pipeline"
description: "Pulls new LinkedIn recruiter candidate applications for a life sciences role and creates candidate records in Workday HCM for recruiter review and disposition."
tags:
- hr
- recruiting
- linkedin
- workday
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: recruiting
port: 8080
tools:
- name: sync-linkedin-candidates
description: "Given a LinkedIn job posting ID and Workday business unit, retrieve new candidate applications from LinkedIn Recruiter and create candidate profiles in Workday HCM for review."
inputParameters:
- name: linkedin_job_id
in: body
type: string
description: "LinkedIn job posting ID."
- name: business_unit
in: body
type: string
description: "Workday business unit code for candidate placement."
steps:
- name: get-candidates
type: call
call: "linkedin-jobs.get-applicants"
with:
jobId: "{{linkedin_job_id}}"
- name: create-wd-candidates
type: call
call: "workday-recruit.create-candidates"
with:
businessUnit: "{{business_unit}}"
applicants: "{{get-candidates.applicants}}"
consumes:
- type: http
namespace: linkedin-jobs
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: applicants
path: "/jobApplications"
inputParameters:
- name: jobId
in: query
operations:
- name: get-applicants
method: GET
- type: http
namespace: workday-recruit
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: candidates
path: "/iqvia/candidates"
operations:
- name: create-candidates
method: POST
Refreshes attribution from HubSpot and Salesforce to Snowflake, updating Power BI.
naftiko: "0.5"
info:
label: "Marketing Attribution Pipeline Refresh"
description: "Refreshes attribution from HubSpot and Salesforce to Snowflake, updating Power BI."
tags:
- marketing
- hubspot
- salesforce
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: marketing-ops
port: 8080
tools:
- name: marketing-attribution-pipeline-refresh
description: "Refreshes attribution from HubSpot and Salesforce to Snowflake, updating Power BI."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: search-contacts
type: call
call: "hubspot.search"
with:
query: "{{search_term}}"
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts"
operations:
- name: search
method: POST
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
Lists members of an Entra security group.
naftiko: "0.5"
info:
label: "Microsoft Entra Group Membership"
description: "Lists members of an Entra security group."
tags:
- identity
- microsoft-entra
capability:
exposes:
- type: mcp
namespace: identity-groups
port: 8080
tools:
- name: list-group-members
description: "List Entra group members."
inputParameters:
- name: group_id
in: body
type: string
description: "Group ID."
call: "msgraph.get-group-members"
with:
group_id: "{{group_id}}"
outputParameters:
- name: members
type: array
mapping: "$.value"
consumes:
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: groups
path: "/groups/{{group_id}}/members"
inputParameters:
- name: group_id
in: path
operations:
- name: get-group-members
method: GET
Detects risky sign-in events in Microsoft Entra ID Protection for clinical system users and creates a ServiceNow security incident for the identity security team to investigate.
naftiko: "0.5"
info:
label: "Microsoft Entra Identity Risk to ServiceNow Security Incident"
description: "Detects risky sign-in events in Microsoft Entra ID Protection for clinical system users and creates a ServiceNow security incident for the identity security team to investigate."
tags:
- security
- identity
- microsoft-entra
- servicenow
- clinical-systems
capability:
exposes:
- type: mcp
namespace: identity-risk-ops
port: 8080
tools:
- name: handle-identity-risk-event
description: "Given a Microsoft Entra risk detection ID, retrieve risky sign-in details from Microsoft Graph and create a ServiceNow security incident for the IQVIA identity security team."
inputParameters:
- name: risk_detection_id
in: body
type: string
description: "Microsoft Entra ID risk detection ID."
steps:
- name: get-risk-event
type: call
call: "graph-risk.get-risk-detection"
with:
riskDetectionId: "{{risk_detection_id}}"
- name: create-security-incident
type: call
call: "servicenow-identity.create-incident"
with:
short_description: "Identity risk: {{get-risk-event.userDisplayName}} — {{get-risk-event.riskEventType}}"
category: "security"
urgency: "2"
description: "UPN: {{get-risk-event.userPrincipalName}} | Risk level: {{get-risk-event.riskLevel}} | IP: {{get-risk-event.ipAddress}} | Detection: {{risk_detection_id}}"
consumes:
- type: http
namespace: graph-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: risk-detections
path: "/identityProtection/riskDetections/{{riskDetectionId}}"
inputParameters:
- name: riskDetectionId
in: path
operations:
- name: get-risk-detection
method: GET
- type: http
namespace: servicenow-identity
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Checks user account status in Entra ID.
naftiko: "0.5"
info:
label: "Microsoft Entra User Status"
description: "Checks user account status in Entra ID."
tags:
- identity
- microsoft-entra
capability:
exposes:
- type: mcp
namespace: identity-status
port: 8080
tools:
- name: check-user-status
description: "Check Entra user."
inputParameters:
- name: upn
in: body
type: string
description: "UPN."
call: "msgraph.get-user"
with:
upn: "{{upn}}"
outputParameters:
- name: enabled
type: boolean
mapping: "$.accountEnabled"
consumes:
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{upn}}"
inputParameters:
- name: upn
in: path
operations:
- name: get-user
method: GET
Onboards pharma clients by creating Salesforce accounts, provisioning Snowflake access, and notifying via Teams.
naftiko: "0.5"
info:
label: "Pharma Client Onboarding Orchestrator"
description: "Onboards pharma clients by creating Salesforce accounts, provisioning Snowflake access, and notifying via Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pharma-ops
port: 8080
tools:
- name: pharma-client-onboarding-orchestrator
description: "Onboards pharma clients by creating Salesforce accounts, provisioning Snowflake access, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Pharma Client Onboarding Orchestrator completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Orchestrates analytics by loading Snowflake data, refreshing Power BI, and posting to Teams.
naftiko: "0.5"
info:
label: "Power BI Clinical Analytics Orchestrator"
description: "Orchestrates analytics by loading Snowflake data, refreshing Power BI, and posting to Teams."
tags:
- analytics
- clinical
- snowflake
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: power-ops
port: 8080
tools:
- name: power-bi-clinical-analytics-orchestrator
description: "Orchestrates analytics by loading Snowflake data, refreshing Power BI, and posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: refresh-dashboard
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "$secrets.dashboard_dataset_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Power BI Clinical Analytics Orchestrator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- 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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers a Power BI dataset refresh for the pharmaceutical sales analytics workspace and posts a distribution link to the IQVIA commercial teams Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Power BI Pharma Sales Analytics Refresh"
description: "Triggers a Power BI dataset refresh for the pharmaceutical sales analytics workspace and posts a distribution link to the IQVIA commercial teams Microsoft Teams channel."
tags:
- analytics
- reporting
- power-bi
- microsoft-teams
- pharma
capability:
exposes:
- type: mcp
namespace: pharma-analytics
port: 8080
tools:
- name: refresh-pharma-dashboard
description: "Trigger a Power BI pharma sales dataset refresh and post the updated dashboard URL to the designated Microsoft Teams commercial analytics channel."
inputParameters:
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for the pharma sales analytics workspace."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for commercial analytics distribution."
steps:
- name: refresh-dataset
type: call
call: "powerbi.refresh-dataset"
with:
datasetId: "{{powerbi_dataset_id}}"
- name: notify-channel
type: call
call: "msteams-analytics.post-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Pharma Sales Analytics dashboard has been refreshed and is ready for review."
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/{{datasetId}}/refreshes"
inputParameters:
- name: datasetId
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: msteams-analytics
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Checks Power BI dataset refresh status.
naftiko: "0.5"
info:
label: "Power BI Report Refresh Status"
description: "Checks Power BI dataset refresh status."
tags:
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: analytics-refresh
port: 8080
tools:
- name: check-refresh
description: "Check refresh status."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Dataset ID."
call: "powerbi.get-refresh-history"
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: refresh-history
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh-history
method: GET
Monitors real-world data ingestion pipeline metrics in Datadog and creates a Jira data engineering ticket when row completeness or latency thresholds are breached.
naftiko: "0.5"
info:
label: "Real-World Data Pipeline Quality Alert"
description: "Monitors real-world data ingestion pipeline metrics in Datadog and creates a Jira data engineering ticket when row completeness or latency thresholds are breached."
tags:
- data
- analytics
- datadog
- jira
- monitoring
- real-world-data
capability:
exposes:
- type: mcp
namespace: rwd-quality
port: 8080
tools:
- name: alert-rwd-pipeline-quality
description: "Given a Datadog monitor ID for a real-world data pipeline and a completeness threshold, check current metrics and create a Jira data engineering bug if quality falls below threshold."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID for the RWD pipeline quality check."
- name: pipeline_name
in: body
type: string
description: "Name of the real-world data ingestion pipeline."
steps:
- name: get-monitor-status
type: call
call: "datadog-rwd.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-data-bug
type: call
call: "jira-data.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "RWD pipeline quality alert: {{pipeline_name}}"
description: "Monitor: {{monitor_id}} | Status: {{get-monitor-status.overall_state}} | Pipeline: {{pipeline_name}}"
consumes:
- type: http
namespace: datadog-rwd
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: jira-data
baseUri: "https://iqvia.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
Remediates RWD quality issues by identifying Snowflake failures, creating Jira tickets, and alerting via Teams.
naftiko: "0.5"
info:
label: "Real World Data Quality Remediation"
description: "Remediates RWD quality issues by identifying Snowflake failures, creating Jira tickets, and alerting via Teams."
tags:
- data-quality
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: real-ops
port: 8080
tools:
- name: real-world-data-quality-remediation
description: "Remediates RWD quality issues by identifying Snowflake failures, creating Jira tickets, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Real World Data Quality Remediation follow-up"
issue_type: "Task"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Real World Data Quality Remediation completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: jira
baseUri: "https://iqvia.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks submissions by querying Snowflake, updating SharePoint, and notifying regulatory via Teams.
naftiko: "0.5"
info:
label: "Regulatory Submission Timeline Tracker"
description: "Tracks submissions by querying Snowflake, updating SharePoint, and notifying regulatory via Teams."
tags:
- regulatory
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: regulatory-ops
port: 8080
tools:
- name: regulatory-submission-timeline-tracker
description: "Tracks submissions by querying Snowflake, updating SharePoint, and notifying regulatory via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: get-documents
type: call
call: "sharepoint.list-items"
with:
site_id: "$secrets.default_site_id"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Regulatory Submission Timeline Tracker completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drives
path: "/sites/{{site_id}}/drives"
inputParameters:
- name: site_id
in: path
operations:
- name: list-items
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Analyzes ROI from Salesforce and HubSpot data in Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Salesforce Campaign ROI Analysis"
description: "Analyzes ROI from Salesforce and HubSpot data in Snowflake, posting to Teams."
tags:
- marketing
- salesforce
- hubspot
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-campaign-roi-analysis
description: "Analyzes ROI from Salesforce and HubSpot data in Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: search-contacts
type: call
call: "hubspot.search"
with:
query: "{{search_term}}"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Campaign ROI Analysis completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts"
operations:
- name: search
method: POST
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Salesforce for clinical trial sponsor account activity metrics and generates an account health score. Posts a digest of at-risk accounts to the account management Teams channel.
naftiko: "0.5"
info:
label: "Salesforce Clinical Trial Account Health Score"
description: "Queries Salesforce for clinical trial sponsor account activity metrics and generates an account health score. Posts a digest of at-risk accounts to the account management Teams channel."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- customer-success
- clinical-trials
capability:
exposes:
- type: mcp
namespace: account-health
port: 8080
tools:
- name: digest-account-health
description: "Given a Salesforce account type filter and a Microsoft Teams channel ID, calculate health scores for clinical trial sponsor accounts with low engagement and post an at-risk digest to Teams."
inputParameters:
- name: account_type
in: body
type: string
description: "Salesforce account type to filter, e.g. Clinical Sponsor."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the at-risk account digest."
steps:
- name: query-accounts
type: call
call: "salesforce-health.query-accounts"
with:
accountType: "{{account_type}}"
- name: post-health-digest
type: call
call: "msteams-accounts.post-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Account Health Digest: {{query-accounts.at_risk_count}} {{account_type}} accounts at risk. Review needed for renewal pipeline."
consumes:
- type: http
namespace: salesforce-health
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-accounts
method: GET
- type: http
namespace: msteams-accounts
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Manages contracts by tracking Salesforce milestones, updating Snowflake, and notifying via Teams.
naftiko: "0.5"
info:
label: "Salesforce Contract Lifecycle Manager"
description: "Manages contracts by tracking Salesforce milestones, updating Snowflake, and notifying via Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-contract-lifecycle-manager
description: "Manages contracts by tracking Salesforce milestones, updating Snowflake, and notifying via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Contract Lifecycle Manager completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Identifies Salesforce contracts approaching renewal within 90 days and enrolls associated contacts in a HubSpot renewal nurture email sequence.
naftiko: "0.5"
info:
label: "Salesforce Contract Renewal Alert to HubSpot Sequence"
description: "Identifies Salesforce contracts approaching renewal within 90 days and enrolls associated contacts in a HubSpot renewal nurture email sequence."
tags:
- sales
- marketing
- salesforce
- hubspot
- contract-management
capability:
exposes:
- type: mcp
namespace: renewal-automation
port: 8080
tools:
- name: trigger-renewal-sequence
description: "Given a Salesforce contract ID with an upcoming renewal date and a HubSpot workflow ID, retrieve the contract's contacts and enroll them in the renewal nurture sequence."
inputParameters:
- name: contract_id
in: body
type: string
description: "Salesforce contract record ID."
- name: hubspot_workflow_id
in: body
type: string
description: "HubSpot workflow ID for the renewal nurture sequence."
steps:
- name: get-contract-contacts
type: call
call: "salesforce-contract.get-contract"
with:
contract_id: "{{contract_id}}"
- name: enroll-in-sequence
type: call
call: "hubspot-renewal.enroll-contact"
with:
workflowId: "{{hubspot_workflow_id}}"
email: "{{get-contract-contacts.primary_contact_email}}"
consumes:
- type: http
namespace: salesforce-contract
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/sobjects/Contract/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: hubspot-renewal
baseUri: "https://api.hubapi.com/automation/v2"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: enrollments
path: "/workflows/{{workflowId}}/enrollments/contacts/{{email}}"
inputParameters:
- name: workflowId
in: path
- name: email
in: path
operations:
- name: enroll-contact
method: POST
Enriches Salesforce pharmaceutical customer account records with real-world data signals from IQVIA's analytics platform, updating commercial potential and therapeutic area tags.
naftiko: "0.5"
info:
label: "Salesforce CRM Pharma Account Enrichment"
description: "Enriches Salesforce pharmaceutical customer account records with real-world data signals from IQVIA's analytics platform, updating commercial potential and therapeutic area tags."
tags:
- sales
- crm
- salesforce
- data-enrichment
- pharma
capability:
exposes:
- type: mcp
namespace: pharma-account-enrichment
port: 8080
tools:
- name: enrich-pharma-account
description: "Given a Salesforce account ID and a target therapeutic area, retrieve prescriber potential and market share data and update the Salesforce account with commercial insights."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID for the pharmaceutical customer."
- name: therapeutic_area
in: body
type: string
description: "Therapeutic area to look up, e.g. Oncology."
steps:
- name: get-account
type: call
call: "salesforce-acct.get-account"
with:
account_id: "{{account_id}}"
- name: update-account
type: call
call: "salesforce-update.update-account"
with:
account_id: "{{account_id}}"
Therapeutic_Area__c: "{{therapeutic_area}}"
Commercial_Potential__c: "{{get-account.prescriber_potential}}"
consumes:
- type: http
namespace: salesforce-acct
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: salesforce-update
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: account-update
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Qualifies leads from Salesforce, enriching with Snowflake data, and notifying sales via Teams.
naftiko: "0.5"
info:
label: "Salesforce Lead Qualification Orchestrator"
description: "Qualifies leads from Salesforce, enriching with Snowflake data, and notifying sales via Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-lead-qualification-orchestrator
description: "Qualifies leads from Salesforce, enriching with Snowflake data, and notifying sales via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Lead Qualification Orchestrator completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves Salesforce opportunity details.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Lookup"
description: "Retrieves Salesforce opportunity details."
tags:
- commercial
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-opp
port: 8080
tools:
- name: get-opportunity
description: "Look up opportunity."
inputParameters:
- name: opp_id
in: body
type: string
description: "Opportunity ID."
call: "salesforce.get-opportunity"
with:
id: "{{opp_id}}"
outputParameters:
- name: stage
type: string
mapping: "$.StageName"
- name: amount
type: string
mapping: "$.Amount"
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.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
When a Salesforce pharmaceutical opportunity advances to Proposal stage, triggers a targeted HubSpot marketing email sequence to the associated contacts.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Stage Change to HubSpot Workflow"
description: "When a Salesforce pharmaceutical opportunity advances to Proposal stage, triggers a targeted HubSpot marketing email sequence to the associated contacts."
tags:
- sales
- marketing
- salesforce
- hubspot
- pharma
capability:
exposes:
- type: mcp
namespace: sales-marketing-sync
port: 8080
tools:
- name: trigger-proposal-nurture
description: "Given a Salesforce opportunity ID that has reached Proposal stage, retrieve associated contacts and enroll them in the targeted HubSpot nurture sequence for pharmaceutical prospects."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID."
- name: hubspot_workflow_id
in: body
type: string
description: "HubSpot workflow enrollment ID for the proposal nurture sequence."
steps:
- name: get-opportunity
type: call
call: "salesforce-opp.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: enroll-contacts
type: call
call: "hubspot-enroll.enroll-in-workflow"
with:
workflowId: "{{hubspot_workflow_id}}"
email: "{{get-opportunity.primary_contact_email}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: hubspot-enroll
baseUri: "https://api.hubapi.com/automation/v2"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: enrollments
path: "/workflows/{{workflowId}}/enrollments/contacts/{{email}}"
inputParameters:
- name: workflowId
in: path
- name: email
in: path
operations:
- name: enroll-in-workflow
method: POST
Retrieves pharma client account from Salesforce.
naftiko: "0.5"
info:
label: "Salesforce Pharma Account Lookup"
description: "Retrieves pharma client account from Salesforce."
tags:
- commercial
- salesforce
capability:
exposes:
- type: mcp
namespace: crm-pharma
port: 8080
tools:
- name: get-pharma-account
description: "Look up pharma account."
inputParameters:
- name: account_id
in: body
type: string
description: "Account ID."
call: "salesforce.get-account"
with:
id: "{{account_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: type
type: string
mapping: "$.Type"
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
Prepares QBR materials from Salesforce, Snowflake analytics, and posts to Teams.
naftiko: "0.5"
info:
label: "Salesforce Quarterly Business Review Prep"
description: "Prepares QBR materials from Salesforce, Snowflake analytics, and posts to Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-quarterly-business-review-prep
description: "Prepares QBR materials from Salesforce, Snowflake analytics, and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Quarterly Business Review Prep completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Generates renewal digests from Salesforce and Snowflake, posting to Teams.
naftiko: "0.5"
info:
label: "Salesforce Renewal Pipeline Digest"
description: "Generates renewal digests from Salesforce and Snowflake, posting to Teams."
tags:
- commercial
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: salesforce-ops
port: 8080
tools:
- name: salesforce-renewal-pipeline-digest
description: "Generates renewal digests from Salesforce and Snowflake, posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-sf-data
type: call
call: "salesforce.query"
with:
q: "SELECT Id, Name FROM Account LIMIT 10"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Salesforce Renewal Pipeline Digest completed successfully."
consumes:
- type: http
namespace: salesforce
baseUri: "https://login.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: sobjects
path: "/sobjects/Account"
operations:
- name: query
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Looks up a SAP S/4HANA purchase order by number and returns header status, vendor name, total amount, and currency. Used by procurement agents to verify PO state.
naftiko: "0.5"
info:
label: "SAP S/4HANA PO Status Lookup"
description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor name, total amount, and currency. Used by procurement agents to verify PO state."
tags:
- finance
- erp
- sap-s4hana
- procurement
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, return the order header status, vendor name, total amount, and document currency from SAP S/4HANA."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number, e.g. 4500001234."
call: "sap-po.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-po
baseUri: "https://iqvia-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 a vendor invoice from SAP S/4HANA awaiting approval and creates a ServiceNow finance request for the appropriate cost center manager to review.
naftiko: "0.5"
info:
label: "SAP S/4HANA Vendor Invoice to ServiceNow Finance Request"
description: "Retrieves a vendor invoice from SAP S/4HANA awaiting approval and creates a ServiceNow finance request for the appropriate cost center manager to review."
tags:
- finance
- erp
- sap-s4hana
- servicenow
- accounts-payable
capability:
exposes:
- type: mcp
namespace: ap-workflow
port: 8080
tools:
- name: route-invoice-for-approval
description: "Given a SAP vendor invoice document number and fiscal year, retrieve invoice details and create a ServiceNow finance approval request for the cost center manager."
inputParameters:
- name: invoice_doc
in: body
type: string
description: "SAP supplier invoice document number."
- name: fiscal_year
in: body
type: string
description: "Fiscal year, e.g. 2025."
steps:
- name: get-invoice
type: call
call: "sap-s4.get-invoice"
with:
SupplierInvoice: "{{invoice_doc}}"
FiscalYear: "{{fiscal_year}}"
- name: create-approval-request
type: call
call: "servicenow-fin.create-request"
with:
short_description: "Invoice approval: {{invoice_doc}} — {{get-invoice.Supplier}}"
category: "finance_approval"
description: "Amount: {{get-invoice.InvoiceGrossAmount}} {{get-invoice.DocumentCurrency}} | Vendor: {{get-invoice.Supplier}}"
assignment_group: "Finance_AP"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://iqvia-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice(SupplierInvoice='{{SupplierInvoice}}',FiscalYear='{{FiscalYear}}')"
inputParameters:
- name: SupplierInvoice
in: path
- name: FiscalYear
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: servicenow-fin
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
Aggregates pending ServiceNow change requests for the weekly CAB meeting and posts a structured digest to the Microsoft Teams governance channel.
naftiko: "0.5"
info:
label: "ServiceNow Change Advisory Board Digest to Teams"
description: "Aggregates pending ServiceNow change requests for the weekly CAB meeting and posts a structured digest to the Microsoft Teams governance channel."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: cab-ops
port: 8080
tools:
- name: post-cab-digest
description: "Retrieve all ServiceNow change requests in Scheduled or Pending Approval state for the next 7 days and post a structured CAB digest to the designated Microsoft Teams channel."
inputParameters:
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the CAB digest post."
steps:
- name: list-pending-changes
type: call
call: "servicenow-cab.list-changes"
with:
state: "scheduled"
- name: post-digest
type: call
call: "msteams-cab.post-message"
with:
channel_id: "{{teams_channel_id}}"
message: "CAB Weekly Digest: {{list-pending-changes.total}} changes. Critical: {{list-pending-changes.critical_count}} | Standard: {{list-pending-changes.standard_count}}"
consumes:
- type: http
namespace: servicenow-cab
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: changes
path: "/table/change_request"
inputParameters:
- name: state
in: query
operations:
- name: list-changes
method: GET
- type: http
namespace: msteams-cab
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves a ServiceNow change request.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Lookup"
description: "Retrieves a ServiceNow change request."
tags:
- it-service-management
- servicenow
capability:
exposes:
- type: mcp
namespace: itsm-change
port: 8080
tools:
- name: get-change-request
description: "Look up change request."
inputParameters:
- name: change_number
in: body
type: string
description: "Change number."
call: "servicenow.get-change"
with:
number: "{{change_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: risk
type: string
mapping: "$.result.risk"
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.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: get-change
method: GET
Retrieves incident details from ServiceNow.
naftiko: "0.5"
info:
label: "ServiceNow Incident Lookup"
description: "Retrieves incident details from ServiceNow."
tags:
- it-service-management
- servicenow
capability:
exposes:
- type: mcp
namespace: itsm-incident
port: 8080
tools:
- name: get-incident
description: "Look up ServiceNow incident."
inputParameters:
- name: number
in: body
type: string
description: "Incident number."
call: "servicenow.get-incident"
with:
number: "{{number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
When a P1 incident is opened for a clinical data system in ServiceNow, queries Datadog for correlated infrastructure alerts and enriches the incident with system health context.
naftiko: "0.5"
info:
label: "ServiceNow ITSM Incident Triage for Clinical Systems"
description: "When a P1 incident is opened for a clinical data system in ServiceNow, queries Datadog for correlated infrastructure alerts and enriches the incident with system health context."
tags:
- itsm
- observability
- servicenow
- datadog
- clinical-systems
- incident-response
capability:
exposes:
- type: mcp
namespace: clinical-itsm
port: 8080
tools:
- name: triage-clinical-incident
description: "Given a ServiceNow incident number and the name of the affected clinical system, fetch correlated Datadog monitors and update the incident with alert context for faster resolution."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number, e.g. INC0098765."
- name: system_name
in: body
type: string
description: "Affected clinical system name as tagged in Datadog."
steps:
- name: get-incident
type: call
call: "servicenow-read.get-incident"
with:
number: "{{incident_number}}"
- name: get-dd-alerts
type: call
call: "datadog-clinical.list-monitors"
with:
tags: "service:{{system_name}}"
- name: update-incident
type: call
call: "servicenow-write.update-incident"
with:
sys_id: "{{get-incident.sys_id}}"
work_notes: "Datadog correlated alerts: {{get-dd-alerts.alert_ids}} | Monitor count: {{get-dd-alerts.total}}"
consumes:
- type: http
namespace: servicenow-read
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: datadog-clinical
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"
inputParameters:
- name: tags
in: query
operations:
- name: list-monitors
method: GET
- type: http
namespace: servicenow-write
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incident-update
path: "/table/incident/{{sys_id}}"
inputParameters:
- name: sys_id
in: path
operations:
- name: update-incident
method: PATCH
Generates SLA digests from ServiceNow, enriching in Snowflake, and posting to Teams.
naftiko: "0.5"
info:
label: "ServiceNow SLA Performance Digest"
description: "Generates SLA digests from ServiceNow, enriching in Snowflake, and posting to Teams."
tags:
- it-service-management
- servicenow
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: servicenow-ops
port: 8080
tools:
- name: servicenow-sla-performance-digest
description: "Generates SLA digests from ServiceNow, enriching in Snowflake, and posting to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "ServiceNow SLA Performance Digest action required"
category: "automated"
assigned_group: "Operations"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "ServiceNow SLA Performance Digest completed successfully."
consumes:
- type: http
namespace: servicenow
baseUri: "https://iqvia.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: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Searches SharePoint documents by keyword.
naftiko: "0.5"
info:
label: "SharePoint Site Document Search"
description: "Searches SharePoint documents by keyword."
tags:
- collaboration
- sharepoint
capability:
exposes:
- type: mcp
namespace: collab-search
port: 8080
tools:
- name: search-documents
description: "Search SharePoint."
inputParameters:
- name: site_id
in: body
type: string
description: "Site ID."
- name: query
in: body
type: string
description: "Query."
call: "sharepoint.search"
with:
site_id: "{{site_id}}"
query: "{{query}}"
outputParameters:
- name: results
type: array
mapping: "$.value"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: search
path: "/sites/{{site_id}}/drive/root/search(q='{{query}}')"
inputParameters:
- name: site_id
in: path
operations:
- name: search
method: GET
Returns row count for a clinical data table.
naftiko: "0.5"
info:
label: "Snowflake Clinical Data Count"
description: "Returns row count for a clinical data table."
tags:
- data-engineering
- snowflake
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: count-clinical-rows
description: "Count clinical rows."
inputParameters:
- name: table_name
in: body
type: string
description: "Table name."
call: "snowflake.run-query"
with:
statement: "SELECT COUNT(*) FROM {{table_name}}"
outputParameters:
- name: count
type: integer
mapping: "$.data[0][0]"
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Generates lineage reports from Snowflake metadata and posts to Teams.
naftiko: "0.5"
info:
label: "Snowflake Data Lineage Report"
description: "Generates lineage reports from Snowflake metadata and posts to Teams."
tags:
- data-governance
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: snowflake-ops
port: 8080
tools:
- name: snowflake-data-lineage-report
description: "Generates lineage reports from Snowflake metadata and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Snowflake Data Lineage Report completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks real-world data pipeline status.
naftiko: "0.5"
info:
label: "Snowflake RWD Pipeline Status"
description: "Checks real-world data pipeline status."
tags:
- data-engineering
- snowflake
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: check-rwd-pipeline
description: "Check RWD pipeline."
inputParameters:
- name: pipeline
in: body
type: string
description: "Pipeline name."
call: "snowflake.run-query"
with:
statement: "SELECT status FROM pipelines.runs WHERE name='{{pipeline}}' ORDER BY completed_at DESC LIMIT 1"
outputParameters:
- name: status
type: string
mapping: "$.data[0][0]"
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Posts notification to Teams channel.
naftiko: "0.5"
info:
label: "Teams Channel Notification"
description: "Posts notification to Teams channel."
tags:
- collaboration
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: collab-notify
port: 8080
tools:
- name: send-notification
description: "Post Teams notification."
inputParameters:
- name: team_id
in: body
type: string
description: "Team ID."
- name: channel_id
in: body
type: string
description: "Channel ID."
- name: message
in: body
type: string
description: "Text."
call: "msteams.post-channel-message"
with:
team_id: "{{team_id}}"
channel_id: "{{channel_id}}"
body: "{{message}}"
outputParameters:
- name: id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Terraform Cloud plan is created for a clinical data environment, checks estimated cost and routes to ServiceNow for approval if above the compliance threshold.
naftiko: "0.5"
info:
label: "Terraform Cloud Infrastructure Provisioning Governance"
description: "When a Terraform Cloud plan is created for a clinical data environment, checks estimated cost and routes to ServiceNow for approval if above the compliance threshold."
tags:
- cloud
- infrastructure
- terraform
- servicenow
- governance
- finops
capability:
exposes:
- type: mcp
namespace: infra-governance
port: 8080
tools:
- name: gate-clinical-infrastructure
description: "Given a Terraform Cloud run ID, fetch the cost estimate and workspace metadata and route to ServiceNow for compliance approval if the projected monthly cost exceeds the clinical environment budget."
inputParameters:
- name: run_id
in: body
type: string
description: "Terraform Cloud run ID for the clinical environment plan."
- name: budget_limit_usd
in: body
type: number
description: "Monthly budget limit in USD for clinical environment infrastructure."
steps:
- name: get-cost-estimate
type: call
call: "terraform.get-cost-estimate"
with:
runId: "{{run_id}}"
- name: create-compliance-approval
type: call
call: "servicenow-tf.create-approval"
with:
short_description: "Infrastructure approval: Clinical env — ${{get-cost-estimate.proposed_monthly_cost}}/mo"
category: "cloud_governance"
assignment_group: "IT_Compliance"
description: "Run: {{run_id}} | Estimated monthly cost: ${{get-cost-estimate.proposed_monthly_cost}} | Limit: ${{budget_limit_usd}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: cost-estimates
path: "/runs/{{runId}}/cost-estimate"
inputParameters:
- name: runId
in: path
operations:
- name: get-cost-estimate
method: GET
- type: http
namespace: servicenow-tf
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: approvals
path: "/table/sysapproval_approver"
operations:
- name: create-approval
method: POST
Checks compliance by scanning Terraform state, comparing Snowflake baselines, and creating ServiceNow findings.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Compliance Check"
description: "Checks compliance by scanning Terraform state, comparing Snowflake baselines, and creating ServiceNow findings."
tags:
- infrastructure
- compliance
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: terraform-ops
port: 8080
tools:
- name: terraform-infrastructure-compliance-check
description: "Checks compliance by scanning Terraform state, comparing Snowflake baselines, and creating ServiceNow findings."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Terraform Infrastructure Compliance Check action required"
category: "automated"
assigned_group: "Operations"
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.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
Checks Terraform Cloud workspace status.
naftiko: "0.5"
info:
label: "Terraform Workspace Status"
description: "Checks Terraform Cloud workspace status."
tags:
- infrastructure
- terraform
capability:
exposes:
- type: mcp
namespace: infra-iac
port: 8080
tools:
- name: check-workspace
description: "Check workspace."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Workspace ID."
call: "terraform.get-workspace"
with:
workspace_id: "{{workspace_id}}"
outputParameters:
- name: status
type: string
mapping: "$.data.attributes.execution-mode"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/workspaces/{{workspace_id}}"
inputParameters:
- name: workspace_id
in: path
operations:
- name: get-workspace
method: GET
Monitors vendor feeds by checking Snowflake logs, creating ServiceNow tickets, and alerting via Teams.
naftiko: "0.5"
info:
label: "Vendor Data Feed Monitoring"
description: "Monitors vendor feeds by checking Snowflake logs, creating ServiceNow tickets, and alerting via Teams."
tags:
- data-engineering
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: vendor-ops
port: 8080
tools:
- name: vendor-data-feed-monitoring
description: "Monitors vendor feeds by checking Snowflake logs, creating ServiceNow tickets, and alerting via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Vendor Data Feed Monitoring action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Vendor Data Feed Monitoring completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Generates scorecards from Snowflake KPIs and notifies procurement via Teams.
naftiko: "0.5"
info:
label: "Vendor Performance Scorecard Generator"
description: "Generates scorecards from Snowflake KPIs and notifies procurement via Teams."
tags:
- procurement
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: vendor-ops
port: 8080
tools:
- name: vendor-performance-scorecard-generator
description: "Generates scorecards from Snowflake KPIs and notifies procurement via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Vendor Performance Scorecard Generator completed successfully."
consumes:
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves employee profile from Workday by worker ID.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee profile from Workday by worker ID."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-employee
port: 8080
tools:
- name: get-employee
description: "Look up Workday employee."
inputParameters:
- name: worker_id
in: body
type: string
description: "The worker ID."
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: name
type: string
mapping: "$.displayName"
- name: department
type: string
mapping: "$.department"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/iqvia/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
When an employee termination is recorded in Workday, opens a ServiceNow offboarding task, revokes Salesforce CRM access, and files a GitHub access removal issue.
naftiko: "0.5"
info:
label: "Workday Employee Offboarding from Clinical Systems"
description: "When an employee termination is recorded in Workday, opens a ServiceNow offboarding task, revokes Salesforce CRM access, and files a GitHub access removal issue."
tags:
- hr
- offboarding
- workday
- servicenow
- salesforce
- github
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, open a ServiceNow offboarding task, deactivate the Salesforce user, and create a GitHub issue to revoke all repository access."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
- name: termination_date
in: body
type: string
description: "Effective termination date in YYYY-MM-DD format."
- name: employee_email
in: body
type: string
description: "Corporate email of the departing employee."
steps:
- name: open-offboard-task
type: call
call: "servicenow-off.create-task"
with:
short_description: "Offboarding: {{employee_id}} effective {{termination_date}}"
category: "hr_offboarding"
assignment_group: "IT_Security"
- name: deactivate-sf-user
type: call
call: "salesforce-user.deactivate-user"
with:
email: "{{employee_email}}"
- name: file-github-issue
type: call
call: "github-access.create-issue"
with:
owner: "iqvia"
repo: "access-management"
title: "Revoke access: {{employee_email}} (terminated {{termination_date}})"
body: "Employee {{employee_id}} terminated. Revoke all repository and clinical systems access."
consumes:
- type: http
namespace: servicenow-off
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: salesforce-user
baseUri: "https://iqvia.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User"
operations:
- name: deactivate-user
method: PATCH
- type: http
namespace: github-access
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: issues
path: "/repos/{{owner}}/{{repo}}/issues"
inputParameters:
- name: owner
in: path
- name: repo
in: path
operations:
- name: create-issue
method: POST
Generates forecasts from Workday data, Snowflake trends, and posts to Teams.
naftiko: "0.5"
info:
label: "Workday Headcount Forecast Report"
description: "Generates forecasts from Workday data, Snowflake trends, and posts to Teams."
tags:
- hr
- workforce-planning
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-headcount-forecast-report
description: "Generates forecasts from Workday data, Snowflake trends, and posts to Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Headcount Forecast Report completed successfully."
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Assigns training from Workday roles and notifies employees via Teams.
naftiko: "0.5"
info:
label: "Workday Learning Assignment Orchestrator"
description: "Assigns training from Workday roles and notifies employees via Teams."
tags:
- hr
- learning
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-learning-assignment-orchestrator
description: "Assigns training from Workday roles and notifies employees via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Learning Assignment Orchestrator completed successfully."
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new life sciences employee is created in Workday, provisions access in ServiceNow, sends a Teams welcome message, and creates a data access request in the clinical systems portal.
naftiko: "0.5"
info:
label: "Workday New Hire Provisioning for Clinical Data Access"
description: "When a new life sciences employee is created in Workday, provisions access in ServiceNow, sends a Teams welcome message, and creates a data access request in the clinical systems portal."
tags:
- hr
- onboarding
- workday
- servicenow
- clinical-systems
- access-management
capability:
exposes:
- type: mcp
namespace: clinical-onboarding
port: 8080
tools:
- name: provision-clinical-access
description: "Given a Workday employee ID, start date, and clinical role, open a ServiceNow onboarding ticket, send a Teams welcome message, and create a clinical data access request."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
- name: clinical_role
in: body
type: string
description: "Clinical role for access provisioning, e.g. Data_Analyst, Clinical_Operations."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
workerId: "{{employee_id}}"
- name: open-onboard-ticket
type: call
call: "servicenow-onboard.create-task"
with:
short_description: "Clinical access onboarding: {{get-worker.preferredName}} — Role: {{clinical_role}}"
category: "clinical_onboarding"
assignment_group: "Clinical_IT"
- name: send-welcome-msg
type: call
call: "msteams-onboard.send-message"
with:
recipient_upn: "{{get-worker.workEmail}}"
message: "Welcome to IQVIA! Your clinical data access request is being processed. Ticket: {{open-onboard-ticket.number}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/iqvia/workers/{{workerId}}"
inputParameters:
- name: workerId
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow-onboard
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-onboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.graph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Revokes departing employee access across Workday, ServiceNow, and logs via Teams.
naftiko: "0.5"
info:
label: "Workday Offboarding Access Revocation"
description: "Revokes departing employee access across Workday, ServiceNow, and logs via Teams."
tags:
- hr
- offboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-offboarding-access-revocation
description: "Revokes departing employee access across Workday, ServiceNow, and logs via Teams."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Workday Offboarding Access Revocation action required"
category: "automated"
assigned_group: "Operations"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
team_id: "$secrets.ops_team_id"
channel_id: "$secrets.ops_channel_id"
body: "Workday Offboarding Access Revocation completed successfully."
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://iqvia.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Exports a headcount snapshot by department and cost center from Workday HCM for use in payroll validation and finance reporting.
naftiko: "0.5"
info:
label: "Workday Payroll Headcount Snapshot"
description: "Exports a headcount snapshot by department and cost center from Workday HCM for use in payroll validation and finance reporting."
tags:
- hr
- finance
- workday
- payroll
- reporting
capability:
exposes:
- type: mcp
namespace: hr-payroll
port: 8080
tools:
- name: get-headcount-snapshot
description: "Returns a list of active employees grouped by department and cost center from Workday HCM. Use for payroll validation, headcount planning, and finance period-close reporting."
call: "workday-snap.get-workers"
outputParameters:
- name: employees
type: array
mapping: "$.data"
consumes:
- type: http
namespace: workday-snap
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/iqvia/workers"
operations:
- name: get-workers
method: GET
Detects payroll variances from Workday and Snowflake, creating ServiceNow tickets.
naftiko: "0.5"
info:
label: "Workday Payroll Variance Detector"
description: "Detects payroll variances from Workday and Snowflake, creating ServiceNow tickets."
tags:
- hr
- payroll
- workday
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: workday-ops
port: 8080
tools:
- name: workday-payroll-variance-detector
description: "Detects payroll variances from Workday and Snowflake, creating ServiceNow tickets."
inputParameters:
- name: request_id
in: body
type: string
description: "The request or entity identifier."
steps:
- name: get-employee-data
type: call
call: "workday.get-workers"
with:
department: "all"
- name: query-data
type: call
call: "snowflake.run-query"
with:
statement: "SELECT * FROM analytics.summary LIMIT 100"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Workday Payroll Variance Detector action required"
category: "automated"
assigned_group: "Operations"
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: "/iqvia/workers"
operations:
- name: get-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://iqvia.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://iqvia.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
Retrieves time off balance from Workday.
naftiko: "0.5"
info:
label: "Workday Time Off Balance Check"
description: "Retrieves time off balance from Workday."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-timeoff
port: 8080
tools:
- name: check-balance
description: "Check time off balance."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
call: "workday.get-time-off"
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: balance
type: string
mapping: "$.balance"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: time-off
path: "/iqvia/workers/{{worker_id}}/timeOff"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-time-off
method: GET