IQVIA Capabilities

Naftiko 0.5 capability definitions for IQVIA - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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