AbbVie Capabilities

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

Sort
Expand

When a pharmacovigilance team member logs an adverse event, creates a ServiceNow safety case, stores documentation in Box, and alerts the drug safety team in Microsoft Teams with full case context.

naftiko: "0.5"
info:
  label: "Adverse Event Reporting Pipeline"
  description: "When a pharmacovigilance team member logs an adverse event, creates a ServiceNow safety case, stores documentation in Box, and alerts the drug safety team in Microsoft Teams with full case context."
  tags:
    - pharmacovigilance
    - drug-safety
    - adverse-event
    - servicenow
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: drug-safety
      port: 8080
      tools:
        - name: report-adverse-event
          description: "Given adverse event details, create a safety case in ServiceNow, upload supporting documents to Box, and alert the drug safety team."
          inputParameters:
            - name: patient_id
              in: body
              type: string
              description: "Anonymized patient identifier."
            - name: product_name
              in: body
              type: string
              description: "AbbVie product associated with the event."
            - name: event_description
              in: body
              type: string
              description: "Description of the adverse event."
            - name: severity
              in: body
              type: string
              description: "Severity level: mild, moderate, severe, life-threatening."
            - name: reporter_email
              in: body
              type: string
              description: "Email of the reporting healthcare professional."
          steps:
            - name: create-safety-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "AE Report: {{product_name}} — {{severity}}"
                category: "pharmacovigilance"
                assigned_group: "Drug_Safety"
                description: "Patient: {{patient_id}}. Product: {{product_name}}. Severity: {{severity}}. Event: {{event_description}}. Reporter: {{reporter_email}}."
            - name: create-case-folder
              type: call
              call: "box.create-folder"
              with:
                parent_folder_id: "pharmacovigilance_root"
                folder_name: "AE_{{create-safety-case.number}}_{{product_name}}"
            - name: alert-safety-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "drug-safety-alerts"
                text: "New Adverse Event: {{product_name}} ({{severity}}). Case: {{create-safety-case.number}}. Patient: {{patient_id}}. Docs: {{create-case-folder.url}}. Reporter: {{reporter_email}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Checks certificate expiration in Kong, generates new certs via Azure Key Vault, deploys to gateway, validates via Postman, and logs in ServiceNow.

naftiko: "0.5"
info:
  label: "API Gateway Certificate Rotation"
  description: "Checks certificate expiration in Kong, generates new certs via Azure Key Vault, deploys to gateway, validates via Postman, and logs in ServiceNow."
  tags:
    - devops
    - kong
    - azure
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: api_gateway_certificate_rotation
          description: "Orchestrate api gateway certificate rotation workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: check-cert
              type: call
              call: "kong.get-certificate"
              with:
                cert_id: "{{resource_id}}"
            - name: generate-cert
              type: call
              call: "keyvault.create-certificate"
              with:
                name: "{{resource_id}}"
            - name: deploy-cert
              type: call
              call: "kong.update-certificate"
              with:
                cert_id: "{{resource_id}}"
                cert_data: "{{generate-cert.value}}"
            - name: log-rotation
              type: call
              call: "servicenow.create-record"
              with:
                table: "cert_rotations"
                cert_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST

Checks the sync status of an Argo CD application deployment. Used by DevOps teams to verify GitOps deployment health for AbbVie's containerized pharma applications.

naftiko: "0.5"
info:
  label: "Argo CD Deployment Sync Status"
  description: "Checks the sync status of an Argo CD application deployment. Used by DevOps teams to verify GitOps deployment health for AbbVie's containerized pharma applications."
  tags:
    - devops
    - gitops
    - argo
    - deployment
    - kubernetes
capability:
  exposes:
    - type: mcp
      namespace: gitops
      port: 8080
      tools:
        - name: get-sync-status
          description: "Look up the sync status of an Argo CD application."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "Argo CD application name."
          call: "argocd.get-application"
          with:
            app_name: "{{app_name}}"
  consumes:
    - type: http
      namespace: argocd
      baseUri: "https://argocd.abbvie.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argocd_token"
      resources:
        - name: applications
          path: "/applications/{{app_name}}"
          inputParameters:
            - name: app_name
              in: path
          operations:
            - name: get-application
              method: GET

Launches vulnerability scan via Qualys, runs OWASP ZAP against web apps, creates prioritized remediation tickets in Jira, and summarizes in Confluence.

naftiko: "0.5"
info:
  label: "Automated Penetration Test Orchestrator"
  description: "Launches vulnerability scan via Qualys, runs OWASP ZAP against web apps, creates prioritized remediation tickets in Jira, and summarizes in Confluence."
  tags:
    - security
    - jira
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: automated_pen_test_orchestrator
          description: "Orchestrate automated penetration test orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: run-qualys
              type: call
              call: "qualys.launch-scan"
              with:
                target: "{{resource_id}}"
            - name: run-zap
              type: call
              call: "zap.run-scan"
              with:
                target_url: "{{resource_id}}"
            - name: create-tickets
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Pen test findings: {{resource_id}}"
            - name: create-report
              type: call
              call: "confluence.create-page"
              with:
                space: "SEC"
                title: "Pen test: {{resource_id}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-operation
              method: POST

Retrieves metadata and a pre-signed URL for an object in an S3 bucket. Used by data teams to access research datasets and clinical data exports.

naftiko: "0.5"
info:
  label: "AWS S3 Object Retrieval"
  description: "Retrieves metadata and a pre-signed URL for an object in an S3 bucket. Used by data teams to access research datasets and clinical data exports."
  tags:
    - cloud
    - aws
    - s3
    - storage
capability:
  exposes:
    - type: mcp
      namespace: cloud-storage
      port: 8080
      tools:
        - name: get-object
          description: "Get S3 object metadata and download URL by bucket and key."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "S3 bucket name."
            - name: object_key
              in: body
              type: string
              description: "Object key path."
          call: "s3.get-object"
          with:
            bucket: "{{bucket}}"
            object_key: "{{object_key}}"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: awsSigV4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{bucket}}/{{object_key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: object_key
              in: path
          operations:
            - name: get-object
              method: GET

Provisions a new user in Azure Active Directory, assigns them to the appropriate security group, and sends credentials via Microsoft Teams direct message.

naftiko: "0.5"
info:
  label: "Azure AD User Provisioning"
  description: "Provisions a new user in Azure Active Directory, assigns them to the appropriate security group, and sends credentials via Microsoft Teams direct message."
  tags:
    - identity
    - security
    - azure-active-directory
    - microsoft-teams
    - user-provisioning
capability:
  exposes:
    - type: mcp
      namespace: identity-mgmt
      port: 8080
      tools:
        - name: provision-user
          description: "Create a new Azure AD user, assign to a security group, and send welcome credentials via Teams."
          inputParameters:
            - name: display_name
              in: body
              type: string
              description: "Full name of the new user."
            - name: user_principal_name
              in: body
              type: string
              description: "UPN for the new user (email format)."
            - name: department
              in: body
              type: string
              description: "Department the user belongs to."
            - name: security_group_id
              in: body
              type: string
              description: "Azure AD security group ID to assign the user to."
          steps:
            - name: create-user
              type: call
              call: "azuread.create-user"
              with:
                displayName: "{{display_name}}"
                userPrincipalName: "{{user_principal_name}}"
                department: "{{department}}"
            - name: add-to-group
              type: call
              call: "azuread.add-group-member"
              with:
                group_id: "{{security_group_id}}"
                member_id: "{{create-user.id}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{user_principal_name}}"
                text: "Welcome to AbbVie, {{display_name}}! Your account has been provisioned. Please set up MFA at https://aka.ms/MFASetup."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
        - name: group-members
          path: "/groups/{{group_id}}/members/$ref"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a secret value from Azure Key Vault by name and version. Used by DevOps pipelines to access configuration secrets securely.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retrieval"
  description: "Retrieves a secret value from Azure Key Vault by name and version. Used by DevOps pipelines to access configuration secrets securely."
  tags:
    - security
    - azure
    - key-vault
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-secret
          description: "Retrieve a secret from Azure Key Vault by name."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "The Key Vault name."
            - name: secret_name
              in: body
              type: string
              description: "The secret name."
          call: "keyvault.get-secret"
          with:
            vault_name: "{{vault_name}}"
            secret_name: "{{secret_name}}"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://{{vault_name}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_kv_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET

Ingests biomarker results from LIMS, maps to clinical subjects in EDC, loads into Snowflake, and publishes to the biomarker Tableau dashboard.

naftiko: "0.5"
info:
  label: "Biomarker Data Integration Pipeline"
  description: "Ingests biomarker results from LIMS, maps to clinical subjects in EDC, loads into Snowflake, and publishes to the biomarker Tableau dashboard."
  tags:
    - clinical-trials
    - lims
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: biomarker_data_integration_pipeline
          description: "Orchestrate biomarker data integration pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-results
              type: call
              call: "lims.get-assay-results"
              with:
                assay_id: "{{resource_id}}"
            - name: map-subjects
              type: call
              call: "edc.get-subject-mapping"
              with:
                assay_id: "{{resource_id}}"
            - name: load-data
              type: call
              call: "snowflake.load-data"
              with:
                source_ref: "{{get-results.data_uri}}"
                schema: "biomarkers"
            - name: refresh-dash
              type: call
              call: "tableau.refresh-extract"
              with:
                workbook_id: "biomarker_analytics"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://abbvie-tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: tableau-operation
              method: POST

Retrieves the status of a Bitbucket pipeline run. Used by development teams at AbbVie to check build and deployment progress.

naftiko: "0.5"
info:
  label: "Bitbucket Pipeline Status"
  description: "Retrieves the status of a Bitbucket pipeline run. Used by development teams at AbbVie to check build and deployment progress."
  tags:
    - devops
    - bitbucket
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: get-pipeline
          description: "Look up a Bitbucket pipeline run by repository and pipeline UUID."
          inputParameters:
            - name: repo_slug
              in: body
              type: string
              description: "The repository slug."
            - name: pipeline_uuid
              in: body
              type: string
              description: "The pipeline UUID."
          call: "bitbucket.get-pipeline"
          with:
            repo_slug: "{{repo_slug}}"
            pipeline_uuid: "{{pipeline_uuid}}"
  consumes:
    - type: http
      namespace: bitbucket
      baseUri: "https://api.bitbucket.org/2.0/repositories/abbvie"
      authentication:
        type: bearer
        token: "$secrets.bitbucket_token"
      resources:
        - name: pipelines
          path: "/{{repo_slug}}/pipelines/{{pipeline_uuid}}"
          inputParameters:
            - name: repo_slug
              in: path
            - name: pipeline_uuid
              in: path
          operations:
            - name: get-pipeline
              method: GET

Searches for documents in Box by keyword. Used by regulatory, legal, and clinical operations teams to quickly find SOPs, protocols, and submission documents stored in AbbVie's enterprise content management.

naftiko: "0.5"
info:
  label: "Box Document Search"
  description: "Searches for documents in Box by keyword. Used by regulatory, legal, and clinical operations teams to quickly find SOPs, protocols, and submission documents stored in AbbVie's enterprise content management."
  tags:
    - document-management
    - content
    - box
    - search
capability:
  exposes:
    - type: mcp
      namespace: document-mgmt
      port: 8080
      tools:
        - name: search-documents
          description: "Search Box for documents matching a keyword query."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keyword or phrase."
            - name: folder_id
              in: body
              type: string
              description: "Optional Box folder ID to scope the search."
          call: "box.search"
          with:
            query: "{{query}}"
            ancestor_folder_ids: "{{folder_id}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: query
              in: query
            - name: ancestor_folder_ids
              in: query
          operations:
            - name: search
              method: GET

On a GitHub Actions pipeline failure, creates a Datadog event marker, opens a ServiceNow incident, and alerts the engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "CI/CD Failure Observability Chain"
  description: "On a GitHub Actions pipeline failure, creates a Datadog event marker, opens a ServiceNow incident, and alerts the engineering team in Microsoft Teams."
  tags:
    - devops
    - ci-cd
    - observability
    - github-actions
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-alerts
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a pipeline failure event, create a Datadog event, open a ServiceNow incident, and alert Teams with full context."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
            - name: repo
              in: body
              type: string
            - name: branch
              in: body
              type: string
            - name: failed_job_name
              in: body
              type: string
            - name: log_url
              in: body
              type: string
            - name: commit_sha
              in: body
              type: string
          steps:
            - name: create-event
              type: call
              call: "datadog.create-event"
              with:
                title: "Pipeline failure: {{repo}} / {{branch}}"
                text: "Job: {{failed_job_name}}. Commit: {{commit_sha}}. Log: {{log_url}}"
                alert_type: "error"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[CI Failure] {{repo}} / {{branch}} — {{failed_job_name}}"
                category: "ci_cd_failure"
                assigned_group: "Engineering"
                description: "Pipeline: {{pipeline_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nLog: {{log_url}}\nDatadog event: {{create-event.id}}"
            - name: post-alert
              type: call
              call: "msteams.send-message"
              with:
                channel: "engineering-alerts"
                text: "Pipeline Failure: {{repo}} | Branch: {{branch}} | Job: {{failed_job_name}} | Incident: {{create-incident.number}} | Log: {{log_url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Checks the status of an Apache NiFi data flow that processes clinical trial data, verifies the downstream Elasticsearch index health, and alerts the data engineering team via Microsoft Teams if issues are detected.

naftiko: "0.5"
info:
  label: "Clinical Data Pipeline Monitoring"
  description: "Checks the status of an Apache NiFi data flow that processes clinical trial data, verifies the downstream Elasticsearch index health, and alerts the data engineering team via Microsoft Teams if issues are detected."
  tags:
    - data-engineering
    - clinical-data
    - apache-nifi
    - elasticsearch
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-clinical-pipeline
          description: "Given a NiFi process group ID, check flow status and Elasticsearch index health, alerting the team on failures."
          inputParameters:
            - name: process_group_id
              in: body
              type: string
              description: "The NiFi process group ID for the clinical data flow."
            - name: index_name
              in: body
              type: string
              description: "The Elasticsearch index name for clinical data."
          steps:
            - name: get-flow-status
              type: call
              call: "nifi.get-process-group"
              with:
                process_group_id: "{{process_group_id}}"
            - name: check-index
              type: call
              call: "elasticsearch.get-index-health"
              with:
                index_name: "{{index_name}}"
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "data-engineering"
                text: "Clinical Pipeline Status — NiFi flow {{process_group_id}}: {{get-flow-status.status}}. Queued: {{get-flow-status.queued_count}}. ES index {{index_name}}: {{check-index.status}} ({{check-index.doc_count}} docs)."
  consumes:
    - type: http
      namespace: nifi
      baseUri: "https://nifi.abbvie.com/nifi-api"
      authentication:
        type: bearer
        token: "$secrets.nifi_token"
      resources:
        - name: process-groups
          path: "/process-groups/{{process_group_id}}/status"
          inputParameters:
            - name: process_group_id
              in: path
          operations:
            - name: get-process-group
              method: GET
    - type: http
      namespace: elasticsearch
      baseUri: "https://es.abbvie.com:9200"
      authentication:
        type: basic
        username: "$secrets.es_user"
        password: "$secrets.es_password"
      resources:
        - name: indices
          path: "/_cluster/health/{{index_name}}"
          inputParameters:
            - name: index_name
              in: path
          operations:
            - name: get-index-health
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles clinical trial data between the EDC system and Snowflake warehouse, logs discrepancies in ServiceNow, and alerts the data management team in Slack.

naftiko: "0.5"
info:
  label: "Clinical Data Reconciliation Pipeline"
  description: "Reconciles clinical trial data between the EDC system and Snowflake warehouse, logs discrepancies in ServiceNow, and alerts the data management team in Slack."
  tags:
    - clinical-trials
    - data-management
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: clinical_data_reconciliation_pipeline
          description: "Orchestrate clinical data reconciliation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-edc-counts
              type: call
              call: "edc.get-subject-counts"
              with:
                trial_id: "{{resource_id}}"
            - name: get-wh-counts
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT COUNT(*) FROM subjects WHERE trial_id = '{{resource_id}}'"
                warehouse: "CLINICAL_WH"
            - name: log-discrepancy
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Data reconciliation: {{resource_id}}"
                category: "data_quality"
            - name: notify-team
              type: call
              call: "slack.send-message"
              with:
                channel: "clinical-data-ops"
                text: "Reconciliation for {{resource_id}} complete. Ticket: {{log-discrepancy.number}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

On protocol amendment approval in Oracle CTMS, updates EDC metadata, revises SharePoint documents, files with IRB via Veeva, and notifies clinical ops.

naftiko: "0.5"
info:
  label: "Clinical Protocol Amendment Workflow"
  description: "On protocol amendment approval in Oracle CTMS, updates EDC metadata, revises SharePoint documents, files with IRB via Veeva, and notifies clinical ops."
  tags:
    - clinical-trials
    - oracle
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: clinical_protocol_amendment_workflow
          description: "Orchestrate clinical protocol amendment workflow workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-amendment
              type: call
              call: "oracle.get-amendment"
              with:
                amendment_id: "{{resource_id}}"
            - name: update-edc
              type: call
              call: "edc.update-protocol"
              with:
                protocol_id: "{{get-amendment.protocol_id}}"
                version: "{{get-amendment.version}}"
            - name: update-docs
              type: call
              call: "sharepoint.update-document"
              with:
                site_id: "clinical"
                path: "protocols/{{get-amendment.protocol_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "clinical-ops"
                text: "Protocol amendment {{resource_id}} processed. Version: {{get-amendment.version}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Monitors clinical supply in SAP, identifies at-risk sites, generates transfer orders, creates ServiceNow logistics tickets, and alerts supply management via Teams.

naftiko: "0.5"
info:
  label: "Clinical Supply Chain Rebalancing"
  description: "Monitors clinical supply in SAP, identifies at-risk sites, generates transfer orders, creates ServiceNow logistics tickets, and alerts supply management via Teams."
  tags:
    - clinical-supply
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: clinical_supply_chain_rebalancing
          description: "Orchestrate clinical supply chain rebalancing workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: check-inventory
              type: call
              call: "sap.get-inventory"
              with:
                material_id: "{{resource_id}}"
            - name: identify-risks
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT * FROM supply_forecast WHERE material = '{{resource_id}}'"
                warehouse: "SUPPLY_WH"
            - name: create-transfer
              type: call
              call: "sap.create-transfer-order"
              with:
                material_id: "{{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "clinical-supply"
                text: "Rebalancing initiated for {{resource_id}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Exports clinical trial data from Oracle, transforms it via Apache NiFi, loads it into Elasticsearch for real-time querying, and notifies the biostatistics team in Microsoft Teams when the pipeline completes.

naftiko: "0.5"
info:
  label: "Clinical Trial Data Export to Elasticsearch"
  description: "Exports clinical trial data from Oracle, transforms it via Apache NiFi, loads it into Elasticsearch for real-time querying, and notifies the biostatistics team in Microsoft Teams when the pipeline completes."
  tags:
    - clinical-data
    - data-pipeline
    - oracle
    - apache-nifi
    - elasticsearch
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-ops
      port: 8080
      tools:
        - name: export-trial-data
          description: "Given a trial ID and data cutoff date, trigger the Oracle-to-Elasticsearch pipeline via NiFi and notify the biostatistics team."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "Clinical trial identifier."
            - name: cutoff_date
              in: body
              type: string
              description: "Data cutoff date (YYYY-MM-DD)."
            - name: target_index
              in: body
              type: string
              description: "Elasticsearch index name for the exported data."
          steps:
            - name: trigger-nifi-flow
              type: call
              call: "nifi.start-process-group"
              with:
                process_group_id: "clinical-export-{{trial_id}}"
                parameters: "{\"trial_id\": \"{{trial_id}}\", \"cutoff_date\": \"{{cutoff_date}}\", \"target_index\": \"{{target_index}}\"}"
            - name: verify-index
              type: call
              call: "elasticsearch.get-index-health"
              with:
                index_name: "{{target_index}}"
            - name: notify-biostat
              type: call
              call: "msteams.send-message"
              with:
                channel: "biostatistics"
                text: "Clinical data export complete: Trial {{trial_id}} (cutoff: {{cutoff_date}}). Index {{target_index}}: {{verify-index.status}} with {{verify-index.doc_count}} documents."
  consumes:
    - type: http
      namespace: nifi
      baseUri: "https://nifi.abbvie.com/nifi-api"
      authentication:
        type: bearer
        token: "$secrets.nifi_token"
      resources:
        - name: process-groups
          path: "/process-groups/{{process_group_id}}"
          inputParameters:
            - name: process_group_id
              in: path
          operations:
            - name: start-process-group
              method: PUT
    - type: http
      namespace: elasticsearch
      baseUri: "https://es.abbvie.com:9200"
      authentication:
        type: basic
        username: "$secrets.es_user"
        password: "$secrets.es_password"
      resources:
        - name: indices
          path: "/_cluster/health/{{index_name}}"
          inputParameters:
            - name: index_name
              in: path
          operations:
            - name: get-index-health
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

On approval of a new clinical trial site in Oracle, creates a ServiceNow activation ticket, provisions a SharePoint document library for site files, and notifies the clinical operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Activation Orchestrator"
  description: "On approval of a new clinical trial site in Oracle, creates a ServiceNow activation ticket, provisions a SharePoint document library for site files, and notifies the clinical operations team in Microsoft Teams."
  tags:
    - clinical-trials
    - site-activation
    - oracle
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: activate-trial-site
          description: "Given an Oracle clinical trial ID and site code, orchestrate site activation across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The Oracle clinical trial identifier."
            - name: site_code
              in: body
              type: string
              description: "The investigator site code."
            - name: principal_investigator
              in: body
              type: string
              description: "Name of the principal investigator at the site."
          steps:
            - name: get-trial
              type: call
              call: "oracle.get-trial"
              with:
                trial_id: "{{trial_id}}"
            - name: open-activation-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Site activation: {{site_code}} for trial {{get-trial.trial_name}}"
                category: "clinical_site_activation"
                assigned_group: "Clinical_Ops"
                description: "Activate site {{site_code}} for trial {{trial_id}} ({{get-trial.trial_name}}). PI: {{principal_investigator}}. Phase: {{get-trial.phase}}."
            - name: provision-site-library
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "clinical_trials_site"
                folder_path: "Trials/{{trial_id}}/Sites/{{site_code}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "clinical-operations"
                text: "Site {{site_code}} activated for trial {{get-trial.trial_name}} (PI: {{principal_investigator}}). Ticket: {{open-activation-ticket.number}}. Documents: {{provision-site-library.url}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://abbvie-cloud.oraclecloud.com/api/v1/clinical"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: trials
          path: "/trials/{{trial_id}}"
          inputParameters:
            - name: trial_id
              in: path
          operations:
            - name: get-trial
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Queries AWS Cost Explorer for anomalies, cross-references Azure costs, creates a Jira ticket, updates Grafana dashboard, and alerts the cloud team in Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Detector"
  description: "Queries AWS Cost Explorer for anomalies, cross-references Azure costs, creates a Jira ticket, updates Grafana dashboard, and alerts the cloud team in Teams."
  tags:
    - finops
    - aws
    - jira
    - grafana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: cloud_cost_anomaly_detector
          description: "Orchestrate cloud cost anomaly detector workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-aws-costs
              type: call
              call: "aws.get-cost-report"
              with:
                date_range: "{{resource_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Cost anomaly detected: {{resource_id}}"
            - name: update-dashboard
              type: call
              call: "grafana.annotate"
              with:
                dashboard_uid: "finops"
                text: "Anomaly: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "cloud-finops"
                text: "Cost anomaly for {{resource_id}}. Ticket: {{create-ticket.key}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://abbvie-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Retrieves recent WAF events from Cloudflare for a given zone, filters by rule ID, and creates a security incident in ServiceNow if attack patterns are detected against AbbVie's public-facing applications.

naftiko: "0.5"
info:
  label: "Cloudflare WAF Event Investigation"
  description: "Retrieves recent WAF events from Cloudflare for a given zone, filters by rule ID, and creates a security incident in ServiceNow if attack patterns are detected against AbbVie's public-facing applications."
  tags:
    - security
    - web-application-firewall
    - cloudflare
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: web-security
      port: 8080
      tools:
        - name: investigate-waf-events
          description: "Given a Cloudflare zone ID and rule ID, retrieve WAF events and escalate to ServiceNow if thresholds are exceeded."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "Cloudflare zone ID."
            - name: rule_id
              in: body
              type: string
              description: "WAF rule ID to investigate."
            - name: time_range
              in: body
              type: string
              description: "Time range for event lookup (e.g., last_1_hour)."
          steps:
            - name: get-waf-events
              type: call
              call: "cloudflare.get-firewall-events"
              with:
                zone_id: "{{zone_id}}"
                rule_id: "{{rule_id}}"
                time_range: "{{time_range}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "WAF Alert: Rule {{rule_id}} triggered on zone {{zone_id}}"
                category: "security_incident"
                assigned_group: "Security_Operations"
                urgency: "2"
                description: "Cloudflare WAF rule {{rule_id}} triggered {{get-waf-events.event_count}} times in {{time_range}}. Top source IPs: {{get-waf-events.top_source_ips}}. Zone: {{zone_id}}."
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: firewall-events
          path: "/zones/{{zone_id}}/firewall/events"
          inputParameters:
            - name: zone_id
              in: path
            - name: rule_id
              in: query
            - name: time_range
              in: query
          operations:
            - name: get-firewall-events
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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

Extracts prescription data from IQVIA, blends with Salesforce CRM data, loads into Snowflake, triggers Tableau refresh, and publishes dashboards.

naftiko: "0.5"
info:
  label: "Commercial Analytics Refresh Pipeline"
  description: "Extracts prescription data from IQVIA, blends with Salesforce CRM data, loads into Snowflake, triggers Tableau refresh, and publishes dashboards."
  tags:
    - commercial
    - salesforce
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: commercial_analytics_refresh_pipeline
          description: "Orchestrate commercial analytics refresh pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: extract-rx
              type: call
              call: "iqvia.get-rx-data"
              with:
                product_id: "{{resource_id}}"
            - name: get-crm-data
              type: call
              call: "salesforce.get-territory-data"
              with:
                product_id: "{{resource_id}}"
            - name: load-data
              type: call
              call: "snowflake.load-data"
              with:
                source_ref: "{{extract-rx.data_uri}}"
                schema: "commercial"
            - name: refresh-tableau
              type: call
              call: "tableau.refresh-extract"
              with:
                workbook_id: "commercial_insights"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-operation
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://abbvie-tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: tableau-operation
              method: POST

Queries overdue training from Cornerstone LMS, looks up managers in Workday, sends reminders via Outlook, escalates to HR in ServiceNow, and reports in Power BI.

naftiko: "0.5"
info:
  label: "Compliance Training Enforcement Pipeline"
  description: "Queries overdue training from Cornerstone LMS, looks up managers in Workday, sends reminders via Outlook, escalates to HR in ServiceNow, and reports in Power BI."
  tags:
    - compliance
    - workday
    - servicenow
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: compliance_training_enforcement_pipeline
          description: "Orchestrate compliance training enforcement pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-overdue
              type: call
              call: "cornerstone.get-overdue-training"
              with:
                department: "{{resource_id}}"
            - name: get-managers
              type: call
              call: "workday.get-managers"
              with:
                department: "{{resource_id}}"
            - name: escalate
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Overdue training: {{resource_id}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "compliance_training"

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abbvie"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-operation
              method: POST

Retrieves a Confluence page by space key and title. Used across AbbVie teams to quickly access SOPs, process documentation, and regulatory guidelines.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence page by space key and title. Used across AbbVie teams to quickly access SOPs, process documentation, and regulatory guidelines."
  tags:
    - knowledge-management
    - documentation
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: get-confluence-page
          description: "Look up a Confluence page by space key and title."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "Confluence space key."
            - name: title
              in: body
              type: string
              description: "Page title to search for."
          call: "confluence.get-page"
          with:
            space_key: "{{space_key}}"
            title: "{{title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          inputParameters:
            - name: space_key
              in: query
            - name: title
              in: query
          operations:
            - name: get-page
              method: GET

Extracts contract metadata from Icertis CLM, validates terms in SharePoint, logs compliance in ServiceNow, updates Salesforce, and notifies legal via Teams.

naftiko: "0.5"
info:
  label: "Contract Lifecycle Management Pipeline"
  description: "Extracts contract metadata from Icertis CLM, validates terms in SharePoint, logs compliance in ServiceNow, updates Salesforce, and notifies legal via Teams."
  tags:
    - legal
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: contract_lifecycle_management_pipeline
          description: "Orchestrate contract lifecycle management pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-contract
              type: call
              call: "icertis.get-contract"
              with:
                contract_id: "{{resource_id}}"
            - name: validate-terms
              type: call
              call: "sharepoint.get-template"
              with:
                template_id: "legal_terms"
            - name: log-compliance
              type: call
              call: "servicenow.create-record"
              with:
                table: "contract_compliance"
                contract_id: "{{resource_id}}"
            - name: notify-legal
              type: call
              call: "msteams.send-message"
              with:
                channel: "legal"
                text: "Contract {{resource_id}} validated. Status: {{log-compliance.state}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Retrieves the status of a Coupa purchase requisition by requisition number. Used by procurement teams at AbbVie to track order progress.

naftiko: "0.5"
info:
  label: "Coupa Purchase Requisition Status"
  description: "Retrieves the status of a Coupa purchase requisition by requisition number. Used by procurement teams at AbbVie to track order progress."
  tags:
    - procurement
    - coupa
    - purchasing
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-requisition
          description: "Look up a Coupa purchase requisition by number."
          inputParameters:
            - name: requisition_number
              in: body
              type: string
              description: "The Coupa requisition number."
          call: "coupa.get-requisition"
          with:
            requisition_number: "{{requisition_number}}"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://abbvie.coupahost.com/api"
      authentication:
        type: bearer
        token: "$secrets.coupa_api_key"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_number}}"
          inputParameters:
            - name: requisition_number
              in: path
          operations:
            - name: get-requisition
              method: GET

Searches for PII across Salesforce, Workday, and Snowflake, compiles results, logs in OneTrust, and sends the response via encrypted email.

naftiko: "0.5"
info:
  label: "Data Privacy DSAR Processor"
  description: "Searches for PII across Salesforce, Workday, and Snowflake, compiles results, logs in OneTrust, and sends the response via encrypted email."
  tags:
    - privacy
    - salesforce
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: data_privacy_dsar_processor
          description: "Orchestrate data privacy dsar processor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: search-sf
              type: call
              call: "salesforce.search-pii"
              with:
                subject_id: "{{resource_id}}"
            - name: search-wd
              type: call
              call: "workday.search-employee"
              with:
                subject_id: "{{resource_id}}"
            - name: search-sf-data
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT * FROM pii_catalog WHERE subject = '{{resource_id}}'"
                warehouse: "PRIVACY_WH"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "privacy"
                text: "DSAR complete for {{resource_id}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-operation
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abbvie"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-operation
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Runs schema comparison between Oracle and PostgreSQL, executes row count validation, generates diff report in Confluence, and creates Jira tasks.

naftiko: "0.5"
info:
  label: "Database Migration Validation Pipeline"
  description: "Runs schema comparison between Oracle and PostgreSQL, executes row count validation, generates diff report in Confluence, and creates Jira tasks."
  tags:
    - data-engineering
    - confluence
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: database_migration_validation_pipeline
          description: "Orchestrate database migration validation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: compare-schemas
              type: call
              call: "oracle.get-schema"
              with:
                table_name: "{{resource_id}}"
            - name: validate-counts
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT COUNT(*) FROM {{resource_id}}"
                warehouse: "MIGRATION_WH"
            - name: create-report
              type: call
              call: "confluence.create-page"
              with:
                space: "DBA"
                title: "Migration report: {{resource_id}}"
            - name: create-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "DBA"
                summary: "Migration validation: {{resource_id}}"

  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-operation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Retrieves the current status and details of a Datadog monitor by ID. Used by DevOps and SRE teams to quickly check infrastructure alert states for AbbVie's cloud environments.

naftiko: "0.5"
info:
  label: "Datadog Alert Lookup"
  description: "Retrieves the current status and details of a Datadog monitor by ID. Used by DevOps and SRE teams to quickly check infrastructure alert states for AbbVie's cloud environments."
  tags:
    - devops
    - monitoring
    - datadog
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Look up a Datadog monitor by ID and return its current status, name, and last triggered timestamp."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

When an FDA label change is required, retrieves the current label from SharePoint, creates a review task in ServiceNow for regulatory affairs, notifies medical writing in Microsoft Teams, and logs the change in Confluence for audit trail.

naftiko: "0.5"
info:
  label: "Drug Label Update Workflow"
  description: "When an FDA label change is required, retrieves the current label from SharePoint, creates a review task in ServiceNow for regulatory affairs, notifies medical writing in Microsoft Teams, and logs the change in Confluence for audit trail."
  tags:
    - regulatory
    - drug-labeling
    - fda
    - sharepoint
    - servicenow
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: regulatory-labeling
      port: 8080
      tools:
        - name: initiate-label-update
          description: "Given a product code and change reason, start the drug label update workflow across regulatory, medical writing, and QA systems."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "AbbVie product code."
            - name: ndc_code
              in: body
              type: string
              description: "National Drug Code."
            - name: change_reason
              in: body
              type: string
              description: "Reason for the label update (e.g., safety update, new indication)."
            - name: priority
              in: body
              type: string
              description: "Priority level: routine, urgent, safety."
          steps:
            - name: get-current-label
              type: call
              call: "sharepoint.list-folder"
              with:
                site_id: "regulatory_labels"
                folder_path: "Labels/{{product_code}}/Current"
            - name: create-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Label update: {{product_code}} (NDC: {{ndc_code}}) — {{change_reason}}"
                assigned_group: "Regulatory_Affairs"
                category: "label_update"
                description: "Product: {{product_code}}\nNDC: {{ndc_code}}\nReason: {{change_reason}}\nPriority: {{priority}}\nCurrent label: {{get-current-label.folder_url}}"
            - name: notify-medical-writing
              type: call
              call: "msteams.send-message"
              with:
                channel: "medical-writing"
                text: "Label Update Required: {{product_code}} ({{ndc_code}}). Reason: {{change_reason}}. Priority: {{priority}}. Task: {{create-review-task.number}}. Current label: {{get-current-label.folder_url}}"
            - name: log-change
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REGLABEL"
                title: "Label Change: {{product_code}} — {{create-review-task.number}}"
                body: "Product: {{product_code}}\nNDC: {{ndc_code}}\nReason: {{change_reason}}\nPriority: {{priority}}\nTask: {{create-review-task.number}}\nInitiated: {{create-review-task.created_at}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folder-contents
          path: "/{{site_id}}/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a manufacturing deviation is reported in SAP, creates a quality investigation in Veeva, assigns corrective actions in Jira, and notifies QA via Teams.

naftiko: "0.5"
info:
  label: "Drug Manufacturing Deviation Handler"
  description: "When a manufacturing deviation is reported in SAP, creates a quality investigation in Veeva, assigns corrective actions in Jira, and notifies QA via Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: drug_manufacturing_deviation_handler
          description: "Orchestrate drug manufacturing deviation handler workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-deviation
              type: call
              call: "sap.get-deviation"
              with:
                deviation_id: "{{resource_id}}"
            - name: create-investigation
              type: call
              call: "veeva.create-investigation"
              with:
                deviation_id: "{{resource_id}}"
                description: "{{get-deviation.description}}"
            - name: create-capa
              type: call
              call: "jira.create-issue"
              with:
                project: "QA"
                summary: "CAPA for deviation {{resource_id}}"
            - name: notify-qa
              type: call
              call: "msteams.send-message"
              with:
                channel: "quality-assurance"
                text: "Deviation {{resource_id}}: {{get-deviation.description}}. CAPA: {{create-capa.key}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

When an SAP supply chain alert fires for a critical raw material, creates a ServiceNow priority incident, notifies the supply chain team in Microsoft Teams, and logs an entry in Confluence for audit tracking.

naftiko: "0.5"
info:
  label: "Drug Supply Chain Disruption Escalation"
  description: "When an SAP supply chain alert fires for a critical raw material, creates a ServiceNow priority incident, notifies the supply chain team in Microsoft Teams, and logs an entry in Confluence for audit tracking."
  tags:
    - supply-chain
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: escalate-disruption
          description: "Given a material shortage alert from SAP, create a priority incident, notify the supply chain team, and log the disruption for GMP audit trail."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the affected raw material."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code where the shortage is detected."
            - name: shortage_quantity
              in: body
              type: string
              description: "Quantity shortfall in base unit of measure."
            - name: affected_product
              in: body
              type: string
              description: "The finished drug product affected by the shortage."
          steps:
            - name: get-material
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{material_number}}"
            - name: create-priority-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Supply disruption: {{get-material.material_name}} at plant {{plant_code}}"
                category: "supply_chain_disruption"
                assigned_group: "Supply_Chain_Ops"
                urgency: "1"
                description: "Material: {{material_number}} ({{get-material.material_name}}). Plant: {{plant_code}}. Shortage: {{shortage_quantity}} {{get-material.unit}}. Affected product: {{affected_product}}."
            - name: notify-supply-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "supply-chain-alerts"
                text: "SUPPLY DISRUPTION: {{get-material.material_name}} at plant {{plant_code}}. Shortage: {{shortage_quantity}} {{get-material.unit}}. Affected: {{affected_product}}. Incident: {{create-priority-incident.number}}"
            - name: log-audit-entry
              type: call
              call: "confluence.create-page"
              with:
                space_key: "SUPPLY"
                title: "Disruption Log: {{material_number}} — {{plant_code}} — {{create-priority-incident.number}}"
                body: "Material: {{material_number}} ({{get-material.material_name}})\nPlant: {{plant_code}}\nShortage: {{shortage_quantity}}\nProduct: {{affected_product}}\nIncident: {{create-priority-incident.number}}\nTimestamp: {{create-priority-incident.created_at}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves application performance metrics from Dynatrace including response time, error rate, and throughput for AbbVie's patient-facing and commercial web applications.

naftiko: "0.5"
info:
  label: "Dynatrace Application Performance"
  description: "Retrieves application performance metrics from Dynatrace including response time, error rate, and throughput for AbbVie's patient-facing and commercial web applications."
  tags:
    - devops
    - apm
    - dynatrace
    - performance
capability:
  exposes:
    - type: mcp
      namespace: apm
      port: 8080
      tools:
        - name: get-app-performance
          description: "Look up Dynatrace application performance metrics for a given application entity ID."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "Dynatrace application entity ID."
          call: "dynatrace.get-entity"
          with:
            entity_id: "{{entity_id}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://abbvie.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{entity_id}}"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-entity
              method: GET

Captures EHS incidents from Intelex, correlates with SAP site data, generates a CAPA investigation, and alerts site leadership via Teams.

naftiko: "0.5"
info:
  label: "Environmental Health Safety Incident Pipeline"
  description: "Captures EHS incidents from Intelex, correlates with SAP site data, generates a CAPA investigation, and alerts site leadership via Teams."
  tags:
    - ehs
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: ehs_incident_pipeline
          description: "Orchestrate environmental health safety incident pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-incident
              type: call
              call: "intelex.get-incident"
              with:
                incident_id: "{{resource_id}}"
            - name: get-site-data
              type: call
              call: "sap.get-plant"
              with:
                plant_id: "{{get-incident.plant_id}}"
            - name: create-capa
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "EHS CAPA: {{resource_id}}"
                description: "{{get-incident.description}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "ehs-leadership"
                text: "EHS incident {{resource_id}} at {{get-site-data.plant_name}}. CAPA: {{create-capa.number}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Retrieves application performance traces from Elastic APM by trace ID. Used to diagnose latency issues in AbbVie's microservices architecture.

naftiko: "0.5"
info:
  label: "Elastic APM Trace Lookup"
  description: "Retrieves application performance traces from Elastic APM by trace ID. Used to diagnose latency issues in AbbVie's microservices architecture."
  tags:
    - observability
    - elastic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-trace
          description: "Look up an Elastic APM trace by trace ID."
          inputParameters:
            - name: trace_id
              in: body
              type: string
              description: "The distributed trace ID."
          call: "elastic-apm.get-trace"
          with:
            trace_id: "{{trace_id}}"
  consumes:
    - type: http
      namespace: elastic-apm
      baseUri: "https://abbvie-elastic.com/api/apm"
      authentication:
        type: bearer
        token: "$secrets.elastic_api_key"
      resources:
        - name: traces
          path: "/traces/{{trace_id}}"
          inputParameters:
            - name: trace_id
              in: path
          operations:
            - name: get-trace
              method: GET

On termination in Workday, disables Okta account, revokes Azure AD access, creates ServiceNow ticket for equipment return, and archives Box files.

naftiko: "0.5"
info:
  label: "Employee Offboarding Orchestrator"
  description: "On termination in Workday, disables Okta account, revokes Azure AD access, creates ServiceNow ticket for equipment return, and archives Box files."
  tags:
    - hr
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: employee_offboarding_orchestrator
          description: "Orchestrate employee offboarding orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-employee
              type: call
              call: "workday.get-employee"
              with:
                employee_id: "{{resource_id}}"
            - name: disable-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_id: "{{get-employee.email}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Equipment return: {{get-employee.full_name}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "hr-ops"
                text: "Offboarding complete for {{get-employee.full_name}}"

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abbvie"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-operation
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://abbvie.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Retrieves submitted expense reports from SAP Concur, validates against PeopleSoft cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected.

naftiko: "0.5"
info:
  label: "Expense Report Processing"
  description: "Retrieves submitted expense reports from SAP Concur, validates against PeopleSoft cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected."
  tags:
    - finance
    - expense
    - sap-concur
    - peoplesoft
    - servicenow
    - policy-compliance
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: review-expense-report
          description: "Given a Concur expense report ID and employee ID, fetch the report details, validate cost center against PeopleSoft, and flag policy violations to ServiceNow."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The PeopleSoft employee ID of the expense submitter."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: get-employee
              type: call
              call: "peoplesoft.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: open-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense policy review: {{get-expense-report.report_name}} — {{get-employee.full_name}}"
                description: "Report {{expense_report_id}} total: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Cost center: {{get-employee.cost_center}}. Submitted: {{get-expense-report.submit_date}}."
                assigned_group: "Finance_Audit"
                category: "expense_review"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: peoplesoft
      baseUri: "https://abbvie-hr.peoplesoft.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_user"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: employees
          path: "/employees/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Fetches the latest workflow run status from GitHub Actions for a given repository and branch. Used by engineering teams to check build health for AbbVie's internal tools and data pipelines.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Pipeline Status"
  description: "Fetches the latest workflow run status from GitHub Actions for a given repository and branch. Used by engineering teams to check build health for AbbVie's internal tools and data pipelines."
  tags:
    - devops
    - ci-cd
    - github
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Look up the latest GitHub Actions workflow run for a repository and branch."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format."
            - name: branch
              in: body
              type: string
              description: "Branch name to check."
          call: "github.get-workflow-runs"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
  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
            - name: branch
              in: query
          operations:
            - name: get-workflow-runs
              method: GET

Retrieves metadata about a GitHub repository including last commit, open PRs, and branch protection status. Used by platform engineering at AbbVie.

naftiko: "0.5"
info:
  label: "GitHub Repository Info"
  description: "Retrieves metadata about a GitHub repository including last commit, open PRs, and branch protection status. Used by platform engineering at AbbVie."
  tags:
    - devops
    - github
    - source-control
capability:
  exposes:
    - type: mcp
      namespace: source-control
      port: 8080
      tools:
        - name: get-repo
          description: "Retrieve GitHub repository metadata by owner and repo name."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Repository name in owner/repo format."
          call: "github.get-repo"
          with:
            repo_name: "{{repo_name}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo_name}}"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-repo
              method: GET

Pulls Google Analytics campaign performance data for an AbbVie HCP marketing campaign and posts a summary to a Confluence page for the brand marketing team.

naftiko: "0.5"
info:
  label: "Google Analytics Marketing Report"
  description: "Pulls Google Analytics campaign performance data for an AbbVie HCP marketing campaign and posts a summary to a Confluence page for the brand marketing team."
  tags:
    - marketing
    - analytics
    - google-analytics
    - confluence
    - hcp-marketing
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: generate-campaign-report
          description: "Given a GA property ID and campaign name, pull performance metrics and create a Confluence report page."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "Google Analytics 4 property ID."
            - name: campaign_name
              in: body
              type: string
              description: "Name of the HCP marketing campaign."
            - name: date_range
              in: body
              type: string
              description: "Date range for the report (e.g., last_30_days)."
          steps:
            - name: get-campaign-data
              type: call
              call: "ga.run-report"
              with:
                property_id: "{{property_id}}"
                campaign_name: "{{campaign_name}}"
                date_range: "{{date_range}}"
            - name: create-report-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "MKT"
                title: "Campaign Report: {{campaign_name}} — {{date_range}}"
                body: "Campaign: {{campaign_name}}\nSessions: {{get-campaign-data.sessions}}\nConversions: {{get-campaign-data.conversions}}\nBounce Rate: {{get-campaign-data.bounce_rate}}\nAvg Session Duration: {{get-campaign-data.avg_session_duration}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Publishes a new Google Tag Manager container version for AbbVie's digital marketing properties, logs the deployment in Adobe Analytics, and notifies the digital team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Google Tag Manager Container Version Publish"
  description: "Publishes a new Google Tag Manager container version for AbbVie's digital marketing properties, logs the deployment in Adobe Analytics, and notifies the digital team in Microsoft Teams."
  tags:
    - marketing
    - tag-management
    - google-tag-manager
    - adobe-analytics
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital-marketing
      port: 8080
      tools:
        - name: publish-container
          description: "Given a GTM account, container, and workspace, publish the container version and log the deployment."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "GTM account ID."
            - name: container_id
              in: body
              type: string
              description: "GTM container ID."
            - name: workspace_id
              in: body
              type: string
              description: "GTM workspace ID."
            - name: version_name
              in: body
              type: string
              description: "Name for the published version."
          steps:
            - name: publish-version
              type: call
              call: "gtm.publish-workspace"
              with:
                account_id: "{{account_id}}"
                container_id: "{{container_id}}"
                workspace_id: "{{workspace_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "digital-marketing"
                text: "GTM Container Published: {{version_name}} (Container: {{container_id}}). Version: {{publish-version.version_id}}. Published at: {{publish-version.published_at}}"
  consumes:
    - type: http
      namespace: gtm
      baseUri: "https://www.googleapis.com/tagmanager/v2"
      authentication:
        type: bearer
        token: "$secrets.google_tagmanager_token"
      resources:
        - name: workspaces
          path: "/accounts/{{account_id}}/containers/{{container_id}}/workspaces/{{workspace_id}}:quick_preview"
          inputParameters:
            - name: account_id
              in: path
            - name: container_id
              in: path
            - name: workspace_id
              in: path
          operations:
            - name: publish-workspace
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a snapshot of a Grafana dashboard by UID. Used by SRE teams to review infrastructure and application metrics for AbbVie's cloud environments.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Viewer"
  description: "Retrieves a snapshot of a Grafana dashboard by UID. Used by SRE teams to review infrastructure and application metrics for AbbVie's cloud environments."
  tags:
    - monitoring
    - grafana
    - observability
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-dashboard
          description: "Retrieve a Grafana dashboard by UID and return panel data."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
          call: "grafana.get-dashboard"
          with:
            dashboard_uid: "{{dashboard_uid}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://abbvie-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{dashboard_uid}}"
          inputParameters:
            - name: dashboard_uid
              in: path
          operations:
            - name: get-dashboard
              method: GET

When a code change is merged to a GxP-validated system, creates a change control record in ServiceNow, runs SonarQube quality gate, uploads evidence to SharePoint, and notifies QA in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GxP Validation Change Control"
  description: "When a code change is merged to a GxP-validated system, creates a change control record in ServiceNow, runs SonarQube quality gate, uploads evidence to SharePoint, and notifies QA in Microsoft Teams."
  tags:
    - quality
    - gxp
    - change-control
    - servicenow
    - sonarqube
    - sharepoint
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: gxp-quality
      port: 8080
      tools:
        - name: process-gxp-change
          description: "Given a repository, commit SHA, and system name, execute GxP change control workflow including quality gate check and evidence archival."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in owner/repo format."
            - name: commit_sha
              in: body
              type: string
              description: "The merge commit SHA."
            - name: system_name
              in: body
              type: string
              description: "Name of the GxP-validated system."
            - name: change_description
              in: body
              type: string
              description: "Description of the change being deployed."
          steps:
            - name: create-change-control
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "GxP Change: {{system_name}} — {{commit_sha}}"
                description: "Repository: {{repo}}. Commit: {{commit_sha}}. Change: {{change_description}}"
                assigned_group: "QA_Validation"
                category: "gxp_change_control"
            - name: check-quality
              type: call
              call: "sonarqube.get-quality-gate"
              with:
                project_key: "{{repo}}"
            - name: archive-evidence
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "gxp_validation"
                folder_path: "ChangeControl/{{system_name}}/{{create-change-control.number}}"
            - name: notify-qa
              type: call
              call: "msteams.send-message"
              with:
                channel: "qa-validation"
                text: "GxP Change Control: {{system_name}} — {{create-change-control.number}}. Quality Gate: {{check-quality.status}}. Evidence: {{archive-evidence.url}}. Change: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.abbvie.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Creates and schedules a MailChimp email campaign targeting healthcare professionals, tags the campaign in Salesforce for CRM tracking, and logs the launch in Confluence for compliance documentation.

naftiko: "0.5"
info:
  label: "HCP Engagement Email Campaign"
  description: "Creates and schedules a MailChimp email campaign targeting healthcare professionals, tags the campaign in Salesforce for CRM tracking, and logs the launch in Confluence for compliance documentation."
  tags:
    - marketing
    - hcp-engagement
    - mailchimp
    - salesforce
    - confluence
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hcp-marketing
      port: 8080
      tools:
        - name: launch-hcp-campaign
          description: "Given campaign details and a MailChimp audience, create the email campaign, tag the Salesforce campaign, and log in Confluence for regulatory documentation."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "Name of the HCP email campaign."
            - name: audience_id
              in: body
              type: string
              description: "MailChimp audience (list) ID for HCPs."
            - name: subject_line
              in: body
              type: string
              description: "Email subject line."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "Salesforce campaign ID for CRM tracking."
            - name: therapeutic_area
              in: body
              type: string
              description: "Therapeutic area (e.g., immunology, oncology)."
          steps:
            - name: create-email-campaign
              type: call
              call: "mailchimp.create-campaign"
              with:
                list_id: "{{audience_id}}"
                subject_line: "{{subject_line}}"
                title: "{{campaign_name}}"
            - name: update-salesforce-campaign
              type: call
              call: "salesforce.update-campaign"
              with:
                campaign_id: "{{salesforce_campaign_id}}"
                status: "In Progress"
                description: "MailChimp campaign {{create-email-campaign.id}} launched for {{therapeutic_area}} HCPs."
            - name: log-compliance
              type: call
              call: "confluence.create-page"
              with:
                space_key: "MKTCOMPLIANCE"
                title: "HCP Campaign Log: {{campaign_name}} — {{therapeutic_area}}"
                body: "Campaign: {{campaign_name}}\nTherapeutic Area: {{therapeutic_area}}\nMailChimp ID: {{create-email-campaign.id}}\nSalesforce Campaign: {{salesforce_campaign_id}}\nSubject: {{subject_line}}\nAudience: {{audience_id}}"
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: update-campaign
              method: PATCH
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Captures HCP meeting notes from Veeva CRM, syncs to Salesforce, updates compliance records, refreshes Tableau analytics, and sends summary to field team.

naftiko: "0.5"
info:
  label: "HCP Engagement Tracking Pipeline"
  description: "Captures HCP meeting notes from Veeva CRM, syncs to Salesforce, updates compliance records, refreshes Tableau analytics, and sends summary to field team."
  tags:
    - commercial
    - salesforce
    - tableau
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: hcp_engagement_tracking_pipeline
          description: "Orchestrate hcp engagement tracking pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-meetings
              type: call
              call: "veeva.get-hcp-meetings"
              with:
                rep_id: "{{resource_id}}"
            - name: sync-salesforce
              type: call
              call: "salesforce.update-engagement"
              with:
                rep_id: "{{resource_id}}"
                meetings: "{{get-meetings.count}}"
            - name: refresh-analytics
              type: call
              call: "tableau.refresh-extract"
              with:
                workbook_id: "hcp_engagement"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "field-force"
                text: "HCP engagement synced for rep {{resource_id}}: {{get-meetings.count}} meetings"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-operation
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://abbvie-tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: tableau-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

When a new lead is captured in HubSpot from AbbVie's patient or HCP website, syncs the contact to Salesforce and notifies the commercial team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "HubSpot Lead Capture to Salesforce"
  description: "When a new lead is captured in HubSpot from AbbVie's patient or HCP website, syncs the contact to Salesforce and notifies the commercial team in Microsoft Teams."
  tags:
    - marketing
    - lead-management
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-mgmt
      port: 8080
      tools:
        - name: sync-lead
          description: "Given a HubSpot contact ID, sync the lead to Salesforce and notify the commercial team."
          inputParameters:
            - name: hubspot_contact_id
              in: body
              type: string
              description: "HubSpot contact ID."
            - name: campaign_source
              in: body
              type: string
              description: "Marketing campaign that generated the lead."
          steps:
            - name: get-hubspot-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{hubspot_contact_id}}"
            - name: create-salesforce-lead
              type: call
              call: "salesforce.create-lead"
              with:
                first_name: "{{get-hubspot-contact.first_name}}"
                last_name: "{{get-hubspot-contact.last_name}}"
                email: "{{get-hubspot-contact.email}}"
                company: "{{get-hubspot-contact.company}}"
                lead_source: "{{campaign_source}}"
            - name: notify-commercial
              type: call
              call: "msteams.send-message"
              with:
                channel: "commercial-leads"
                text: "New lead synced: {{get-hubspot-contact.first_name}} {{get-hubspot-contact.last_name}} ({{get-hubspot-contact.company}}). Source: {{campaign_source}}. Salesforce ID: {{create-salesforce-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Pulls user access from SailPoint, compares against Workday roles, flags anomalies, creates certification tasks in ServiceNow, and emails managers.

naftiko: "0.5"
info:
  label: "IT Access Review Certification Workflow"
  description: "Pulls user access from SailPoint, compares against Workday roles, flags anomalies, creates certification tasks in ServiceNow, and emails managers."
  tags:
    - security
    - sailpoint
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: it_access_review_certification_workflow
          description: "Orchestrate it access review certification workflow workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-access
              type: call
              call: "sailpoint.get-user-access"
              with:
                user_id: "{{resource_id}}"
            - name: get-role
              type: call
              call: "workday.get-employee"
              with:
                employee_id: "{{resource_id}}"
            - name: create-cert
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Access review: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "security-ops"
                text: "Access review created for {{resource_id}}: {{create-cert.number}}"

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abbvie"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Queries ServiceNow CMDB for assets nearing EOL, retrieves warranty status, creates procurement requests, schedules decommission, and notifies IT ops.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Tracker"
  description: "Queries ServiceNow CMDB for assets nearing EOL, retrieves warranty status, creates procurement requests, schedules decommission, and notifies IT ops."
  tags:
    - it-operations
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: it_asset_lifecycle_tracker
          description: "Orchestrate it asset lifecycle tracker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-eol-assets
              type: call
              call: "servicenow.get-cmdb-ci"
              with:
                filter: "eol_date<{{resource_id}}"
            - name: check-warranty
              type: call
              call: "servicenow.get-warranty"
              with:
                asset_id: "{{get-eol-assets.asset_id}}"
            - name: create-procurement
              type: call
              call: "jira.create-issue"
              with:
                project: "IT"
                summary: "Replace asset: {{get-eol-assets.name}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "it-ops"
                text: "EOL assets identified for {{resource_id}}. Procurement: {{create-procurement.key}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Retrieves the current status and details of a Jira issue by key. Used by engineering teams at AbbVie to check ticket progress and sprint assignments.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves the current status and details of a Jira issue by key. Used by engineering teams at AbbVie to check ticket progress and sprint assignments."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: project-mgmt
      port: 8080
      tools:
        - name: get-issue
          description: "Look up a Jira issue by key and return its status, assignee, and summary."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g. PROJ-123)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbvie.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

Queries active user sessions in Keycloak for a given realm and user. Used by identity and access management teams to troubleshoot SSO issues for AbbVie's internal applications.

naftiko: "0.5"
info:
  label: "Keycloak User Session Lookup"
  description: "Queries active user sessions in Keycloak for a given realm and user. Used by identity and access management teams to troubleshoot SSO issues for AbbVie's internal applications."
  tags:
    - security
    - identity
    - keycloak
    - sso
capability:
  exposes:
    - type: mcp
      namespace: iam
      port: 8080
      tools:
        - name: get-user-sessions
          description: "Look up active Keycloak sessions for a user in a given realm."
          inputParameters:
            - name: realm
              in: body
              type: string
              description: "Keycloak realm name."
            - name: user_id
              in: body
              type: string
              description: "Keycloak user ID."
          call: "keycloak.get-sessions"
          with:
            realm: "{{realm}}"
            user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: keycloak
      baseUri: "https://sso.abbvie.com/auth/admin/realms"
      authentication:
        type: bearer
        token: "$secrets.keycloak_admin_token"
      resources:
        - name: sessions
          path: "/{{realm}}/users/{{user_id}}/sessions"
          inputParameters:
            - name: realm
              in: path
            - name: user_id
              in: path
          operations:
            - name: get-sessions
              method: GET

Updates rate limiting configuration on a Kong API gateway route for AbbVie's partner-facing APIs, logs the change in ServiceNow, and notifies the integration team.

naftiko: "0.5"
info:
  label: "Kong API Gateway Rate Limit Update"
  description: "Updates rate limiting configuration on a Kong API gateway route for AbbVie's partner-facing APIs, logs the change in ServiceNow, and notifies the integration team."
  tags:
    - api-management
    - kong
    - servicenow
    - microsoft-teams
    - integration
capability:
  exposes:
    - type: mcp
      namespace: api-ops
      port: 8080
      tools:
        - name: update-rate-limit
          description: "Given a Kong route ID and new rate limit, update the plugin configuration, log the change, and notify the team."
          inputParameters:
            - name: route_id
              in: body
              type: string
              description: "Kong route ID."
            - name: rate_limit
              in: body
              type: string
              description: "New rate limit (requests per minute)."
            - name: change_reason
              in: body
              type: string
              description: "Reason for the rate limit change."
          steps:
            - name: update-plugin
              type: call
              call: "kong.update-rate-limit"
              with:
                route_id: "{{route_id}}"
                rate_limit: "{{rate_limit}}"
            - name: log-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Kong rate limit update: route {{route_id}} to {{rate_limit}} rpm"
                description: "Route: {{route_id}}\nNew limit: {{rate_limit}} rpm\nReason: {{change_reason}}"
                assigned_group: "Integration_Team"
                category: "api_management"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "integration-ops"
                text: "Kong rate limit updated: Route {{route_id}} now at {{rate_limit}} rpm. Reason: {{change_reason}}. Change: {{log-change.number}}"
  consumes:
    - type: http
      namespace: kong
      baseUri: "https://kong-admin.abbvie.com"
      authentication:
        type: bearer
        token: "$secrets.kong_admin_token"
      resources:
        - name: rate-limit-plugins
          path: "/routes/{{route_id}}/plugins/rate-limiting"
          inputParameters:
            - name: route_id
              in: path
          operations:
            - name: update-rate-limit
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Monitors cluster utilization via Prometheus, evaluates scaling policies, applies HPA adjustments, logs changes in ServiceNow, and notifies platform team in Slack.

naftiko: "0.5"
info:
  label: "Kubernetes Cluster Scaling Orchestrator"
  description: "Monitors cluster utilization via Prometheus, evaluates scaling policies, applies HPA adjustments, logs changes in ServiceNow, and notifies platform team in Slack."
  tags:
    - devops
    - prometheus
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: kubernetes_cluster_scaling_orchestrator
          description: "Orchestrate kubernetes cluster scaling orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-metrics
              type: call
              call: "prometheus.query"
              with:
                query: "cluster_cpu_utilization{cluster='{{resource_id}}'}"
            - name: apply-scaling
              type: call
              call: "k8s.patch-hpa"
              with:
                namespace: "{{resource_id}}"
                replicas: "{{get-metrics.recommended}}"
            - name: log-change
              type: call
              call: "servicenow.create-record"
              with:
                table: "scaling_events"
                cluster: "{{resource_id}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "platform-eng"
                text: "Cluster {{resource_id}} scaled. New replicas: {{get-metrics.recommended}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Queries Azure Kubernetes Service for pod status in a given namespace. Used by platform engineering to monitor microservices health for AbbVie's digital health applications.

naftiko: "0.5"
info:
  label: "Kubernetes Pod Health Check"
  description: "Queries Azure Kubernetes Service for pod status in a given namespace. Used by platform engineering to monitor microservices health for AbbVie's digital health applications."
  tags:
    - devops
    - kubernetes
    - azure-kubernetes-service
    - platform-engineering
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: get-pod-status
          description: "List pods and their statuses in an AKS namespace."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace to query."
          call: "aks.list-pods"
          with:
            namespace: "{{namespace}}"
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://abbvie-aks.hcp.eastus.azmk8s.io"
      authentication:
        type: bearer
        token: "$secrets.aks_token"
      resources:
        - name: pods
          path: "/api/v1/namespaces/{{namespace}}/pods"
          inputParameters:
            - name: namespace
              in: path
          operations:
            - name: list-pods
              method: GET

Publishes an approved job posting to LinkedIn, logs the posting in Salesforce for talent acquisition tracking, and notifies the recruiting team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Publisher"
  description: "Publishes an approved job posting to LinkedIn, logs the posting in Salesforce for talent acquisition tracking, and notifies the recruiting team in Microsoft Teams."
  tags:
    - hr
    - talent-acquisition
    - linkedin
    - salesforce
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: publish-job-posting
          description: "Given job details, publish to LinkedIn, log in Salesforce, and notify the recruiting team."
          inputParameters:
            - name: job_title
              in: body
              type: string
              description: "Title of the job posting."
            - name: job_description
              in: body
              type: string
              description: "Full job description text."
            - name: location
              in: body
              type: string
              description: "Job location."
            - name: department
              in: body
              type: string
              description: "Hiring department."
            - name: requisition_id
              in: body
              type: string
              description: "Internal requisition ID from PeopleSoft."
          steps:
            - name: post-to-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{job_title}}"
                description: "{{job_description}}"
                location: "{{location}}"
            - name: log-in-salesforce
              type: call
              call: "salesforce.create-record"
              with:
                object_type: "Job_Posting__c"
                fields: "{\"Name\": \"{{job_title}}\", \"LinkedIn_Post_Id__c\": \"{{post-to-linkedin.id}}\", \"Requisition_Id__c\": \"{{requisition_id}}\", \"Department__c\": \"{{department}}\"}"
            - name: notify-recruiters
              type: call
              call: "msteams.send-message"
              with:
                channel: "talent-acquisition"
                text: "New job posted to LinkedIn: {{job_title}} ({{location}}). Req: {{requisition_id}}. LinkedIn ID: {{post-to-linkedin.id}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves batch record data from Oracle E-Business Suite, validates against SAP BW quality metrics, and creates a QA review task in ServiceNow for GMP compliance sign-off.

naftiko: "0.5"
info:
  label: "Manufacturing Batch Record Review"
  description: "Retrieves batch record data from Oracle E-Business Suite, validates against SAP BW quality metrics, and creates a QA review task in ServiceNow for GMP compliance sign-off."
  tags:
    - manufacturing
    - quality
    - gmp
    - oracle-ebs
    - sap-bw
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-qa
      port: 8080
      tools:
        - name: review-batch-record
          description: "Given a batch number and product code, pull batch record from Oracle EBS, validate quality metrics from SAP BW, and create a QA review task."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "Manufacturing batch number."
            - name: product_code
              in: body
              type: string
              description: "Product code for the manufactured drug."
            - name: manufacturing_site
              in: body
              type: string
              description: "Manufacturing site identifier."
          steps:
            - name: get-batch-record
              type: call
              call: "oracle-ebs.get-batch"
              with:
                batch_number: "{{batch_number}}"
            - name: get-quality-metrics
              type: call
              call: "sap-bw.get-quality-report"
              with:
                batch_number: "{{batch_number}}"
                product_code: "{{product_code}}"
            - name: create-qa-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Batch review: {{batch_number}} — {{product_code}} at {{manufacturing_site}}"
                description: "Batch: {{batch_number}}\nProduct: {{product_code}}\nSite: {{manufacturing_site}}\nYield: {{get-batch-record.yield_percent}}%\nStatus: {{get-batch-record.status}}\nQuality Score: {{get-quality-metrics.overall_score}}\nDeviations: {{get-quality-metrics.deviation_count}}"
                assigned_group: "QA_Manufacturing"
                category: "batch_review"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://abbvie-ebs.oraclecloud.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: batches
          path: "/manufacturing/batches/{{batch_number}}"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: sap-bw
      baseUri: "https://abbvie-bw.sap.com/sap/opu/odata/sap/QUALITY_METRICS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_bw_user"
        password: "$secrets.sap_bw_password"
      resources:
        - name: quality-reports
          path: "/QualityReports(Batch='{{batch_number}}',Product='{{product_code}}')"
          inputParameters:
            - name: batch_number
              in: path
            - name: product_code
              in: path
          operations:
            - name: get-quality-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Collects metrics from Google Analytics and Adobe Analytics, aggregates in Snowflake, refreshes Power BI, and sends a digest to marketing in Slack.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Aggregator"
  description: "Collects metrics from Google Analytics and Adobe Analytics, aggregates in Snowflake, refreshes Power BI, and sends a digest to marketing in Slack."
  tags:
    - marketing
    - google-analytics
    - adobe-analytics
    - snowflake
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: marketing_campaign_performance_aggregato
          description: "Orchestrate marketing campaign performance aggregator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-ga-data
              type: call
              call: "ga.get-report"
              with:
                campaign_id: "{{resource_id}}"
            - name: get-adobe-data
              type: call
              call: "adobe.get-report"
              with:
                campaign_id: "{{resource_id}}"
            - name: aggregate
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "INSERT INTO campaign_metrics SELECT * FROM staging WHERE campaign = '{{resource_id}}'"
                warehouse: "MARKETING_WH"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "marketing_campaigns"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "marketing-analytics"
                text: "Campaign {{resource_id}} metrics updated"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Extracts master data changes from SAP MDG, validates via Informatica, synchronizes downstream, logs quality scores in Alation, and reports to stewards.

naftiko: "0.5"
info:
  label: "Master Data Governance Pipeline"
  description: "Extracts master data changes from SAP MDG, validates via Informatica, synchronizes downstream, logs quality scores in Alation, and reports to stewards."
  tags:
    - data-governance
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: master_data_governance_pipeline
          description: "Orchestrate master data governance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-changes
              type: call
              call: "sap.get-mdg-changes"
              with:
                domain: "{{resource_id}}"
            - name: validate
              type: call
              call: "informatica.run-dq-rules"
              with:
                domain: "{{resource_id}}"
            - name: sync-downstream
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL sync_master_data('{{resource_id}}')"
                warehouse: "MDG_WH"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "data-governance"
                text: "MDG sync for {{resource_id}}: {{validate.quality_score}}% quality"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Searches PubMed for new publications, logs findings in Veeva Vault, creates a Jira review task, and sends a digest to the medical affairs Slack channel.

naftiko: "0.5"
info:
  label: "Medical Affairs Literature Review Pipeline"
  description: "Searches PubMed for new publications, logs findings in Veeva Vault, creates a Jira review task, and sends a digest to the medical affairs Slack channel."
  tags:
    - medical-affairs
    - pubmed
    - veeva
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: medical_affairs_literature_review_pipeli
          description: "Orchestrate medical affairs literature review pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: search-pubmed
              type: call
              call: "pubmed.search"
              with:
                query: "{{resource_id}}"
            - name: log-findings
              type: call
              call: "veeva.create-document"
              with:
                name: "Literature review: {{resource_id}}"
            - name: create-review
              type: call
              call: "jira.create-issue"
              with:
                project: "MA"
                summary: "Literature review: {{resource_id}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "medical-affairs"
                text: "New publications for {{resource_id}}: {{search-pubmed.count}} articles. Review: {{create-review.key}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Retrieves a Dynamics 365 account record by ID. Used by AbbVie's market access and key account management teams to check payer and provider account details.

naftiko: "0.5"
info:
  label: "Microsoft Dynamics 365 Account Lookup"
  description: "Retrieves a Dynamics 365 account record by ID. Used by AbbVie's market access and key account management teams to check payer and provider account details."
  tags:
    - crm
    - market-access
    - microsoft-dynamics-365
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-account
          description: "Look up a Dynamics 365 account by ID."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Dynamics 365 account GUID."
          call: "dynamics.get-account"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: dynamics
      baseUri: "https://abbvie.crm.dynamics.com/api/data/v9.2"
      authentication:
        type: bearer
        token: "$secrets.dynamics_token"
      resources:
        - name: accounts
          path: "/accounts({{account_id}})"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves MongoDB Atlas cluster status and metrics. Used by data engineering teams to monitor NoSQL databases supporting AbbVie's real-world evidence and patient registry platforms.

naftiko: "0.5"
info:
  label: "MongoDB Atlas Cluster Status"
  description: "Retrieves MongoDB Atlas cluster status and metrics. Used by data engineering teams to monitor NoSQL databases supporting AbbVie's real-world evidence and patient registry platforms."
  tags:
    - data-engineering
    - database
    - mongodb
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: database-ops
      port: 8080
      tools:
        - name: get-cluster-status
          description: "Look up MongoDB Atlas cluster status by project and cluster name."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "MongoDB Atlas project ID."
            - name: cluster_name
              in: body
              type: string
              description: "Atlas cluster name."
          call: "mongodb.get-cluster"
          with:
            project_id: "{{project_id}}"
            cluster_name: "{{cluster_name}}"
  consumes:
    - type: http
      namespace: mongodb
      baseUri: "https://cloud.mongodb.com/api/atlas/v2"
      authentication:
        type: basic
        username: "$secrets.mongodb_atlas_public_key"
        password: "$secrets.mongodb_atlas_private_key"
      resources:
        - name: clusters
          path: "/groups/{{project_id}}/clusters/{{cluster_name}}"
          inputParameters:
            - name: project_id
              in: path
            - name: cluster_name
              in: path
          operations:
            - name: get-cluster
              method: GET

Checks the health and throughput metrics for a MuleSoft API gateway endpoint. Used by integration teams to monitor API connectivity for AbbVie's enterprise integrations.

naftiko: "0.5"
info:
  label: "MuleSoft API Gateway Health"
  description: "Checks the health and throughput metrics for a MuleSoft API gateway endpoint. Used by integration teams to monitor API connectivity for AbbVie's enterprise integrations."
  tags:
    - integration
    - api-management
    - mulesoft
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: api-management
      port: 8080
      tools:
        - name: get-api-health
          description: "Look up MuleSoft API health metrics for a given environment and API ID."
          inputParameters:
            - name: environment_id
              in: body
              type: string
              description: "MuleSoft environment ID."
            - name: api_id
              in: body
              type: string
              description: "MuleSoft API ID."
          call: "mulesoft.get-api-status"
          with:
            environment_id: "{{environment_id}}"
            api_id: "{{api_id}}"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/apimanager/api/v1"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: apis
          path: "/organizations/{{environment_id}}/apis/{{api_id}}"
          inputParameters:
            - name: environment_id
              in: path
            - name: api_id
              in: path
          operations:
            - name: get-api-status
              method: GET

Checks backup status in Veritas NetBackup, validates Azure snapshots, confirms S3 replication, logs results in ServiceNow, and escalates failures via PagerDuty.

naftiko: "0.5"
info:
  label: "Multi-Cloud Backup Verification"
  description: "Checks backup status in Veritas NetBackup, validates Azure snapshots, confirms S3 replication, logs results in ServiceNow, and escalates failures via PagerDuty."
  tags:
    - infrastructure
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: multi_cloud_backup_verification
          description: "Orchestrate multi-cloud backup verification workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: check-netbackup
              type: call
              call: "netbackup.get-job-status"
              with:
                policy_name: "{{resource_id}}"
            - name: check-azure
              type: call
              call: "azure.get-snapshot-status"
              with:
                resource_group: "{{resource_id}}"
            - name: log-results
              type: call
              call: "servicenow.create-record"
              with:
                table: "backup_verifications"
                policy: "{{resource_id}}"
            - name: escalate
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Backup verification: {{resource_id}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-operation
              method: POST

On new hire creation in PeopleSoft, opens a ServiceNow onboarding ticket, provisions an Azure AD account, shares a SharePoint onboarding folder, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "On new hire creation in PeopleSoft, opens a ServiceNow onboarding ticket, provisions an Azure AD account, shares a SharePoint onboarding folder, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - peoplesoft
    - servicenow
    - azure-active-directory
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a PeopleSoft employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Azure AD, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The PeopleSoft employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department or business unit the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "peoplesoft.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-ad-account
              type: call
              call: "azuread.create-user"
              with:
                displayName: "{{get-employee.full_name}}"
                userPrincipalName: "{{get-employee.work_email}}"
                department: "{{department}}"
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to AbbVie, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents are ready at {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: peoplesoft
      baseUri: "https://abbvie-hr.peoplesoft.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_user"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: employees
          path: "/employees/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries New Relic for application error rate metrics over a specified time window. Used by engineering teams to monitor error trends for AbbVie's patient portal and commercial applications.

naftiko: "0.5"
info:
  label: "New Relic Application Error Rate"
  description: "Queries New Relic for application error rate metrics over a specified time window. Used by engineering teams to monitor error trends for AbbVie's patient portal and commercial applications."
  tags:
    - devops
    - apm
    - new-relic
    - error-monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-error-rate
          description: "Query New Relic for application error rate by app ID and time window."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic application ID."
            - name: time_window
              in: body
              type: string
              description: "Time window for the query (e.g., last_30_minutes)."
          call: "newrelic.get-app-metrics"
          with:
            app_id: "{{app_id}}"
            time_window: "{{time_window}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
        header: "Api-Key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}/metrics/data.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET

Retrieves an Okta user profile by email or user ID. Used by IT security to verify identity and access status for AbbVie employees.

naftiko: "0.5"
info:
  label: "Okta User Lookup"
  description: "Retrieves an Okta user profile by email or user ID. Used by IT security to verify identity and access status for AbbVie employees."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user
          description: "Look up an Okta user by email or ID."
          inputParameters:
            - name: user_identifier
              in: body
              type: string
              description: "Email or Okta user ID."
          call: "okta.get-user"
          with:
            user_identifier: "{{user_identifier}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://abbvie.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization"
      resources:
        - name: users
          path: "/users/{{user_identifier}}"
          inputParameters:
            - name: user_identifier
              in: path
          operations:
            - name: get-user
              method: GET

Pulls cost and usage data from Oracle Cloud for a given compartment and date range, formats a summary, and posts it to a Confluence finance report page for budget tracking.

naftiko: "0.5"
info:
  label: "Oracle Cloud Infrastructure Cost Report"
  description: "Pulls cost and usage data from Oracle Cloud for a given compartment and date range, formats a summary, and posts it to a Confluence finance report page for budget tracking."
  tags:
    - finance
    - cloud
    - oracle-cloud
    - confluence
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finance
      port: 8080
      tools:
        - name: generate-cost-report
          description: "Given an OCI compartment and date range, pull cost data and publish a Confluence report."
          inputParameters:
            - name: compartment_id
              in: body
              type: string
              description: "Oracle Cloud compartment OCID."
            - name: start_date
              in: body
              type: string
              description: "Report start date (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date (YYYY-MM-DD)."
          steps:
            - name: get-cost-data
              type: call
              call: "oci.get-usage"
              with:
                compartment_id: "{{compartment_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CLOUDFINANCE"
                title: "OCI Cost Report: {{compartment_id}} ({{start_date}} to {{end_date}})"
                body: "Compartment: {{compartment_id}}\nPeriod: {{start_date}} to {{end_date}}\nTotal Cost: {{get-cost-data.total_cost}} {{get-cost-data.currency}}\nCompute: {{get-cost-data.compute_cost}}\nStorage: {{get-cost-data.storage_cost}}\nNetwork: {{get-cost-data.network_cost}}"
  consumes:
    - type: http
      namespace: oci
      baseUri: "https://usagereports.us-ashburn-1.oci.oraclecloud.com/20200107"
      authentication:
        type: bearer
        token: "$secrets.oci_token"
      resources:
        - name: usage
          path: "/usage"
          operations:
            - name: get-usage
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves details about a PagerDuty incident by ID including current status, assignees, and escalation level. Used by on-call engineers at AbbVie.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Lookup"
  description: "Retrieves details about a PagerDuty incident by ID including current status, assignees, and escalation level. Used by on-call engineers at AbbVie."
  tags:
    - devops
    - pagerduty
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a PagerDuty incident by ID."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The PagerDuty incident ID."
          call: "pagerduty.get-incident"
          with:
            incident_id: "{{incident_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET

Queries Palo Alto Networks firewall for a specific security rule by name. Used by network security teams to audit firewall configurations protecting AbbVie's data center and cloud perimeters.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Rule Lookup"
  description: "Queries Palo Alto Networks firewall for a specific security rule by name. Used by network security teams to audit firewall configurations protecting AbbVie's data center and cloud perimeters."
  tags:
    - security
    - network
    - palo-alto-networks
    - firewall
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto Networks security rule by name."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "Name of the firewall security rule."
          call: "paloalto.get-security-rule"
          with:
            rule_name: "{{rule_name}}"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://firewall.abbvie.com/restapi/v10.2"
      authentication:
        type: apiKey
        key: "$secrets.paloalto_api_key"
        header: "X-PAN-KEY"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules"
          inputParameters:
            - name: rule_name
              in: query
          operations:
            - name: get-security-rule
              method: GET

When a patient applies for AbbVie's assistance program, verifies eligibility via Salesforce, creates a case in ServiceNow, stores consent documents in Box, and sends confirmation via Microsoft Teams to the patient services team.

naftiko: "0.5"
info:
  label: "Patient Assistance Program Enrollment"
  description: "When a patient applies for AbbVie's assistance program, verifies eligibility via Salesforce, creates a case in ServiceNow, stores consent documents in Box, and sends confirmation via Microsoft Teams to the patient services team."
  tags:
    - patient-services
    - enrollment
    - salesforce
    - servicenow
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: patient-services
      port: 8080
      tools:
        - name: enroll-patient
          description: "Given a patient application, verify eligibility, create a case, store documents, and notify the patient services team."
          inputParameters:
            - name: patient_id
              in: body
              type: string
              description: "Anonymized patient identifier."
            - name: program_code
              in: body
              type: string
              description: "Assistance program code."
            - name: product_name
              in: body
              type: string
              description: "AbbVie product the patient needs assistance with."
            - name: prescriber_npi
              in: body
              type: string
              description: "Prescribing physician NPI number."
          steps:
            - name: check-eligibility
              type: call
              call: "salesforce.get-eligibility"
              with:
                patient_id: "{{patient_id}}"
                program_code: "{{program_code}}"
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "PAP Enrollment: {{patient_id}} — {{product_name}}"
                category: "patient_assistance"
                assigned_group: "Patient_Services"
                description: "Patient: {{patient_id}}. Program: {{program_code}}. Product: {{product_name}}. Prescriber NPI: {{prescriber_npi}}. Eligibility: {{check-eligibility.status}}."
            - name: store-consent
              type: call
              call: "box.create-folder"
              with:
                parent_folder_id: "patient_assistance_root"
                folder_name: "PAP_{{patient_id}}_{{program_code}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "patient-services"
                text: "PAP Enrollment: Patient {{patient_id}} for {{product_name}} ({{program_code}}). Eligibility: {{check-eligibility.status}}. Case: {{create-case.number}}. Docs: {{store-consent.url}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: eligibility
          path: "/sobjects/Eligibility__c/{{patient_id}}"
          inputParameters:
            - name: patient_id
              in: path
          operations:
            - name: get-eligibility
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.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: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

On new patient enrollment, verifies insurance, creates Salesforce Health Cloud record, provisions a ServiceNow case, and sends confirmation via Twilio.

naftiko: "0.5"
info:
  label: "Patient Hub Enrollment Orchestrator"
  description: "On new patient enrollment, verifies insurance, creates Salesforce Health Cloud record, provisions a ServiceNow case, and sends confirmation via Twilio."
  tags:
    - patient-services
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: patient_hub_enrollment_orchestrator
          description: "Orchestrate patient hub enrollment orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: verify-insurance
              type: call
              call: "availity.check-eligibility"
              with:
                patient_id: "{{resource_id}}"
            - name: create-record
              type: call
              call: "salesforce.create-patient"
              with:
                patient_id: "{{resource_id}}"
                eligibility: "{{verify-insurance.status}}"
            - name: create-case
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Patient enrollment: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "patient-services"
                text: "Patient {{resource_id}} enrolled. Case: {{create-case.number}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Detects safety signals in ARGUS, queries adverse event records in Snowflake, creates a Jira ticket for the safety team, and notifies pharmacovigilance leadership in Teams.

naftiko: "0.5"
info:
  label: "Pharmacovigilance Signal Detection Pipeline"
  description: "Detects safety signals in ARGUS, queries adverse event records in Snowflake, creates a Jira ticket for the safety team, and notifies pharmacovigilance leadership in Teams."
  tags:
    - pharmacovigilance
    - safety
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: pharmacovigilance_signal_detection_pipel
          description: "Orchestrate pharmacovigilance signal detection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-signal-data
              type: call
              call: "argus.get-signal"
              with:
                signal_id: "{{resource_id}}"
            - name: run-ae-analysis
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT * FROM adverse_events WHERE signal_id = '{{resource_id}}'"
                warehouse: "PHARMA_WH"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "PV"
                summary: "Safety signal: {{get-signal-data.signal_type}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "pharmacovigilance"
                text: "Signal {{resource_id}}: {{get-signal-data.signal_type}}. Ticket: {{create-ticket.key}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Assigns a Pluralsight learning path to an employee for GxP training compliance, logs the assignment in PeopleSoft, and notifies the employee and their manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight Learning Assignment"
  description: "Assigns a Pluralsight learning path to an employee for GxP training compliance, logs the assignment in PeopleSoft, and notifies the employee and their manager via Microsoft Teams."
  tags:
    - hr
    - training
    - learning
    - pluralsight
    - peoplesoft
    - microsoft-teams
    - gxp
capability:
  exposes:
    - type: mcp
      namespace: learning-mgmt
      port: 8080
      tools:
        - name: assign-learning-path
          description: "Given an employee ID and learning path, create the Pluralsight assignment, log in PeopleSoft, and notify via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "PeopleSoft employee ID."
            - name: learning_path_id
              in: body
              type: string
              description: "Pluralsight learning path ID."
            - name: due_date
              in: body
              type: string
              description: "Assignment due date (YYYY-MM-DD)."
            - name: compliance_type
              in: body
              type: string
              description: "Compliance category (e.g., GxP, SOX, HIPAA)."
          steps:
            - name: get-employee
              type: call
              call: "peoplesoft.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: create-assignment
              type: call
              call: "pluralsight.assign-path"
              with:
                user_email: "{{get-employee.work_email}}"
                path_id: "{{learning_path_id}}"
                due_date: "{{due_date}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "New training assignment: {{create-assignment.path_name}} ({{compliance_type}}). Due: {{due_date}}. Start here: {{create-assignment.url}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Training assigned to {{get-employee.full_name}}: {{create-assignment.path_name}} ({{compliance_type}}). Due: {{due_date}}."
  consumes:
    - type: http
      namespace: peoplesoft
      baseUri: "https://abbvie-hr.peoplesoft.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_user"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: employees
          path: "/employees/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: assignments
          path: "/assignments"
          operations:
            - name: assign-path
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a dataset refresh in Power BI for a specified workspace and dataset. Used by analytics teams to ensure pharma sales dashboards reflect the latest data from Teradata.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh Trigger"
  description: "Triggers a dataset refresh in Power BI for a specified workspace and dataset. Used by analytics teams to ensure pharma sales dashboards reflect the latest data from Teradata."
  tags:
    - analytics
    - business-intelligence
    - power-bi
    - data-refresh
capability:
  exposes:
    - type: mcp
      namespace: bi-analytics
      port: 8080
      tools:
        - name: refresh-dataset
          description: "Trigger a Power BI dataset refresh for a given workspace and dataset ID."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          call: "powerbi.refresh-dataset"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Queries active Prometheus alerts for a given alertname pattern. Used by SRE teams to check alert states for AbbVie's microservices running on Azure Kubernetes Service.

naftiko: "0.5"
info:
  label: "Prometheus Alert Query"
  description: "Queries active Prometheus alerts for a given alertname pattern. Used by SRE teams to check alert states for AbbVie's microservices running on Azure Kubernetes Service."
  tags:
    - devops
    - monitoring
    - prometheus
    - sre
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-active-alerts
          description: "Query Prometheus for active alerts matching a given alertname pattern."
          inputParameters:
            - name: alertname
              in: body
              type: string
              description: "Alert name or pattern to query."
          call: "prometheus.get-alerts"
          with:
            alertname: "{{alertname}}"
  consumes:
    - type: http
      namespace: prometheus
      baseUri: "https://prometheus.abbvie.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: alerts
          path: "/alerts"
          inputParameters:
            - name: alertname
              in: query
          operations:
            - name: get-alerts
              method: GET

Retrieves the status and findings summary of a Qualys vulnerability scan by scan reference. Used by information security teams at AbbVie.

naftiko: "0.5"
info:
  label: "Qualys Vulnerability Scan Status"
  description: "Retrieves the status and findings summary of a Qualys vulnerability scan by scan reference. Used by information security teams at AbbVie."
  tags:
    - security
    - qualys
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-scan-status
          description: "Look up a Qualys vulnerability scan by reference ID."
          inputParameters:
            - name: scan_ref
              in: body
              type: string
              description: "The Qualys scan reference."
          call: "qualys.get-scan"
          with:
            scan_ref: "{{scan_ref}}"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/2.0"
      authentication:
        type: basic
        username: "$secrets.qualys_user"
        password: "$secrets.qualys_password"
      resources:
        - name: scans
          path: "/fo/scan/{{scan_ref}}"
          inputParameters:
            - name: scan_ref
              in: path
          operations:
            - name: get-scan
              method: GET

Extracts claims data from Teradata, links to clinical outcomes in Snowflake, runs models via Databricks, and notifies the HEOR team in Teams.

naftiko: "0.5"
info:
  label: "Real World Evidence Data Pipeline"
  description: "Extracts claims data from Teradata, links to clinical outcomes in Snowflake, runs models via Databricks, and notifies the HEOR team in Teams."
  tags:
    - heor
    - teradata
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: real_world_evidence_data_pipeline
          description: "Orchestrate real world evidence data pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: extract-claims
              type: call
              call: "teradata.run-query"
              with:
                sql_query: "SELECT * FROM claims WHERE study = '{{resource_id}}'"
            - name: link-outcomes
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT * FROM outcomes WHERE study = '{{resource_id}}'"
                warehouse: "HEOR_WH"
            - name: run-model
              type: call
              call: "databricks.run-job"
              with:
                job_id: "rwe_{{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "heor"
                text: "RWE pipeline complete for {{resource_id}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Queries Redis cluster info to check memory usage, connected clients, and replication status. Used by platform teams to monitor caching layers for AbbVie's high-throughput applications.

naftiko: "0.5"
info:
  label: "Redis Cache Health Check"
  description: "Queries Redis cluster info to check memory usage, connected clients, and replication status. Used by platform teams to monitor caching layers for AbbVie's high-throughput applications."
  tags:
    - devops
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cache-ops
      port: 8080
      tools:
        - name: get-cache-health
          description: "Retrieve Redis cluster health metrics including memory, clients, and replication status."
          inputParameters:
            - name: cluster_endpoint
              in: body
              type: string
              description: "Redis cluster endpoint identifier."
          call: "redis.get-info"
          with:
            cluster_endpoint: "{{cluster_endpoint}}"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis-mgmt.abbvie.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_mgmt_token"
      resources:
        - name: cluster-info
          path: "/clusters/{{cluster_endpoint}}/info"
          inputParameters:
            - name: cluster_endpoint
              in: path
          operations:
            - name: get-info
              method: GET

Monitors document readiness in Veeva Vault, validates against checklists in SharePoint, submits to the eCTD gateway, and logs status in ServiceNow.

naftiko: "0.5"
info:
  label: "Regulatory Document Submission Tracker"
  description: "Monitors document readiness in Veeva Vault, validates against checklists in SharePoint, submits to the eCTD gateway, and logs status in ServiceNow."
  tags:
    - regulatory
    - veeva
    - sharepoint
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: regulatory_document_submission_tracker
          description: "Orchestrate regulatory document submission tracker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-docs
              type: call
              call: "veeva.get-submission-docs"
              with:
                submission_id: "{{resource_id}}"
            - name: validate
              type: call
              call: "sharepoint.get-checklist"
              with:
                site_id: "regulatory"
                path: "checklists/{{resource_id}}"
            - name: submit
              type: call
              call: "ectd.submit-package"
              with:
                submission_id: "{{resource_id}}"
            - name: log-status
              type: call
              call: "servicenow.create-record"
              with:
                table: "regulatory_submissions"
                submission_id: "{{resource_id}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST

Assembles a regulatory submission package by pulling the latest approved documents from SharePoint, generating a submission manifest in Confluence, and notifying the regulatory affairs team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Submission Document Assembly"
  description: "Assembles a regulatory submission package by pulling the latest approved documents from SharePoint, generating a submission manifest in Confluence, and notifying the regulatory affairs team in Microsoft Teams."
  tags:
    - regulatory
    - submission
    - sharepoint
    - confluence
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: regulatory-affairs
      port: 8080
      tools:
        - name: assemble-submission
          description: "Given a submission ID and product code, pull approved documents from SharePoint, create a Confluence manifest page, and notify the regulatory team."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "The regulatory submission identifier."
            - name: product_code
              in: body
              type: string
              description: "The AbbVie product code for the submission."
            - name: target_agency
              in: body
              type: string
              description: "Target regulatory agency (e.g., FDA, EMA, PMDA)."
          steps:
            - name: get-documents
              type: call
              call: "sharepoint.list-folder"
              with:
                site_id: "regulatory_submissions"
                folder_path: "Submissions/{{product_code}}/{{submission_id}}"
            - name: create-manifest
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REG"
                title: "Submission Manifest: {{submission_id}} — {{product_code}} ({{target_agency}})"
                body: "Submission: {{submission_id}}\nProduct: {{product_code}}\nAgency: {{target_agency}}\nDocuments: {{get-documents.file_count}} files\nAssembled: {{get-documents.folder_url}}"
            - name: notify-reg-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "regulatory-affairs"
                text: "Submission package assembled: {{submission_id}} for {{product_code}} ({{target_agency}}). {{get-documents.file_count}} documents ready. Manifest: {{create-manifest.url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folder-contents
          path: "/{{site_id}}/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Triggers GitHub Actions workflow, monitors build, deploys to staging via ArgoCD, runs smoke tests, and promotes to production after Slack approval.

naftiko: "0.5"
info:
  label: "Release Management Deployment Pipeline"
  description: "Triggers GitHub Actions workflow, monitors build, deploys to staging via ArgoCD, runs smoke tests, and promotes to production after Slack approval."
  tags:
    - devops
    - github
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: release_management_deployment_pipeline
          description: "Orchestrate release management deployment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: trigger-build
              type: call
              call: "github.trigger-workflow"
              with:
                repo: "{{resource_id}}"
                workflow: "release.yml"
            - name: deploy-staging
              type: call
              call: "argocd.sync-app"
              with:
                app_name: "{{resource_id}}-staging"
            - name: run-tests
              type: call
              call: "postman.run-collection"
              with:
                collection_id: "{{resource_id}}_smoke"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "releases"
                text: "Release {{resource_id}} deployed to staging. Tests: {{run-tests.status}}"

  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Extracts research data from Oracle, loads into Snowflake, runs quality checks, catalogs in Alation, and notifies data science in Slack.

naftiko: "0.5"
info:
  label: "Research Data Lake Ingestion Pipeline"
  description: "Extracts research data from Oracle, loads into Snowflake, runs quality checks, catalogs in Alation, and notifies data science in Slack."
  tags:
    - data-engineering
    - oracle
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: research_data_lake_ingestion_pipeline
          description: "Orchestrate research data lake ingestion pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: extract-data
              type: call
              call: "oracle.extract-table"
              with:
                table_name: "{{resource_id}}"
            - name: load-data
              type: call
              call: "snowflake.load-data"
              with:
                source_ref: "{{extract-data.file_uri}}"
            - name: run-dq
              type: call
              call: "greatexpectations.validate"
              with:
                suite: "{{resource_id}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "data-science"
                text: "Ingestion complete: {{resource_id}}. DQ: {{run-dq.success_percent}}%"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-operation
              method: POST

Retrieves a Salesforce opportunity by ID including stage, amount, close date, and account name. Used by commercial teams to check deal status for AbbVie therapeutic areas.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID including stage, amount, close date, and account name. Used by commercial teams to check deal status for AbbVie therapeutic areas."
  tags:
    - sales
    - crm
    - salesforce
    - commercial
capability:
  exposes:
    - type: mcp
      namespace: sales-crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID and return its stage, amount, close date, and account."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbvie.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

Retrieves invoice from SAP, matches against PO and goods receipt, flags discrepancies, routes for approval in ServiceNow, and posts journal entry.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match"
  description: "Retrieves invoice from SAP, matches against PO and goods receipt, flags discrepancies, routes for approval in ServiceNow, and posts journal entry."
  tags:
    - finance
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: sap_invoice_three_way_match
          description: "Orchestrate sap invoice three-way match workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_id: "{{resource_id}}"
            - name: get-po
              type: call
              call: "sap.get-purchase-order"
              with:
                po_number: "{{get-invoice.po_number}}"
            - name: create-approval
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Invoice approval: {{resource_id}}"
                amount: "{{get-invoice.amount}}"
            - name: post-entry
              type: call
              call: "sap.post-journal-entry"
              with:
                invoice_id: "{{resource_id}}"
                status: "{{create-approval.state}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST

Looks up a SAP purchase order by number and returns header status, vendor, total value, and delivery date. Used by procurement teams to check PO health for pharmaceutical raw materials and packaging.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP purchase order by number and returns header status, vendor, total value, and delivery date. Used by procurement teams to check PO health for pharmaceutical raw materials and packaging."
  tags:
    - procurement
    - erp
    - sap
    - purchase-order
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (10-digit)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Extracts GL data from SAP S/4HANA, validates against business rules, loads into Snowflake, triggers Power BI refresh, and logs sync status in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP to Snowflake Financial Sync"
  description: "Extracts GL data from SAP S/4HANA, validates against business rules, loads into Snowflake, triggers Power BI refresh, and logs sync status in ServiceNow."
  tags:
    - finance
    - sap
    - snowflake
    - power-bi
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: sap_to_snowflake_financial_sync
          description: "Orchestrate sap to snowflake financial sync workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: extract-gl
              type: call
              call: "sap.extract-gl-data"
              with:
                period: "{{resource_id}}"
            - name: load-snowflake
              type: call
              call: "snowflake.load-data"
              with:
                source_ref: "{{extract-gl.file_uri}}"
                schema: "finance"
            - name: refresh-bi
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "financial_reporting"
            - name: log-sync
              type: call
              call: "servicenow.create-record"
              with:
                table: "data_syncs"
                period: "{{resource_id}}"
                status: "complete"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST

On SIEM alert in Splunk, enriches with CrowdStrike threat intel, creates a PagerDuty incident, blocks IP in firewall, and documents in ServiceNow.

naftiko: "0.5"
info:
  label: "Security Incident Response Pipeline"
  description: "On SIEM alert in Splunk, enriches with CrowdStrike threat intel, creates a PagerDuty incident, blocks IP in firewall, and documents in ServiceNow."
  tags:
    - security
    - splunk
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: security_incident_response_pipeline
          description: "Orchestrate security incident response pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-alert
              type: call
              call: "splunk.get-alert"
              with:
                alert_id: "{{resource_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Security alert: {{get-alert.rule_name}}"
            - name: document
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security: {{get-alert.rule_name}}"
                description: "Alert {{resource_id}}"

  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://abbvie-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk-operation
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST

Retrieves a ServiceNow incident by number and returns its state, priority, assigned group, and short description. Used across AbbVie IT teams for quick incident triage.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns its state, priority, assigned group, and short description. Used across AbbVie IT teams for quick incident triage."
  tags:
    - it-service
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-service
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Sends a message to a specified Slack channel. Used by automation workflows to notify teams about pipeline events and alerts.

naftiko: "0.5"
info:
  label: "Slack Channel Message Sender"
  description: "Sends a message to a specified Slack channel. Used by automation workflows to notify teams about pipeline events and alerts."
  tags:
    - collaboration
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: send-message
          description: "Send a message to a Slack channel."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The Slack channel name or ID."
            - name: text
              in: body
              type: string
              description: "The message text."
          call: "slack.send-message"
          with:
            channel: "{{channel}}"
            text: "{{text}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: send-message
              method: POST

Executes a read-only SQL query against AbbVie's Snowflake data warehouse and returns results. Used by analytics teams for ad-hoc reporting on clinical and commercial data.

naftiko: "0.5"
info:
  label: "Snowflake Query Runner"
  description: "Executes a read-only SQL query against AbbVie's Snowflake data warehouse and returns results. Used by analytics teams for ad-hoc reporting on clinical and commercial data."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Execute a SQL query against Snowflake and return the result set."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The SQL query to execute."
            - name: warehouse
              in: body
              type: string
              description: "Snowflake warehouse name."
          call: "snowflake.run-query"
          with:
            sql_query: "{{sql_query}}"
            warehouse: "{{warehouse}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Pulls engagement metrics from LinkedIn, Facebook, and Instagram for an AbbVie brand campaign, aggregates the data, and publishes a summary report to Confluence for the digital marketing team.

naftiko: "0.5"
info:
  label: "Social Media Brand Monitoring"
  description: "Pulls engagement metrics from LinkedIn, Facebook, and Instagram for an AbbVie brand campaign, aggregates the data, and publishes a summary report to Confluence for the digital marketing team."
  tags:
    - marketing
    - social-media
    - linkedin
    - facebook
    - instagram
    - confluence
    - brand-monitoring
capability:
  exposes:
    - type: mcp
      namespace: social-media
      port: 8080
      tools:
        - name: generate-social-report
          description: "Given a campaign identifier, pull engagement data from LinkedIn, Facebook, and Instagram, then publish a consolidated report."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Internal campaign identifier."
            - name: campaign_name
              in: body
              type: string
              description: "Campaign display name."
            - name: date_range
              in: body
              type: string
              description: "Reporting date range."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-facebook-metrics
              type: call
              call: "facebook.get-campaign-insights"
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-instagram-metrics
              type: call
              call: "instagram.get-media-insights"
              with:
                campaign_id: "{{campaign_id}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "DIGITAL"
                title: "Social Media Report: {{campaign_name}} — {{date_range}}"
                body: "Campaign: {{campaign_name}}\n\nLinkedIn — Impressions: {{get-linkedin-metrics.impressions}}, Clicks: {{get-linkedin-metrics.clicks}}, Engagement Rate: {{get-linkedin-metrics.engagement_rate}}\n\nFacebook — Reach: {{get-facebook-metrics.reach}}, Clicks: {{get-facebook-metrics.clicks}}, Reactions: {{get-facebook-metrics.reactions}}\n\nInstagram — Impressions: {{get-instagram-metrics.impressions}}, Likes: {{get-instagram-metrics.likes}}, Comments: {{get-instagram-metrics.comments}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/adAnalyticsV2"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: facebook
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_token"
      resources:
        - name: insights
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-insights
              method: GET
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: media-insights
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-media-insights
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://abbvie.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Checks the quality gate status for a SonarQube project. Used by AbbVie engineering teams to validate code quality before merging changes to GxP-validated systems.

naftiko: "0.5"
info:
  label: "SonarQube Code Quality Gate Check"
  description: "Checks the quality gate status for a SonarQube project. Used by AbbVie engineering teams to validate code quality before merging changes to GxP-validated systems."
  tags:
    - devops
    - code-quality
    - sonarqube
    - gxp
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: check-quality-gate
          description: "Look up the quality gate status for a SonarQube project key."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
          call: "sonarqube.get-quality-gate"
          with:
            project_key: "{{project_key}}"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.abbvie.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET

Searches Splunk indexes for log entries matching a given query. Used by IT operations to investigate application errors across AbbVie's cloud infrastructure.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk indexes for log entries matching a given query. Used by IT operations to investigate application errors across AbbVie's cloud infrastructure."
  tags:
    - devops
    - logging
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: logging
      port: 8080
      tools:
        - name: search-logs
          description: "Search Splunk logs by query string and time range."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL search query."
            - name: time_range
              in: body
              type: string
              description: "Relative time range such as -1h."
          call: "splunk.search-logs"
          with:
            query: "{{query}}"
            time_range: "{{time_range}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://abbvie-splunk.com/services/search/jobs"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/export"
          operations:
            - name: search-logs
              method: POST

Retrieves metadata and preview URL for a Tableau workbook view. Used by business users to quickly access pharma analytics dashboards without logging into Tableau Server.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Viewer"
  description: "Retrieves metadata and preview URL for a Tableau workbook view. Used by business users to quickly access pharma analytics dashboards without logging into Tableau Server."
  tags:
    - analytics
    - business-intelligence
    - tableau
    - visualization
capability:
  exposes:
    - type: mcp
      namespace: bi-analytics
      port: 8080
      tools:
        - name: get-tableau-view
          description: "Look up a Tableau view by workbook and view name, returning the embed URL and last refresh time."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Tableau site ID."
            - name: view_id
              in: body
              type: string
              description: "Tableau view ID."
          call: "tableau.get-view"
          with:
            site_id: "{{site_id}}"
            view_id: "{{view_id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.abbvie.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: views
          path: "/sites/{{site_id}}/views/{{view_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: view_id
              in: path
          operations:
            - name: get-view
              method: GET

Executes a predefined analytics query against AbbVie's Teradata data warehouse and returns summary results. Used by data analysts for pharma sales and market access reporting.

naftiko: "0.5"
info:
  label: "Teradata Data Warehouse Query"
  description: "Executes a predefined analytics query against AbbVie's Teradata data warehouse and returns summary results. Used by data analysts for pharma sales and market access reporting."
  tags:
    - data-analytics
    - data-warehouse
    - teradata
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: data-warehouse
      port: 8080
      tools:
        - name: run-analytics-query
          description: "Execute a named query against Teradata and return results."
          inputParameters:
            - name: query_name
              in: body
              type: string
              description: "Name of the predefined analytics query."
            - name: parameters
              in: body
              type: string
              description: "JSON string of query parameters."
          call: "teradata.execute-query"
          with:
            query_name: "{{query_name}}"
            parameters: "{{parameters}}"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://teradata.abbvie.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
      resources:
        - name: queries
          path: "/queries/{{query_name}}/execute"
          inputParameters:
            - name: query_name
              in: path
          operations:
            - name: execute-query
              method: POST

Receives ServiceNow request, generates Terraform plans, runs security scans, applies infrastructure, registers in CMDB, and notifies requestor.

naftiko: "0.5"
info:
  label: "Terraform Environment Provisioning Orchestrator"
  description: "Receives ServiceNow request, generates Terraform plans, runs security scans, applies infrastructure, registers in CMDB, and notifies requestor."
  tags:
    - devops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: terraform_environment_provisioning_orche
          description: "Orchestrate terraform environment provisioning orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-request
              type: call
              call: "servicenow.get-request"
              with:
                request_id: "{{resource_id}}"
            - name: plan-infra
              type: call
              call: "terraform.create-plan"
              with:
                workspace: "{{get-request.workspace}}"
            - name: apply-infra
              type: call
              call: "terraform.apply-plan"
              with:
                plan_id: "{{plan-infra.plan_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "platform-eng"
                text: "Environment provisioned for {{resource_id}}: {{apply-infra.outputs}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Runs a Terraform plan via Azure DevOps pipeline, checks for infrastructure drift, and creates a ServiceNow change request if drift is detected in AbbVie's Azure environments.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Drift Detection"
  description: "Runs a Terraform plan via Azure DevOps pipeline, checks for infrastructure drift, and creates a ServiceNow change request if drift is detected in AbbVie's Azure environments."
  tags:
    - devops
    - infrastructure
    - terraform
    - azure-devops
    - servicenow
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: detect-drift
          description: "Trigger a Terraform plan in Azure DevOps and create a ServiceNow change request if drift is found."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "Azure DevOps pipeline ID for the Terraform plan."
            - name: environment
              in: body
              type: string
              description: "Target environment (dev, staging, prod)."
          steps:
            - name: trigger-plan
              type: call
              call: "azuredevops.run-pipeline"
              with:
                project: "{{project}}"
                pipeline_id: "{{pipeline_id}}"
                parameters: "{\"environment\": \"{{environment}}\"}"
            - name: create-change-request
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Terraform drift detected: {{project}} / {{environment}}"
                description: "Pipeline run {{trigger-plan.run_id}} detected infrastructure drift in {{environment}}. Review Terraform plan output and apply corrections."
                assigned_group: "Cloud_Engineering"
                category: "infrastructure"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/abbvie"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: pipelines
          path: "/{{project}}/_apis/pipelines/{{pipeline_id}}/runs"
          inputParameters:
            - name: project
              in: path
            - name: pipeline_id
              in: path
          operations:
            - name: run-pipeline
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves expiring contracts from SAP Ariba, pulls performance metrics from Snowflake, creates approval workflows in ServiceNow, and notifies procurement in Teams.

naftiko: "0.5"
info:
  label: "Vendor Contract Renewal Orchestrator"
  description: "Retrieves expiring contracts from SAP Ariba, pulls performance metrics from Snowflake, creates approval workflows in ServiceNow, and notifies procurement in Teams."
  tags:
    - procurement
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: vendor_contract_renewal_orchestrator
          description: "Orchestrate vendor contract renewal orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-contract
              type: call
              call: "sap.get-contract"
              with:
                contract_id: "{{resource_id}}"
            - name: get-performance
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "SELECT * FROM vendor_performance WHERE contract_id = '{{resource_id}}'"
                warehouse: "PROC_WH"
            - name: create-approval
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Contract renewal: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "procurement"
                text: "Contract {{resource_id}} renewal. Approval: {{create-approval.number}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abbvie-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-operation
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abbvie.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-operation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-operation
              method: POST

Checks the status of a Veritas NetBackup job for GxP-validated system backups. Used by infrastructure teams to verify backup compliance for FDA-regulated environments.

naftiko: "0.5"
info:
  label: "Veritas NetBackup Job Status"
  description: "Checks the status of a Veritas NetBackup job for GxP-validated system backups. Used by infrastructure teams to verify backup compliance for FDA-regulated environments."
  tags:
    - infrastructure
    - backup
    - veritas-netbackup
    - compliance
    - gxp
capability:
  exposes:
    - type: mcp
      namespace: backup-ops
      port: 8080
      tools:
        - name: get-backup-status
          description: "Look up a NetBackup job by ID and return its status, start time, and data transferred."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "Veritas NetBackup job ID."
          call: "netbackup.get-job"
          with:
            job_id: "{{job_id}}"
  consumes:
    - type: http
      namespace: netbackup
      baseUri: "https://netbackup.abbvie.com/netbackup/admin/v3"
      authentication:
        type: bearer
        token: "$secrets.netbackup_token"
      resources:
        - name: jobs
          path: "/jobs/{{job_id}}"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET

Creates a snapshot of a VMware virtual machine before a GxP system maintenance window, logs the snapshot in ServiceNow as a change task, and notifies the infrastructure team.

naftiko: "0.5"
info:
  label: "VMware VM Snapshot Management"
  description: "Creates a snapshot of a VMware virtual machine before a GxP system maintenance window, logs the snapshot in ServiceNow as a change task, and notifies the infrastructure team."
  tags:
    - infrastructure
    - virtualization
    - vmware
    - servicenow
    - microsoft-teams
    - gxp
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: create-vm-snapshot
          description: "Given a VM name and change ticket, create a VMware snapshot, update the ServiceNow change task, and notify the infra team."
          inputParameters:
            - name: vm_name
              in: body
              type: string
              description: "VMware virtual machine name."
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change request number."
            - name: snapshot_description
              in: body
              type: string
              description: "Description for the snapshot."
          steps:
            - name: create-snapshot
              type: call
              call: "vmware.create-snapshot"
              with:
                vm_name: "{{vm_name}}"
                description: "{{snapshot_description}}"
            - name: update-change
              type: call
              call: "servicenow.update-change"
              with:
                change_number: "{{change_number}}"
                work_notes: "VM snapshot created for {{vm_name}}. Snapshot ID: {{create-snapshot.snapshot_id}}. Timestamp: {{create-snapshot.created_at}}"
            - name: notify-infra
              type: call
              call: "msteams.send-message"
              with:
                channel: "infrastructure-ops"
                text: "VM Snapshot: {{vm_name}} — Snapshot {{create-snapshot.snapshot_id}} created for change {{change_number}}. Ready for maintenance."
  consumes:
    - type: http
      namespace: vmware
      baseUri: "https://vcenter.abbvie.com/rest/vcenter"
      authentication:
        type: bearer
        token: "$secrets.vmware_session_token"
      resources:
        - name: snapshots
          path: "/vm/{{vm_name}}/snapshots"
          inputParameters:
            - name: vm_name
              in: path
          operations:
            - name: create-snapshot
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: update-change
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Pulls open vulnerabilities from Qualys, correlates with ServiceNow CMDB assets, creates remediation tasks in Jira, and tracks SLA in Grafana.

naftiko: "0.5"
info:
  label: "Vulnerability Remediation Tracker"
  description: "Pulls open vulnerabilities from Qualys, correlates with ServiceNow CMDB assets, creates remediation tasks in Jira, and tracks SLA in Grafana."
  tags:
    - security
    - qualys
    - servicenow
    - jira
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: abbvie
      port: 8080
      tools:
        - name: vulnerability_remediation_tracker
          description: "Orchestrate vulnerability remediation tracker workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-vulns
              type: call
              call: "qualys.get-vulnerabilities"
              with:
                scan_id: "{{resource_id}}"
            - name: get-assets
              type: call
              call: "servicenow.get-cmdb-ci"
              with:
                ip_address: "{{get-vulns.affected_ip}}"
            - name: create-remediation
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Remediate: {{get-vulns.cve_id}} on {{get-assets.name}}"
            - name: update-dashboard
              type: call
              call: "grafana.annotate"
              with:
                dashboard_uid: "vuln-tracking"
                text: "New remediation: {{create-remediation.key}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbvie.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-operation
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abbvie.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-operation
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://abbvie-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-operation
              method: POST

Retrieves employee profile information from Workday by employee ID. Used by HR teams at AbbVie to verify employment details and org structure.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile information from Workday by employee ID. Used by HR teams at AbbVie to verify employment details and org structure."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up a Workday employee by ID and return profile details."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-employee"
          with:
            employee_id: "{{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abbvie"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET

Retrieves a Zendesk support ticket by ID including status, priority, assignee, and subject. Used by AbbVie patient services and IT help desk teams.

naftiko: "0.5"
info:
  label: "Zendesk Support Ticket Lookup"
  description: "Retrieves a Zendesk support ticket by ID including status, priority, assignee, and subject. Used by AbbVie patient services and IT help desk teams."
  tags:
    - support
    - customer-service
    - zendesk
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: get-ticket
          description: "Look up a Zendesk ticket by ID and return its status, priority, assignee, and subject."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
          call: "zendesk.get-ticket"
          with:
            ticket_id: "{{ticket_id}}"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://abbvie.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET