Eli Lilly Capabilities

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

Sort
Expand

Reviews access at Eli Lilly via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at Eli Lilly via Okta, IAM, and Jira."
  tags:
    - security
    - access-management
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review
          description: "Review access at Eli Lilly."
          inputParameters:
            - name: dept
              in: body
              type: string
              description: "Department."
          steps:
            - name: ent
              type: call
              call: "okta.get-users"
              with:
                dept: "{{dept}}"
            - name: compare
              type: call
              call: "iam.compare"
              with:
                data: "{{ent.data}}"
            - name: flag
              type: call
              call: "iam.flag"
              with:
                violations: "{{compare.violations}}"
            - name: fix
              type: call
              call: "jira.create-issue"
              with:
                project: "IAM"
                summary: "Violations in {{dept}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lilly.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: iam
      baseUri: "https://iam.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iam_token"
      resources:
        - name: reviews
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Receives an adverse event report, logs it in ServiceNow as a pharmacovigilance case, stores supporting documents in Box, and notifies the safety team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Adverse Event Intake"
  description: "Receives an adverse event report, logs it in ServiceNow as a pharmacovigilance case, stores supporting documents in Box, and notifies the safety team via Microsoft Teams."
  tags:
    - pharmacovigilance
    - adverse-events
    - servicenow
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pharmacovigilance
      port: 8080
      tools:
        - name: report-adverse-event
          description: "Submit a new adverse event report with patient details and supporting documents. Creates case in ServiceNow, uploads docs to Box, and alerts safety team."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The Lilly product involved in the adverse event."
            - name: event_description
              in: body
              type: string
              description: "Narrative 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 reporter (HCP or patient)."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-pv-case"
              with:
                short_description: "AE Report: {{product_name}} - {{severity}}"
                category: "pharmacovigilance"
                description: "{{event_description}}"
                assigned_group: "Drug_Safety"
                urgency: "{{severity}}"
            - name: upload-docs
              type: call
              call: "box.upload-file"
              with:
                folder_id: "pv_case_documents"
                file_name: "AE_{{create-case.number}}_{{product_name}}.pdf"
            - name: notify-safety-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "drug_safety_team"
                channel_id: "adverse_events"
                text: "New AE case {{create-case.number}} for {{product_name}} ({{severity}}). Reporter: {{reporter_email}}. Docs: {{upload-docs.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: pv-cases
          path: "/table/u_pharmacovigilance_case"
          operations:
            - name: create-pv-case
              method: POST
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Executes pharmacovigilance aggregate reporting queries against Amazon Redshift, generating CIOMS-compatible adverse event summaries for regulatory submission.

naftiko: "0.5"
info:
  label: "Amazon Redshift Pharmacovigilance Reporting"
  description: "Executes pharmacovigilance aggregate reporting queries against Amazon Redshift, generating CIOMS-compatible adverse event summaries for regulatory submission."
  tags:
    - pharmacovigilance
    - regulatory
    - amazon-redshift
capability:
  exposes:
    - type: mcp
      namespace: pv-reporting
      port: 8080
      tools:
        - name: generate-pv-report
          description: "Generate a CIOMS-format aggregate adverse event report from Redshift for a product and reporting period."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The pharmaceutical product name."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period in YYYY-Q1 format."
          call: "redshift.execute-query"
          with:
            database: "pharmacovigilance_db"
            query: "CALL sp_cioms_report('{{product_name}}', '{{reporting_period}}')"
  consumes:
    - type: http
      namespace: redshift
      baseUri: "https://redshift-data.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_redshift_token"
      resources:
        - name: statements
          path: "/execute-statement"
          operations:
            - name: execute-query
              method: POST

Archives completed clinical trial documents to Amazon S3 with appropriate lifecycle policies, then updates the trial management system and notifies the document control team.

naftiko: "0.5"
info:
  label: "Amazon S3 Clinical Document Archive"
  description: "Archives completed clinical trial documents to Amazon S3 with appropriate lifecycle policies, then updates the trial management system and notifies the document control team."
  tags:
    - clinical-trials
    - document-management
    - amazon-s3
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-doc-archive
      port: 8080
      tools:
        - name: archive-trial-documents
          description: "Archive completed clinical trial documents to S3, update the trial management system, and notify document control."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: document_category
              in: body
              type: string
              description: "Document category: CSR, TMF, protocols, consent-forms."
            - name: source_path
              in: body
              type: string
              description: "Source path of documents to archive."
          steps:
            - name: upload-to-s3
              type: call
              call: "s3.put-object"
              with:
                bucket: "lilly-clinical-archives"
                key: "{{trial_id}}/{{document_category}}/archive.zip"
                source: "{{source_path}}"
            - name: update-tmf
              type: call
              call: "servicenow.update-record"
              with:
                table: "u_trial_master_file"
                query: "trial_id={{trial_id}}"
                archive_status: "completed"
                archive_location: "s3://lilly-clinical-archives/{{trial_id}}/{{document_category}}"
            - name: notify-doc-control
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "document_control"
                channel_id: "archives"
                text: "Trial {{trial_id}} {{document_category}} documents archived to S3. TMF record updated."
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{bucket}}/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Launches an Amazon SageMaker training job for a preclinical toxicology prediction model, then registers the model and notifies the preclinical team.

naftiko: "0.5"
info:
  label: "Amazon SageMaker Toxicology Model Trainer"
  description: "Launches an Amazon SageMaker training job for a preclinical toxicology prediction model, then registers the model and notifies the preclinical team."
  tags:
    - drug-development
    - toxicology
    - amazon-sagemaker
    - amazon-s3
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tox-model-training
      port: 8080
      tools:
        - name: train-tox-model
          description: "Launch a SageMaker training job for a toxicology prediction model using preclinical data from S3."
          inputParameters:
            - name: compound_id
              in: body
              type: string
              description: "The compound identifier."
            - name: training_data_uri
              in: body
              type: string
              description: "S3 URI to the training dataset."
            - name: model_type
              in: body
              type: string
              description: "Model type: hepatotoxicity, cardiotoxicity, genotoxicity."
          steps:
            - name: start-training
              type: call
              call: "sagemaker.create-training-job"
              with:
                TrainingJobName: "tox-{{compound_id}}-{{model_type}}"
                AlgorithmSpecification:
                  TrainingImage: "lilly-tox-models:latest"
                InputDataConfig:
                  S3Uri: "{{training_data_uri}}"
                OutputDataConfig:
                  S3OutputPath: "s3://lilly-models/toxicology/{{compound_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "preclinical_safety"
                channel_id: "model_training"
                text: "Toxicology model training started for compound {{compound_id}} ({{model_type}}). Job: {{start-training.TrainingJobArn}}"
  consumes:
    - type: http
      namespace: sagemaker
      baseUri: "https://api.sagemaker.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_sagemaker_token"
      resources:
        - name: training-jobs
          path: "/training-jobs"
          operations:
            - name: create-training-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the status of Apache NiFi data flows that process and route clinical trial data between EDC systems, data warehouses, and reporting platforms.

naftiko: "0.5"
info:
  label: "Apache NiFi Clinical Data Flow Status"
  description: "Checks the status of Apache NiFi data flows that process and route clinical trial data between EDC systems, data warehouses, and reporting platforms."
  tags:
    - clinical-trials
    - data-pipeline
    - apache-nifi
capability:
  exposes:
    - type: mcp
      namespace: clinical-dataflow
      port: 8080
      tools:
        - name: get-dataflow-status
          description: "Check the health and throughput of a NiFi process group handling clinical data flows."
          inputParameters:
            - name: process_group_id
              in: body
              type: string
              description: "The NiFi process group ID."
          call: "nifi.get-process-group"
          with:
            id: "{{process_group_id}}"
  consumes:
    - type: http
      namespace: nifi
      baseUri: "https://nifi.lilly.com/nifi-api"
      authentication:
        type: bearer
        token: "$secrets.nifi_token"
      resources:
        - name: process-groups
          path: "/process-groups/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-process-group
              method: GET

Triggers an Apache Spark job on Databricks for large-scale genomic data processing, supporting target identification and precision medicine research.

naftiko: "0.5"
info:
  label: "Apache Spark Genomics Pipeline"
  description: "Triggers an Apache Spark job on Databricks for large-scale genomic data processing, supporting target identification and precision medicine research."
  tags:
    - drug-development
    - genomics
    - apache-spark
    - databricks
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: genomics-pipeline
      port: 8080
      tools:
        - name: run-genomics-pipeline
          description: "Launch a Spark-based genomics processing job on Databricks for a research project."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The research project identifier."
            - name: dataset_uri
              in: body
              type: string
              description: "URI to the genomic dataset."
            - name: analysis_type
              in: body
              type: string
              description: "Analysis type: GWAS, variant-calling, gene-expression."
          steps:
            - name: submit-job
              type: call
              call: "databricks.run-job"
              with:
                job_id: "genomics_spark_pipeline"
                notebook_params:
                  project_id: "{{project_id}}"
                  input_uri: "{{dataset_uri}}"
                  analysis: "{{analysis_type}}"
            - name: notify-research
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "genomics_research"
                channel_id: "pipeline_runs"
                text: "Genomics pipeline ({{analysis_type}}) started for project {{project_id}}. Databricks run: {{submit-job.run_id}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://lilly.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Manages API deprecation at Eli Lilly via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at Eli Lilly via consumer identification, notices, and tracking."
  tags:
    - api-management
    - communications
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-sunset
      port: 8080
      tools:
        - name: notify-sunset
          description: "Manage API sunset at Eli Lilly."
          inputParameters:
            - name: api
              in: body
              type: string
              description: "API name."
            - name: date
              in: body
              type: string
              description: "Sunset date."
          steps:
            - name: consumers
              type: call
              call: "api-gw.consumers"
              with:
                api: "{{api}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{consumers.emails}}"
                subject: "{{api}} sunset: {{date}}"
            - name: track
              type: call
              call: "analytics.usage"
              with:
                api: "{{api}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Sunset {{api}} by {{date}}"
  consumes:
    - type: http
      namespace: api-gw
      baseUri: "https://api-gw.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.api_gw_token"
      resources:
        - name: consumers
          path: "/apis/{{api}}/consumers"
          inputParameters:
            - name: api
              in: path
          operations:
            - name: consumers
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: usage
          path: "/api-usage"
          operations:
            - name: usage
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks the status of Azure Data Factory pipeline runs that process clinical trial data, returning run status, duration, and error details.

naftiko: "0.5"
info:
  label: "Azure Data Factory Clinical ETL Status"
  description: "Checks the status of Azure Data Factory pipeline runs that process clinical trial data, returning run status, duration, and error details."
  tags:
    - clinical-trials
    - data-pipeline
    - azure-data-factory
capability:
  exposes:
    - type: mcp
      namespace: clinical-etl-status
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Check the status of an Azure Data Factory pipeline run for clinical data processing."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "The ADF pipeline name."
            - name: run_id
              in: body
              type: string
              description: "The pipeline run ID."
          call: "adf.get-pipeline-run"
          with:
            pipeline_name: "{{pipeline_name}}"
            run_id: "{{run_id}}"
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/lilly-clinical-rg/providers/Microsoft.DataFactory/factories/lilly-clinical-adf"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipeline-runs
          path: "/pipelineruns/{{run_id}}?api-version=2018-06-01"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-pipeline-run
              method: GET

Checks build at Eli Lilly.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at Eli Lilly."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at Eli Lilly."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          call: "azdo.get-build"
          with:
            project: "{{project}}"
            build_id: "{{build_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/lilly.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET

Triggers an Azure DevOps CI/CD pipeline for GxP-validated system releases, including automated testing, code scanning, and deployment to a qualification environment.

naftiko: "0.5"
info:
  label: "Azure DevOps Validation Pipeline Trigger"
  description: "Triggers an Azure DevOps CI/CD pipeline for GxP-validated system releases, including automated testing, code scanning, and deployment to a qualification environment."
  tags:
    - quality
    - validation
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gxp-validation
      port: 8080
      tools:
        - name: trigger-validation-pipeline
          description: "Trigger a GxP validation pipeline in Azure DevOps for a system release."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The pipeline ID to trigger."
            - name: branch
              in: body
              type: string
              description: "The source branch for the build."
          steps:
            - name: trigger-build
              type: call
              call: "azdevops.queue-build"
              with:
                project: "{{project_name}}"
                definition_id: "{{pipeline_id}}"
                sourceBranch: "{{branch}}"
            - name: notify-qa
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "quality_engineering"
                channel_id: "validation_runs"
                text: "GxP validation pipeline triggered for {{project_name}} on branch {{branch}}. Build: {{trigger-build.id}}"
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/eli-lilly"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdevops_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?api-version=7.0"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Rotates API secrets stored in Azure Key Vault for GxP-validated systems, logging the rotation event for compliance audit trails.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Rotation"
  description: "Rotates API secrets stored in Azure Key Vault for GxP-validated systems, logging the rotation event for compliance audit trails."
  tags:
    - security
    - compliance
    - azure-key-vault
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: secret-management
      port: 8080
      tools:
        - name: rotate-secret
          description: "Rotate a secret in Azure Key Vault and log the rotation event in ServiceNow for audit compliance."
          inputParameters:
            - name: secret_name
              in: body
              type: string
              description: "The name of the secret to rotate."
            - name: vault_name
              in: body
              type: string
              description: "The Azure Key Vault name."
          steps:
            - name: create-new-version
              type: call
              call: "keyvault.set-secret"
              with:
                vault: "{{vault_name}}"
                secret_name: "{{secret_name}}"
            - name: log-rotation
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Secret rotated: {{secret_name}} in {{vault_name}}"
                category: "security_operations"
                type: "standard"
                description: "Automated secret rotation for {{secret_name}}. New version: {{create-new-version.version}}"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://{{vault}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_keyvault_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: set-secret
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.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

Deploys a pharmacokinetics/pharmacodynamics model to Azure Machine Learning, registers the model version, and triggers an endpoint refresh for real-time inference.

naftiko: "0.5"
info:
  label: "Azure ML Model Deployment for PK/PD"
  description: "Deploys a pharmacokinetics/pharmacodynamics model to Azure Machine Learning, registers the model version, and triggers an endpoint refresh for real-time inference."
  tags:
    - drug-development
    - pk-pd
    - azure-machine-learning
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pkpd-model-deployment
      port: 8080
      tools:
        - name: deploy-pkpd-model
          description: "Register and deploy a PK/PD model to Azure ML for real-time scoring. Notifies the pharmacometrics team on completion."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The model name in the Azure ML registry."
            - name: model_version
              in: body
              type: string
              description: "The model version to deploy."
            - name: compound_id
              in: body
              type: string
              description: "The compound this model supports."
          steps:
            - name: register-model
              type: call
              call: "azureml.register-model"
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
                tags:
                  compound: "{{compound_id}}"
                  type: "pkpd"
            - name: deploy-endpoint
              type: call
              call: "azureml.create-deployment"
              with:
                endpoint_name: "pkpd-{{compound_id}}"
                model_id: "{{register-model.id}}"
                instance_type: "Standard_DS3_v2"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "pharmacometrics"
                channel_id: "model_deployments"
                text: "PK/PD model {{model_name}} v{{model_version}} deployed for compound {{compound_id}}. Endpoint: {{deploy-endpoint.scoring_uri}}"
  consumes:
    - type: http
      namespace: azureml
      baseUri: "https://ml.azure.com/api/lilly-ml-workspace"
      authentication:
        type: bearer
        token: "$secrets.azure_ml_token"
      resources:
        - name: models
          path: "/models"
          operations:
            - name: register-model
              method: POST
        - name: deployments
          path: "/endpoints/{{endpoint_name}}/deployments"
          inputParameters:
            - name: endpoint_name
              in: path
          operations:
            - name: create-deployment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Verifies backups at Eli Lilly.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at Eli Lilly."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at Eli Lilly."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Searches and retrieves regulatory submission documents from Box, including INDs, NDAs, and annual reports stored in the regulatory affairs document repository.

naftiko: "0.5"
info:
  label: "Box Regulatory Document Retrieval"
  description: "Searches and retrieves regulatory submission documents from Box, including INDs, NDAs, and annual reports stored in the regulatory affairs document repository."
  tags:
    - regulatory
    - document-management
    - box
capability:
  exposes:
    - type: mcp
      namespace: regulatory-docs
      port: 8080
      tools:
        - name: search-regulatory-docs
          description: "Search for regulatory documents in Box and share the results with the regulatory team via Teams."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The pharmaceutical product name."
            - name: doc_type
              in: body
              type: string
              description: "Document type: IND, NDA, BLA, annual-report, amendment."
          steps:
            - name: find-docs
              type: call
              call: "box.search-files"
              with:
                query: "{{product_name}} {{doc_type}}"
                ancestor_folder_ids: "regulatory_submissions"
                content_types: "name,description"
            - name: share-results
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "regulatory_affairs"
                channel_id: "document_requests"
                text: "Found {{find-docs.total_count}} {{doc_type}} documents for {{product_name}} in Box."
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-files
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Analyzes budget variance at Eli Lilly via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at Eli Lilly via Oracle, Workday, and Slack."
  tags:
    - finance
    - budget
    - oracle
    - workday
capability:
  exposes:
    - type: mcp
      namespace: budget-var
      port: 8080
      tools:
        - name: analyze-variance
          description: "Check budget variance at Eli Lilly."
          inputParameters:
            - name: cc
              in: body
              type: string
              description: "Cost center."
            - name: period
              in: body
              type: string
              description: "Period."
          steps:
            - name: actuals
              type: call
              call: "oracle.get-actuals"
              with:
                cc: "{{cc}}"
                period: "{{period}}"
            - name: budget
              type: call
              call: "workday.get-budget"
              with:
                cc: "{{cc}}"
            - name: compute
              type: call
              call: "analytics.variance"
              with:
                a: "{{actuals.total}}"
                b: "{{budget.total}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Variance {{cc}}: ${{compute.variance}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/actuals"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/budgets"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Plans capacity at Eli Lilly by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at Eli Lilly by collecting utilization and forecasting."
  tags:
    - infrastructure
    - capacity-planning
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: capacity
      port: 8080
      tools:
        - name: plan-capacity
          description: "Plan capacity at Eli Lilly."
          inputParameters:
            - name: resource
              in: body
              type: string
              description: "Resource type."
            - name: months
              in: body
              type: number
              description: "Forecast months."
          steps:
            - name: util
              type: call
              call: "monitoring.get-util"
              with:
                resource: "{{resource}}"
            - name: forecast
              type: call
              call: "analytics.forecast"
              with:
                current: "{{util.pct}}"
                months: "{{months}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "capacity"
                resource: "{{resource}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "capacity"
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: util
          path: "/resources/{{resource}}/util"
          inputParameters:
            - name: resource
              in: path
          operations:
            - name: get-util
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: forecast
          path: "/demand"
          operations:
            - name: forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at Eli Lilly.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at Eli Lilly."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at Eli Lilly."
          inputParameters:
            - name: domains
              in: body
              type: string
              description: "Domains to check."
          steps:
            - name: scan
              type: call
              call: "cert-scanner.scan"
              with:
                domains: "{{domains}}"
            - name: filter
              type: call
              call: "analytics.filter-expiring"
              with:
                certs: "{{scan.results}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "{{filter.count}} certs expiring"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Cert alert: {{filter.count}} expiring"
  consumes:
    - type: http
      namespace: cert-scanner
      baseUri: "https://certs.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cert_token"
      resources:
        - name: scans
          path: "/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes changes at Eli Lilly through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at Eli Lilly through ServiceNow and CAB approval."
  tags:
    - change-management
    - servicenow
    - itil
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: process-change
          description: "Process changes at Eli Lilly."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "Change ID."
            - name: date
              in: body
              type: string
              description: "Date."
          steps:
            - name: get
              type: call
              call: "servicenow.get-change"
              with:
                id: "{{change_id}}"
            - name: conflicts
              type: call
              call: "servicenow.check-conflicts"
              with:
                date: "{{date}}"
            - name: submit
              type: call
              call: "servicenow.update"
              with:
                id: "{{change_id}}"
                state: "approval"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "cab@co.com"
                subject: "CAB: {{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Queries Circana market data for pharmaceutical product market share, prescription volume trends, and competitive landscape in a specified therapeutic area.

naftiko: "0.5"
info:
  label: "Circana Market Share Lookup"
  description: "Queries Circana market data for pharmaceutical product market share, prescription volume trends, and competitive landscape in a specified therapeutic area."
  tags:
    - commercial
    - market-intelligence
    - circana
capability:
  exposes:
    - type: mcp
      namespace: market-intelligence
      port: 8080
      tools:
        - name: get-market-share
          description: "Retrieve market share data from Circana, load into Snowflake for trend analysis, and notify the commercial insights team."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The pharmaceutical product name."
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area (e.g., diabetes, oncology)."
          steps:
            - name: pull-market-data
              type: call
              call: "circana.get-market-data"
              with:
                product: "{{product_name}}"
                category: "{{therapeutic_area}}"
            - name: load-to-snowflake
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "COMMERCIAL_WH"
                statement: "CALL sp_load_market_share('{{product_name}}', '{{therapeutic_area}}')"
            - name: notify-insights
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "commercial_insights"
                channel_id: "market_data"
                text: "Market share data refreshed for {{product_name}} in {{therapeutic_area}}. Data loaded to Snowflake."
  consumes:
    - type: http
      namespace: circana
      baseUri: "https://api.circana.com/v2/pharma"
      authentication:
        type: bearer
        token: "$secrets.circana_token"
      resources:
        - name: market-data
          path: "/market-share"
          operations:
            - name: get-market-data
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers an Apache Airflow DAG to run the clinical data ETL pipeline, pulling raw trial data from Snowflake, transforming it, and loading into the clinical data warehouse.

naftiko: "0.5"
info:
  label: "Clinical Data Pipeline Trigger"
  description: "Triggers an Apache Airflow DAG to run the clinical data ETL pipeline, pulling raw trial data from Snowflake, transforming it, and loading into the clinical data warehouse."
  tags:
    - clinical-trials
    - data-pipeline
    - apache-airflow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-pipeline
      port: 8080
      tools:
        - name: trigger-clinical-etl
          description: "Trigger the clinical data ETL pipeline for a specific trial, pulling data from Snowflake through Airflow."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: data_cutoff_date
              in: body
              type: string
              description: "Data cutoff date in YYYY-MM-DD format."
          steps:
            - name: trigger-dag
              type: call
              call: "airflow.trigger-dag-run"
              with:
                dag_id: "clinical_data_etl"
                conf:
                  trial_id: "{{trial_id}}"
                  cutoff_date: "{{data_cutoff_date}}"
            - name: notify-data-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_data_mgmt"
                channel_id: "pipeline_runs"
                text: "Clinical ETL triggered for trial {{trial_id}} with cutoff {{data_cutoff_date}}. DAG run: {{trigger-dag.dag_run_id}}"
  consumes:
    - type: http
      namespace: airflow
      baseUri: "https://airflow.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.airflow_token"
      resources:
        - name: dag-runs
          path: "/dags/{{dag_id}}/dagRuns"
          inputParameters:
            - name: dag_id
              in: path
          operations:
            - name: trigger-dag-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls randomization logs from the clinical data warehouse in Snowflake, validates allocation ratios, and creates an audit trail document in SharePoint for regulatory inspection readiness.

naftiko: "0.5"
info:
  label: "Clinical Trial Randomization Auditor"
  description: "Pulls randomization logs from the clinical data warehouse in Snowflake, validates allocation ratios, and creates an audit trail document in SharePoint for regulatory inspection readiness."
  tags:
    - clinical-trials
    - compliance
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: randomization-audit
      port: 8080
      tools:
        - name: audit-randomization
          description: "Run a randomization allocation audit for a clinical trial and generate an audit trail document."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: audit_date
              in: body
              type: string
              description: "Date of the audit in YYYY-MM-DD format."
          steps:
            - name: pull-randomization-data
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "CLINICAL_WH"
                statement: "SELECT * FROM RANDOMIZATION_LOG WHERE trial_id = '{{trial_id}}' ORDER BY randomization_date"
            - name: create-audit-doc
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "clinical_quality"
                folder_path: "Audit_Trails/Randomization/{{trial_id}}"
                file_name: "Randomization_Audit_{{trial_id}}_{{audit_date}}.xlsx"
            - name: notify-quality
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_quality"
                channel_id: "audit_trails"
                text: "Randomization audit complete for trial {{trial_id}}. Audit document: {{create-audit-doc.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: create-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves clinical trial site metrics from Oracle and surfaces enrollment status, protocol deviations, and site health scores in a Power BI dashboard refresh.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Monitor"
  description: "Retrieves clinical trial site metrics from Oracle and surfaces enrollment status, protocol deviations, and site health scores in a Power BI dashboard refresh."
  tags:
    - clinical-trials
    - site-monitoring
    - oracle
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: clinical-site-monitoring
      port: 8080
      tools:
        - name: get-site-health
          description: "Given a clinical trial ID and site number, return enrollment counts, protocol deviations, and overall site health score."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier (e.g., LY-2024-0042)."
            - name: site_number
              in: body
              type: string
              description: "The investigator site number."
          steps:
            - name: fetch-enrollment
              type: call
              call: "oracle-ctms.get-enrollment"
              with:
                trial_id: "{{trial_id}}"
                site_id: "{{site_number}}"
            - name: fetch-deviations
              type: call
              call: "oracle-ctms.get-deviations"
              with:
                trial_id: "{{trial_id}}"
                site_id: "{{site_number}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "clinical_site_health"
                parameters:
                  trial_id: "{{trial_id}}"
  consumes:
    - type: http
      namespace: oracle-ctms
      baseUri: "https://ctms.lilly.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: enrollment
          path: "/trials/{{trial_id}}/sites/{{site_id}}/enrollment"
          inputParameters:
            - name: trial_id
              in: path
            - name: site_id
              in: path
          operations:
            - name: get-enrollment
              method: GET
        - name: deviations
          path: "/trials/{{trial_id}}/sites/{{site_id}}/deviations"
          inputParameters:
            - name: trial_id
              in: path
            - name: site_id
              in: path
          operations:
            - name: get-deviations
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Optimizes cloud costs at Eli Lilly via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at Eli Lilly via Azure, FinOps, Jira, and Power BI."
  tags:
    - cloud
    - cost-management
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-opt
      port: 8080
      tools:
        - name: optimize
          description: "Optimize cloud costs at Eli Lilly."
          inputParameters:
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: range
              in: body
              type: string
              description: "Range."
          steps:
            - name: spend
              type: call
              call: "cloud.get-costs"
              with:
                provider: "{{provider}}"
                range: "{{range}}"
            - name: savings
              type: call
              call: "finops.analyze"
              with:
                data: "{{spend.data}}"
            - name: action
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Save ${{savings.potential}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cloud"
  consumes:
    - type: http
      namespace: cloud
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-costs
              method: POST
    - type: http
      namespace: finops
      baseUri: "https://finops.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finops_token"
      resources:
        - name: analysis
          path: "/savings"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Queries AWS CloudWatch for Lambda function metrics used in clinical data processing, including invocation counts, error rates, and duration.

naftiko: "0.5"
info:
  label: "CloudWatch Lambda Monitor"
  description: "Queries AWS CloudWatch for Lambda function metrics used in clinical data processing, including invocation counts, error rates, and duration."
  tags:
    - operations
    - monitoring
    - cloudwatch
    - aws-lambda
capability:
  exposes:
    - type: mcp
      namespace: lambda-monitoring
      port: 8080
      tools:
        - name: get-lambda-metrics
          description: "Retrieve CloudWatch metrics for a clinical data processing Lambda function."
          inputParameters:
            - name: function_name
              in: body
              type: string
              description: "The Lambda function name."
            - name: period
              in: body
              type: string
              description: "Metric period: 1h, 6h, 24h."
          call: "cloudwatch.get-metric-data"
          with:
            namespace: "AWS/Lambda"
            metric_name: "Errors"
            dimensions:
              FunctionName: "{{function_name}}"
            period: "{{period}}"
  consumes:
    - type: http
      namespace: cloudwatch
      baseUri: "https://monitoring.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_cloudwatch_token"
      resources:
        - name: metrics
          path: "/"
          operations:
            - name: get-metric-data
              method: POST

Searches Confluence at Eli Lilly.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at Eli Lilly."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at Eli Lilly."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lilly.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

Publishes a clinical trial protocol document to Confluence, tagging it with study metadata and notifying the clinical operations team.

naftiko: "0.5"
info:
  label: "Confluence Protocol Document Publisher"
  description: "Publishes a clinical trial protocol document to Confluence, tagging it with study metadata and notifying the clinical operations team."
  tags:
    - clinical-trials
    - documentation
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: protocol-publishing
      port: 8080
      tools:
        - name: publish-protocol
          description: "Publish a clinical protocol document to Confluence and notify the clinical ops team."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: protocol_version
              in: body
              type: string
              description: "Protocol version number."
            - name: content_body
              in: body
              type: string
              description: "HTML content of the protocol document."
          steps:
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                spaceKey: "CLINICAL"
                title: "Protocol {{trial_id}} v{{protocol_version}}"
                body: "{{content_body}}"
                labels:
                  - "protocol"
                  - "{{trial_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_operations"
                channel_id: "protocols"
                text: "Protocol v{{protocol_version}} for trial {{trial_id}} published to Confluence: {{create-page.url}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lilly.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Tracks contract renewals at Eli Lilly via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at Eli Lilly via contracts system, email, Jira, and Salesforce."
  tags:
    - procurement
    - contracts
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renew
      port: 8080
      tools:
        - name: track
          description: "Track renewals at Eli Lilly."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
            - name: owner
              in: body
              type: string
              description: "Owner email."
          steps:
            - name: get
              type: call
              call: "contracts.get"
              with:
                id: "{{contract_id}}"
            - name: remind
              type: call
              call: "email.send"
              with:
                to: "{{owner}}"
                subject: "Renewal: {{contract_id}}"
            - name: task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Renew {{contract_id}}"
            - name: crm
              type: call
              call: "salesforce.update"
              with:
                id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: contracts
      baseUri: "https://contracts.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.contracts_token"
      resources:
        - name: contracts
          path: "/contracts/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://lilly.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Reallocates costs at Eli Lilly.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at Eli Lilly."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at Eli Lilly."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors data pipelines at Eli Lilly via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at Eli Lilly via Databricks, Snowflake, Slack, and ServiceNow."
  tags:
    - data-engineering
    - databricks
    - monitoring
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pipeline-mon
      port: 8080
      tools:
        - name: monitor
          description: "Monitor pipelines at Eli Lilly."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          steps:
            - name: status
              type: call
              call: "databricks.get-run"
              with:
                id: "{{pipeline_id}}"
            - name: quality
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#data"
                text: "Pipeline {{pipeline_id}}: {{status.state}}"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "Pipeline {{pipeline_id}} issue"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://lilly.com.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Triggers a Databricks notebook job to run biomarker analysis for a clinical trial, then stores results in Snowflake and notifies the biostatistics team.

naftiko: "0.5"
info:
  label: "Databricks Biomarker Analysis Runner"
  description: "Triggers a Databricks notebook job to run biomarker analysis for a clinical trial, then stores results in Snowflake and notifies the biostatistics team."
  tags:
    - drug-development
    - biomarkers
    - databricks
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: biomarker-analysis
      port: 8080
      tools:
        - name: run-biomarker-analysis
          description: "Execute a biomarker analysis notebook in Databricks for a given trial and analyte panel, then notify the biostats team."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: analyte_panel
              in: body
              type: string
              description: "The biomarker analyte panel to analyze."
            - name: data_cutoff
              in: body
              type: string
              description: "Data cutoff date in YYYY-MM-DD format."
          steps:
            - name: run-notebook
              type: call
              call: "databricks.run-job"
              with:
                job_id: "biomarker_analysis_pipeline"
                notebook_params:
                  trial_id: "{{trial_id}}"
                  panel: "{{analyte_panel}}"
                  cutoff: "{{data_cutoff}}"
            - name: notify-biostats
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "biostatistics"
                channel_id: "biomarker_results"
                text: "Biomarker analysis completed for trial {{trial_id}}, panel {{analyte_panel}}. Databricks run: {{run-notebook.run_id}}. Results loaded to Snowflake."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://lilly.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks Datadog monitor at Eli Lilly.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at Eli Lilly."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at Eli Lilly."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Tests disaster recovery at Eli Lilly via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at Eli Lilly via failover, health checks, and reporting."
  tags:
    - disaster-recovery
    - business-continuity
    - testing
capability:
  exposes:
    - type: mcp
      namespace: dr-test
      port: 8080
      tools:
        - name: test-dr
          description: "Test DR at Eli Lilly."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Plan ID."
            - name: type
              in: body
              type: string
              description: "Test type."
          steps:
            - name: failover
              type: call
              call: "dr.failover"
              with:
                plan: "{{plan_id}}"
                type: "{{type}}"
            - name: validate
              type: call
              call: "monitoring.check"
              with:
                scope: "critical"
            - name: measure
              type: call
              call: "dr.metrics"
              with:
                id: "{{failover.id}}"
            - name: report
              type: call
              call: "confluence.create-page"
              with:
                title: "DR - {{plan_id}}"
                body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
  consumes:
    - type: http
      namespace: dr
      baseUri: "https://dr.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dr_token"
      resources:
        - name: failovers
          path: "/failovers"
          operations:
            - name: failover
              method: POST
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: health
          path: "/checks"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lilly.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Detects infrastructure drift at Eli Lilly via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at Eli Lilly via Terraform, Slack, and Jira."
  tags:
    - infrastructure
    - terraform
    - drift-detection
    - devops
capability:
  exposes:
    - type: mcp
      namespace: drift-det
      port: 8080
      tools:
        - name: detect
          description: "Detect drift at Eli Lilly."
          inputParameters:
            - name: ws_id
              in: body
              type: string
              description: "Workspace ID."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: plan
              type: call
              call: "terraform.run"
              with:
                ws: "{{ws_id}}"
            - name: check
              type: call
              call: "terraform.get-plan"
              with:
                run: "{{plan.id}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra"
                text: "Drift {{env}}: {{check.changes}} changes"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Drift in {{env}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries the Elasticsearch drug interaction knowledge base to check for known interactions between a candidate compound and existing medications.

naftiko: "0.5"
info:
  label: "Drug Interaction Check"
  description: "Queries the Elasticsearch drug interaction knowledge base to check for known interactions between a candidate compound and existing medications."
  tags:
    - drug-development
    - drug-interactions
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: drug-safety-check
      port: 8080
      tools:
        - name: check-interactions
          description: "Check for known drug-drug interactions between a compound and a list of concomitant medications."
          inputParameters:
            - name: compound_id
              in: body
              type: string
              description: "The internal compound identifier."
            - name: concomitant_drugs
              in: body
              type: string
              description: "Comma-separated list of concomitant drug names."
          call: "elasticsearch.search-interactions"
          with:
            index: "drug_interactions"
            query: "{{compound_id}} AND ({{concomitant_drugs}})"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es-pharma.lilly.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search-interactions
              method: POST

Checks ES index at Eli Lilly.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at Eli Lilly."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at Eli Lilly."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.lilly.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Offboards employees at Eli Lilly via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at Eli Lilly via Okta, Slack, ServiceNow, and storage."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: offboard
          description: "Offboard employees at Eli Lilly."
          inputParameters:
            - name: emp_id
              in: body
              type: string
              description: "Employee ID."
            - name: last_day
              in: body
              type: string
              description: "Last day."
          steps:
            - name: disable
              type: call
              call: "okta.deactivate"
              with:
                user: "{{emp_id}}"
            - name: revoke
              type: call
              call: "slack.remove"
              with:
                user: "{{emp_id}}"
            - name: return
              type: call
              call: "servicenow.create-request"
              with:
                type: "return"
                emp: "{{emp_id}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                user: "{{emp_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lilly.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user}}/lifecycle/deactivate"
          inputParameters:
            - name: user
              in: path
          operations:
            - name: deactivate
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.remove"
          operations:
            - name: remove
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: storage
      baseUri: "https://storage.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder with compliance training materials, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder with compliance training materials, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker 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 the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_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-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 Eli Lilly, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents are ready at {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.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: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Audits expenses at Eli Lilly via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at Eli Lilly via Concur, compliance checks, and email."
  tags:
    - finance
    - travel
    - sap-concur
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit
          description: "Audit expenses at Eli Lilly."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Report ID."
          steps:
            - name: get
              type: call
              call: "concur.get-report"
              with:
                id: "{{report_id}}"
            - name: check
              type: call
              call: "compliance.check"
              with:
                expenses: "{{get.entries}}"
            - name: flag
              type: call
              call: "workflow.flag"
              with:
                id: "{{report_id}}"
                violations: "{{check.violations}}"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "{{get.approver}}"
                subject: "Expense {{report_id}} violations"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: policies
          path: "/check"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: reviews
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Assembles regulatory submission documents by pulling trial data from Oracle, generating formatted reports in Microsoft Word, and uploading the package to SharePoint for review.

naftiko: "0.5"
info:
  label: "FDA Submission Document Assembler"
  description: "Assembles regulatory submission documents by pulling trial data from Oracle, generating formatted reports in Microsoft Word, and uploading the package to SharePoint for review."
  tags:
    - regulatory
    - fda-submission
    - oracle
    - microsoft-word
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submissions
      port: 8080
      tools:
        - name: assemble-submission
          description: "Compile an FDA submission package for a given trial, including clinical study report, safety summary, and efficacy data."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: submission_type
              in: body
              type: string
              description: "Type of submission: NDA, BLA, sNDA, IND."
            - name: target_date
              in: body
              type: string
              description: "Target submission date in YYYY-MM-DD format."
          steps:
            - name: pull-trial-data
              type: call
              call: "oracle-ctms.get-trial-summary"
              with:
                trial_id: "{{trial_id}}"
            - name: pull-safety-data
              type: call
              call: "oracle-ctms.get-safety-summary"
              with:
                trial_id: "{{trial_id}}"
            - name: generate-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "regulatory_submissions"
                folder_path: "{{submission_type}}/{{trial_id}}"
                file_name: "CSR_{{trial_id}}_{{target_date}}.docx"
            - name: notify-regulatory
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "regulatory_affairs"
                channel_id: "submissions"
                text: "Submission package for {{trial_id}} ({{submission_type}}) assembled. Target date: {{target_date}}. Document: {{generate-report.url}}"
  consumes:
    - type: http
      namespace: oracle-ctms
      baseUri: "https://ctms.lilly.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: trial-summary
          path: "/trials/{{trial_id}}/summary"
          inputParameters:
            - name: trial_id
              in: path
          operations:
            - name: get-trial-summary
              method: GET
        - name: safety-summary
          path: "/trials/{{trial_id}}/safety"
          inputParameters:
            - name: trial_id
              in: path
          operations:
            - name: get-safety-summary
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: create-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Analyzes feedback at Eli Lilly via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at Eli Lilly via surveys, AI sentiment, and Power BI."
  tags:
    - customer-experience
    - analytics
    - sentiment-analysis
capability:
  exposes:
    - type: mcp
      namespace: feedback
      port: 8080
      tools:
        - name: analyze
          description: "Analyze feedback at Eli Lilly."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "Survey ID."
          steps:
            - name: collect
              type: call
              call: "survey.get"
              with:
                id: "{{survey_id}}"
            - name: sentiment
              type: call
              call: "ai.analyze"
              with:
                text: "{{collect.responses}}"
            - name: themes
              type: call
              call: "ai.themes"
              with:
                data: "{{collect.responses}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cx"
  consumes:
    - type: http
      namespace: survey
      baseUri: "https://surveys.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Checks GitHub repo at Eli Lilly.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at Eli Lilly."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at Eli Lilly."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo."
            - name: branch
              in: body
              type: string
              description: "Branch."
          call: "github.get-branch"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
          outputParameters:
            - name: sha
              type: string
              mapping: "$.commit.sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/org/{{repo}}/branches/{{branch}}"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch
              method: GET

When a GMP deviation is detected in manufacturing, creates a ServiceNow quality incident, assigns it to the quality team, uploads investigation docs to SharePoint, and alerts manufacturing leadership via Teams.

naftiko: "0.5"
info:
  label: "GMP Deviation Workflow"
  description: "When a GMP deviation is detected in manufacturing, creates a ServiceNow quality incident, assigns it to the quality team, uploads investigation docs to SharePoint, and alerts manufacturing leadership via Teams."
  tags:
    - manufacturing
    - gmp
    - quality
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gmp-deviation
      port: 8080
      tools:
        - name: report-gmp-deviation
          description: "Report a GMP deviation from manufacturing. Creates quality incident, uploads investigation template, and notifies leadership."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The batch number where deviation occurred."
            - name: plant_code
              in: body
              type: string
              description: "Manufacturing plant code."
            - name: deviation_type
              in: body
              type: string
              description: "Type: critical, major, minor."
            - name: description
              in: body
              type: string
              description: "Description of the deviation."
          steps:
            - name: create-qi
              type: call
              call: "servicenow.create-quality-incident"
              with:
                short_description: "GMP Deviation: Batch {{batch_number}} - {{deviation_type}}"
                category: "quality_deviation"
                assigned_group: "Quality_Assurance"
                priority: "{{deviation_type}}"
                description: "Plant: {{plant_code}}. {{description}}"
            - name: upload-template
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "quality_management"
                folder_path: "Deviations/{{plant_code}}/{{batch_number}}"
                file_name: "Investigation_{{create-qi.number}}.docx"
            - name: alert-leadership
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "manufacturing_quality"
                channel_id: "deviations"
                text: "GMP Deviation ({{deviation_type}}) reported for batch {{batch_number}} at plant {{plant_code}}. Case: {{create-qi.number}}. Investigation template: {{upload-template.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: quality-incidents
          path: "/table/u_quality_incident"
          operations:
            - name: create-quality-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: create-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Shares clinical protocol documents from Google Drive with external collaborators, setting appropriate permissions and notifying the study team.

naftiko: "0.5"
info:
  label: "Google Drive Clinical Protocol Sharing"
  description: "Shares clinical protocol documents from Google Drive with external collaborators, setting appropriate permissions and notifying the study team."
  tags:
    - clinical-trials
    - collaboration
    - google-drive
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: protocol-sharing
      port: 8080
      tools:
        - name: share-protocol
          description: "Share a clinical protocol document from Google Drive with an external collaborator and notify the study team."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Google Drive file ID of the protocol document."
            - name: collaborator_email
              in: body
              type: string
              description: "Email of the external collaborator."
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
          steps:
            - name: set-permission
              type: call
              call: "gdrive.create-permission"
              with:
                file_id: "{{file_id}}"
                role: "reader"
                type: "user"
                emailAddress: "{{collaborator_email}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_operations"
                channel_id: "document_sharing"
                text: "Protocol for trial {{trial_id}} shared with {{collaborator_email}} (read-only access)."
  consumes:
    - type: http
      namespace: gdrive
      baseUri: "https://www.googleapis.com/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: permissions
          path: "/files/{{file_id}}/permissions"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: create-permission
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks Grafana dashboard at Eli Lilly.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at Eli Lilly."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at Eli Lilly."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.lilly.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

Queries Grafana for real-time manufacturing process metrics including temperature, pressure, and yield data from production lines.

naftiko: "0.5"
info:
  label: "Grafana Manufacturing Dashboard Query"
  description: "Queries Grafana for real-time manufacturing process metrics including temperature, pressure, and yield data from production lines."
  tags:
    - manufacturing
    - monitoring
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: mfg-process-monitoring
      port: 8080
      tools:
        - name: get-process-metrics
          description: "Query Grafana for manufacturing process metrics and create a ServiceNow alert if temperature or pressure exceeds threshold."
          inputParameters:
            - name: production_line
              in: body
              type: string
              description: "The production line identifier."
            - name: metric_type
              in: body
              type: string
              description: "Metric type: temperature, pressure, yield, all."
          steps:
            - name: fetch-metrics
              type: call
              call: "grafana.query-datasource"
              with:
                dashboardId: "mfg-process-control"
                panelId: "{{metric_type}}"
                from: "now-4h"
                to: "now"
                var-line: "{{production_line}}"
            - name: create-alert
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Process excursion: {{production_line}} - {{metric_type}}"
                category: "manufacturing_alert"
                description: "Metric {{metric_type}} on line {{production_line}} requires review."
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.lilly.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{dashboardId}}"
          inputParameters:
            - name: dashboardId
              in: path
          operations:
            - name: query-datasource
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks the status of Informatica data integration jobs that move clinical trial data between source systems and the enterprise data lake.

naftiko: "0.5"
info:
  label: "Informatica Clinical Data Integration Monitor"
  description: "Checks the status of Informatica data integration jobs that move clinical trial data between source systems and the enterprise data lake."
  tags:
    - clinical-trials
    - data-integration
    - informatica
capability:
  exposes:
    - type: mcp
      namespace: data-integration
      port: 8080
      tools:
        - name: get-job-status
          description: "Check Informatica job status and post failure alerts to the clinical data management team."
          inputParameters:
            - name: job_name
              in: body
              type: string
              description: "The Informatica job or mapping task name."
          steps:
            - name: check-status
              type: call
              call: "informatica.get-activity-log"
              with:
                taskName: "{{job_name}}"
            - name: alert-on-failure
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_data_mgmt"
                channel_id: "integration_alerts"
                text: "Informatica job {{job_name}} status: {{check-status.status}}. Last run: {{check-status.startTime}}"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_session_id"
      resources:
        - name: activity-log
          path: "/activity/activityLog"
          operations:
            - name: get-activity-log
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Escalates IT incidents at Eli Lilly via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at Eli Lilly via ServiceNow, PagerDuty, and Slack."
  tags:
    - incident-management
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate incidents at Eli Lilly."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: page
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{get-incident.description}}"
                urgency: "{{severity}}"
            - name: channel
              type: call
              call: "slack.create-channel"
              with:
                name: "inc-{{incident_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#inc-{{incident_id}}"
                text: "P{{severity}}: {{get-incident.description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Retrieves the current status and progress of clinical study work items from Jira, including protocol amendments, site activations, and data lock milestones.

naftiko: "0.5"
info:
  label: "Jira Clinical Study Tracker"
  description: "Retrieves the current status and progress of clinical study work items from Jira, including protocol amendments, site activations, and data lock milestones."
  tags:
    - clinical-trials
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: clinical-project-tracking
      port: 8080
      tools:
        - name: get-study-status
          description: "Query Jira for all open issues related to a clinical study, returning milestone status, blockers, and upcoming deadlines, then post a summary to the study team channel."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier used as Jira project key."
          steps:
            - name: fetch-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = '{{study_id}}' AND status != Done ORDER BY duedate ASC"
                maxResults: 50
            - name: post-summary
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_operations"
                channel_id: "study_tracker"
                text: "Study {{study_id}} status: {{fetch-issues.total}} open items. Next due: {{fetch-issues.issues[0].fields.duedate}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lilly.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves sprint progress at Eli Lilly.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at Eli Lilly."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at Eli Lilly."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Project key."
          call: "jira.get-sprints"
          with:
            project: "{{project_key}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/1/sprint"
          operations:
            - name: get-sprints
              method: GET

Maintains KB at Eli Lilly by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at Eli Lilly by finding stale articles and notifying owners."
  tags:
    - knowledge-management
    - confluence
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: kb-maint
      port: 8080
      tools:
        - name: maintain-kb
          description: "Maintain KB at Eli Lilly."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "Confluence space."
            - name: stale_days
              in: body
              type: number
              description: "Days threshold."
          steps:
            - name: find
              type: call
              call: "confluence.search-stale"
              with:
                space: "{{space}}"
                days: "{{stale_days}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{find.owners}}"
                subject: "KB review needed"
            - name: flag
              type: call
              call: "confluence.add-label"
              with:
                pages: "{{find.ids}}"
                label: "needs-review"
            - name: report
              type: call
              call: "slack.post-message"
              with:
                channel: "#kb"
                text: "KB: {{find.count}} stale articles"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lilly.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search-stale
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Manages single sign-on configurations in Keycloak for clinical trial portal applications, including creating realms, clients, and mapping user roles for investigators.

naftiko: "0.5"
info:
  label: "Keycloak Clinical Portal SSO Manager"
  description: "Manages single sign-on configurations in Keycloak for clinical trial portal applications, including creating realms, clients, and mapping user roles for investigators."
  tags:
    - security
    - identity
    - keycloak
    - clinical-trials
capability:
  exposes:
    - type: mcp
      namespace: clinical-sso
      port: 8080
      tools:
        - name: configure-study-sso
          description: "Configure SSO for a clinical trial portal in Keycloak, creating a client and mapping investigator roles."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: portal_url
              in: body
              type: string
              description: "The clinical portal redirect URL."
          steps:
            - name: create-client
              type: call
              call: "keycloak.create-client"
              with:
                realm: "clinical-portals"
                clientId: "portal-{{trial_id}}"
                redirectUris:
                  - "{{portal_url}}/*"
                protocol: "openid-connect"
            - name: create-role
              type: call
              call: "keycloak.create-role"
              with:
                realm: "clinical-portals"
                clientId: "{{create-client.id}}"
                name: "investigator"
                description: "Investigator role for trial {{trial_id}}"
  consumes:
    - type: http
      namespace: keycloak
      baseUri: "https://auth.lilly.com/admin/realms"
      authentication:
        type: bearer
        token: "$secrets.keycloak_admin_token"
      resources:
        - name: clients
          path: "/{{realm}}/clients"
          inputParameters:
            - name: realm
              in: path
          operations:
            - name: create-client
              method: POST
        - name: roles
          path: "/{{realm}}/clients/{{clientId}}/roles"
          inputParameters:
            - name: realm
              in: path
            - name: clientId
              in: path
          operations:
            - name: create-role
              method: POST

Generates KPI digest at Eli Lilly from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at Eli Lilly from Snowflake, Oracle, Power BI, and email."
  tags:
    - reporting
    - kpi
    - snowflake
    - executive
capability:
  exposes:
    - type: mcp
      namespace: kpi-digest
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate KPI digest at Eli Lilly."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Week ending."
            - name: dist
              in: body
              type: string
              description: "Distribution list."
          steps:
            - name: ops
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM kpis WHERE w='{{week}}'"
            - name: fin
              type: call
              call: "oracle.get-summary"
              with:
                period: "{{week}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "exec_kpis"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "{{dist}}"
                subject: "KPIs - {{week}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/summary"
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Scales Kubernetes deployments for drug discovery computational workloads on Azure Kubernetes Service based on queue depth and project priority.

naftiko: "0.5"
info:
  label: "Kubernetes Drug Discovery Pod Scaler"
  description: "Scales Kubernetes deployments for drug discovery computational workloads on Azure Kubernetes Service based on queue depth and project priority."
  tags:
    - drug-development
    - infrastructure
    - kubernetes
    - azure-kubernetes-service
capability:
  exposes:
    - type: mcp
      namespace: discovery-compute
      port: 8080
      tools:
        - name: scale-discovery-pods
          description: "Scale a Kubernetes deployment for drug discovery workloads on AKS."
          inputParameters:
            - name: deployment_name
              in: body
              type: string
              description: "The Kubernetes deployment name."
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace."
            - name: replicas
              in: body
              type: string
              description: "Target number of replicas."
          call: "k8s.scale-deployment"
          with:
            namespace: "{{namespace}}"
            deployment: "{{deployment_name}}"
            replicas: "{{replicas}}"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://lilly-aks.hcp.eastus.azmk8s.io/apis/apps/v1"
      authentication:
        type: bearer
        token: "$secrets.aks_token"
      resources:
        - name: deployments
          path: "/namespaces/{{namespace}}/deployments/{{deployment}}/scale"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment
              in: path
          operations:
            - name: scale-deployment
              method: PATCH

Checks K8s pod health at Eli Lilly.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at Eli Lilly."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at Eli Lilly."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

Checks license compliance at Eli Lilly via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at Eli Lilly via scanning, entitlements, and procurement."
  tags:
    - compliance
    - licensing
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: license-comp
      port: 8080
      tools:
        - name: check-licenses
          description: "Check license compliance at Eli Lilly."
          inputParameters:
            - name: software
              in: body
              type: string
              description: "Software."
            - name: vendor
              in: body
              type: string
              description: "Vendor."
          steps:
            - name: scan
              type: call
              call: "assets.installations"
              with:
                sw: "{{software}}"
            - name: entitlements
              type: call
              call: "licenses.get"
              with:
                sw: "{{software}}"
            - name: flag
              type: call
              call: "compliance.flag"
              with:
                installed: "{{scan.count}}"
                entitled: "{{entitlements.count}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "license"
                sw: "{{software}}"
  consumes:
    - type: http
      namespace: assets
      baseUri: "https://assets.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: installations
          path: "/installations"
          operations:
            - name: installations
              method: GET
    - type: http
      namespace: licenses
      baseUri: "https://licenses.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.license_token"
      resources:
        - name: ent
          path: "/entitlements"
          operations:
            - name: get
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: overages
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Triggers a Power Automate approval flow for clinical protocol amendments, routing through medical director, regulatory lead, and IRB coordinator for sign-off.

naftiko: "0.5"
info:
  label: "Microsoft Power Automate Approval Flow"
  description: "Triggers a Power Automate approval flow for clinical protocol amendments, routing through medical director, regulatory lead, and IRB coordinator for sign-off."
  tags:
    - clinical-trials
    - approvals
    - microsoft-power-automate
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: protocol-approvals
      port: 8080
      tools:
        - name: initiate-protocol-approval
          description: "Start a protocol amendment approval flow via Power Automate with multi-level sign-off."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: amendment_number
              in: body
              type: string
              description: "The protocol amendment number."
            - name: summary
              in: body
              type: string
              description: "Summary of the protocol amendment changes."
          steps:
            - name: trigger-flow
              type: call
              call: "powerautomate.trigger-flow"
              with:
                flow_id: "protocol_amendment_approval"
                inputs:
                  trial_id: "{{trial_id}}"
                  amendment_number: "{{amendment_number}}"
                  change_summary: "{{summary}}"
            - name: notify-submitter
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_operations"
                channel_id: "protocol_amendments"
                text: "Protocol amendment {{amendment_number}} for trial {{trial_id}} submitted for approval. Flow tracking: {{trigger-flow.run_id}}"
  consumes:
    - type: http
      namespace: powerautomate
      baseUri: "https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple/environments/$secrets.power_env_id"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/flows/{{flow_id}}/triggers/manual/run"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Generates monthly security reports at Eli Lilly from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at Eli Lilly from Splunk and Qualys."
  tags:
    - security
    - reporting
    - splunk
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-report
      port: 8080
      tools:
        - name: gen-sec-report
          description: "Generate security report at Eli Lilly."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "Month."
          steps:
            - name: splunk
              type: call
              call: "splunk.search"
              with:
                query: "index=security earliest=-30d"
            - name: scans
              type: call
              call: "qualys.results"
              with:
                month: "{{month}}"
            - name: compile
              type: call
              call: "analytics.compile-security"
              with:
                events: "{{splunk.count}}"
                vulns: "{{scans.critical}}"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "ciso@co.com"
                subject: "Security - {{month}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.lilly.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: results
          path: "/fo/scan/results"
          operations:
            - name: results
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: security
          path: "/compile"
          operations:
            - name: compile-security
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Onboards employees at Eli Lilly with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at Eli Lilly with Okta, ServiceNow, Slack, and calendar."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Onboard employees at Eli Lilly."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Name."
            - name: dept
              in: body
              type: string
              description: "Department."
            - name: start
              in: body
              type: string
              description: "Start date."
          steps:
            - name: okta
              type: call
              call: "okta.create-user"
              with:
                name: "{{name}}"
                department: "{{dept}}"
            - name: equip
              type: call
              call: "servicenow.create-request"
              with:
                type: "new_hire"
                for: "{{name}}"
            - name: slack
              type: call
              call: "slack.invite"
              with:
                email: "{{okta.email}}"
            - name: orient
              type: call
              call: "calendar.create-event"
              with:
                title: "Orientation - {{name}}"
                date: "{{start}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lilly.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.invite"
          operations:
            - name: invite
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/hr/events"
          operations:
            - name: create-event
              method: POST

Checks New Relic APM at Eli Lilly.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at Eli Lilly."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at Eli Lilly."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Checks Okta user at Eli Lilly.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at Eli Lilly."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at Eli Lilly."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lilly.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Queries Oracle E-Business Suite for current raw material and API inventory levels at manufacturing plants, including lot status and expiry dates.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Material Inventory"
  description: "Queries Oracle E-Business Suite for current raw material and API inventory levels at manufacturing plants, including lot status and expiry dates."
  tags:
    - manufacturing
    - inventory
    - oracle-e-business-suite
capability:
  exposes:
    - type: mcp
      namespace: material-inventory
      port: 8080
      tools:
        - name: get-material-inventory
          description: "Look up inventory levels in Oracle EBS and alert the supply chain team if stock falls below reorder point."
          inputParameters:
            - name: item_number
              in: body
              type: string
              description: "The Oracle item number for the material."
            - name: organization_code
              in: body
              type: string
              description: "The manufacturing organization code."
          steps:
            - name: check-inventory
              type: call
              call: "oracle-ebs.get-onhand"
              with:
                item: "{{item_number}}"
                org: "{{organization_code}}"
            - name: alert-supply-chain
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "supply_chain"
                channel_id: "inventory_alerts"
                text: "Inventory check for item {{item_number}} at plant {{organization_code}}: {{check-inventory.onhand_quantity}} units on hand."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://ebs.lilly.com/webservices/rest/inventory/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: onhand
          path: "/onhand?item={{item}}&org={{org}}"
          inputParameters:
            - name: item
              in: query
            - name: org
              in: query
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks on-call at Eli Lilly.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at Eli Lilly."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at Eli Lilly."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Retrieves firewall rules from Palo Alto Networks for GxP system network segments, supporting network security audit and compliance review.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Rule Audit"
  description: "Retrieves firewall rules from Palo Alto Networks for GxP system network segments, supporting network security audit and compliance review."
  tags:
    - security
    - compliance
    - palo-alto-networks
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: audit-firewall-rules
          description: "Retrieve firewall rules for a GxP network segment from Palo Alto Networks for compliance audit."
          inputParameters:
            - name: zone_name
              in: body
              type: string
              description: "The network security zone name."
          call: "paloalto.get-security-rules"
          with:
            location: "vsys1"
            zone: "{{zone_name}}"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://firewall.lilly.com/restapi/v10.2"
      authentication:
        type: bearer
        token: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules"
          operations:
            - name: get-security-rules
              method: GET

Checks GxP training compliance status for employees via Pluralsight, verifying completion of required SOPs, GMP modules, and pharmacovigilance training.

naftiko: "0.5"
info:
  label: "Pluralsight Training Compliance Tracker"
  description: "Checks GxP training compliance status for employees via Pluralsight, verifying completion of required SOPs, GMP modules, and pharmacovigilance training."
  tags:
    - compliance
    - training
    - pluralsight
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Verify an employee's training compliance status in Pluralsight and log any gaps in ServiceNow."
          inputParameters:
            - name: employee_email
              in: body
              type: string
              description: "The employee email address."
            - name: training_plan
              in: body
              type: string
              description: "Training plan name: GMP-core, PV-basics, GCP-investigator."
          steps:
            - name: get-completion
              type: call
              call: "pluralsight.get-user-progress"
              with:
                email: "{{employee_email}}"
                plan: "{{training_plan}}"
            - name: log-gap
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Training gap: {{employee_email}} - {{training_plan}}"
                category: "training_compliance"
                description: "Employee {{employee_email}} has incomplete training for {{training_plan}}. Completion: {{get-completion.percentage}}%"
  consumes:
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api-v0.9"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: user-progress
          path: "/learners/{{email}}/plans/{{plan}}/progress"
          inputParameters:
            - name: email
              in: path
            - name: plan
              in: path
          operations:
            - name: get-user-progress
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Creates postmortems at Eli Lilly.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at Eli Lilly."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at Eli Lilly."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lilly.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Refreshes a Power BI dataset containing commercial sales analytics for a therapeutic area, then notifies the commercial insights team.

naftiko: "0.5"
info:
  label: "Power BI Commercial Analytics Refresh"
  description: "Refreshes a Power BI dataset containing commercial sales analytics for a therapeutic area, then notifies the commercial insights team."
  tags:
    - commercial
    - analytics
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: commercial-analytics
      port: 8080
      tools:
        - name: refresh-commercial-dashboard
          description: "Refresh a Power BI commercial analytics dataset and notify the insights team."
          inputParameters:
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area (e.g., diabetes, oncology, immunology)."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          steps:
            - name: refresh-dataset
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-insights
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "commercial_insights"
                channel_id: "{{therapeutic_area}}"
                text: "Power BI dashboard for {{therapeutic_area}} refreshed successfully. Dataset: {{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: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks Power BI refresh at Eli Lilly.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at Eli Lilly."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at Eli Lilly."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Queries Prometheus for active manufacturing system alerts, including equipment failures, temperature excursions, and process control violations.

naftiko: "0.5"
info:
  label: "Prometheus Manufacturing Alert Query"
  description: "Queries Prometheus for active manufacturing system alerts, including equipment failures, temperature excursions, and process control violations."
  tags:
    - manufacturing
    - monitoring
    - prometheus
capability:
  exposes:
    - type: mcp
      namespace: mfg-alerts
      port: 8080
      tools:
        - name: get-active-alerts
          description: "Query Prometheus for active alerts on manufacturing systems filtered by plant and severity."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: severity
              in: body
              type: string
              description: "Alert severity filter: critical, warning, info."
          call: "prometheus.get-alerts"
          with:
            filter: "plant=\"{{plant_code}}\",severity=\"{{severity}}\""
  consumes:
    - type: http
      namespace: prometheus
      baseUri: "https://prometheus.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: alerts
          path: "/alerts"
          operations:
            - name: get-alerts
              method: GET

Generates compliance reports at Eli Lilly from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at Eli Lilly from Snowflake, Power BI, and email."
  tags:
    - compliance
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: compliance-rpt
      port: 8080
      tools:
        - name: gen-report
          description: "Generate compliance reports at Eli Lilly."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: type
              in: body
              type: string
              description: "Type."
          steps:
            - name: data
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
            - name: metrics
              type: call
              call: "analytics.compute"
              with:
                data: "{{data.results}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "compliance"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "compliance@co.com"
                subject: "{{type}} - {{quarter}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: metrics
          path: "/compute"
          operations:
            - name: compute
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks Redis at Eli Lilly.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at Eli Lilly."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at Eli Lilly."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

When a new FDA guidance is published, creates a Jira epic for impact assessment, assigns it to regulatory affairs, uploads the guidance document to Confluence, and notifies the regulatory team.

naftiko: "0.5"
info:
  label: "Regulatory Change Impact Assessment"
  description: "When a new FDA guidance is published, creates a Jira epic for impact assessment, assigns it to regulatory affairs, uploads the guidance document to Confluence, and notifies the regulatory team."
  tags:
    - regulatory
    - change-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-change
      port: 8080
      tools:
        - name: assess-regulatory-change
          description: "Initiate impact assessment workflow for a new regulatory guidance document."
          inputParameters:
            - name: guidance_title
              in: body
              type: string
              description: "Title of the FDA guidance document."
            - name: guidance_url
              in: body
              type: string
              description: "URL to the guidance document."
            - name: affected_products
              in: body
              type: string
              description: "Comma-separated list of affected product names."
          steps:
            - name: create-epic
              type: call
              call: "jira.create-issue"
              with:
                project: "REGAFF"
                issuetype: "Epic"
                summary: "Regulatory Impact: {{guidance_title}}"
                description: "Assess impact of new FDA guidance on products: {{affected_products}}. Source: {{guidance_url}}"
                labels:
                  - "fda-guidance"
                  - "impact-assessment"
            - name: publish-to-confluence
              type: call
              call: "confluence.create-page"
              with:
                spaceKey: "REGULATORY"
                title: "FDA Guidance: {{guidance_title}}"
                body: "New guidance published. Affected products: {{affected_products}}. Jira epic: {{create-epic.key}}. Source: {{guidance_url}}"
            - name: alert-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "regulatory_affairs"
                channel_id: "fda_updates"
                text: "New FDA guidance requires impact assessment: {{guidance_title}}. Epic: {{create-epic.key}}. Affected products: {{affected_products}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lilly.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lilly.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks release readiness at Eli Lilly.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at Eli Lilly."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at Eli Lilly."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/lilly.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.lilly.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lilly.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves healthcare professional engagement history from Salesforce, including recent interactions, sample distributions, and speaker program participation.

naftiko: "0.5"
info:
  label: "Salesforce HCP Engagement Lookup"
  description: "Retrieves healthcare professional engagement history from Salesforce, including recent interactions, sample distributions, and speaker program participation."
  tags:
    - commercial
    - hcp-engagement
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: commercial-hcp
      port: 8080
      tools:
        - name: get-hcp-engagement
          description: "Look up an HCP's engagement history in Salesforce and log the inquiry in ServiceNow for compliance tracking."
          inputParameters:
            - name: hcp_identifier
              in: body
              type: string
              description: "NPI number or Salesforce contact ID."
            - name: inquiry_reason
              in: body
              type: string
              description: "Reason for the HCP lookup: territory-review, speaker-eval, sample-audit."
          steps:
            - name: fetch-hcp
              type: call
              call: "salesforce.get-hcp-record"
              with:
                hcp_id: "{{hcp_identifier}}"
            - name: log-inquiry
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_hcp_inquiry_log"
                hcp_name: "{{fetch-hcp.Name}}"
                reason: "{{inquiry_reason}}"
                specialty: "{{fetch-hcp.Specialty__c}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lilly.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: hcp-records
          path: "/sobjects/Contact/{{hcp_id}}"
          inputParameters:
            - name: hcp_id
              in: path
          operations:
            - name: get-hcp-record
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Creates a new KOL engagement opportunity in Salesforce, assigns it to a medical affairs liaison, schedules follow-up activities, and logs in the KOL database.

naftiko: "0.5"
info:
  label: "Salesforce Key Opinion Leader Pipeline"
  description: "Creates a new KOL engagement opportunity in Salesforce, assigns it to a medical affairs liaison, schedules follow-up activities, and logs in the KOL database."
  tags:
    - commercial
    - medical-affairs
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: kol-management
      port: 8080
      tools:
        - name: create-kol-engagement
          description: "Create a KOL engagement opportunity in Salesforce and assign it to a medical affairs liaison."
          inputParameters:
            - name: kol_name
              in: body
              type: string
              description: "Name of the key opinion leader."
            - name: therapeutic_area
              in: body
              type: string
              description: "Therapeutic area of engagement."
            - name: engagement_type
              in: body
              type: string
              description: "Type: advisory-board, speaker-program, publication, consultation."
            - name: liaison_email
              in: body
              type: string
              description: "Assigned medical affairs liaison email."
          steps:
            - name: create-opportunity
              type: call
              call: "salesforce.create-opportunity"
              with:
                Name: "KOL: {{kol_name}} - {{engagement_type}}"
                StageName: "Prospecting"
                Type: "{{engagement_type}}"
                Therapeutic_Area__c: "{{therapeutic_area}}"
                Description: "KOL engagement with {{kol_name}} for {{therapeutic_area}}"
            - name: notify-liaison
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{liaison_email}}"
                text: "New KOL engagement assigned: {{kol_name}} ({{therapeutic_area}}, {{engagement_type}}). Salesforce opportunity: {{create-opportunity.Id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lilly.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              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

Checks a supplier's qualification status in SAP Ariba, including GMP compliance certificates, audit history, and approved material categories.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Qualification Check"
  description: "Checks a supplier's qualification status in SAP Ariba, including GMP compliance certificates, audit history, and approved material categories."
  tags:
    - procurement
    - supplier-qualification
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: supplier-qualification
      port: 8080
      tools:
        - name: check-supplier-status
          description: "Retrieve a supplier's qualification status from SAP Ariba, including GMP certificates, audit dates, and approved categories."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
          call: "ariba.get-supplier-profile"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.supplier.name"
            - name: gmp_status
              type: string
              mapping: "$.supplier.gmpCertificationStatus"
            - name: last_audit_date
              type: string
              mapping: "$.supplier.lastAuditDate"
            - name: approved_categories
              type: string
              mapping: "$.supplier.approvedCategories"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      inputParameters:
        - name: apiKey
          in: header
          value: "$secrets.ariba_api_key"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-profile
              method: GET

Retrieves a travel expense report from SAP Concur for a clinical field monitor, including itemized expenses and approval status.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Report"
  description: "Retrieves a travel expense report from SAP Concur for a clinical field monitor, including itemized expenses and approval status."
  tags:
    - finance
    - travel
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: travel-expenses
      port: 8080
      tools:
        - name: get-expense-report
          description: "Look up a travel expense report from SAP Concur by report ID."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          call: "concur.get-report"
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ApprovalStatus"
            - name: total_amount
              type: string
              mapping: "$.Total"
            - name: owner
              type: string
              mapping: "$.OwnerName"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

Queries SAP S/4HANA for a pharmaceutical manufacturing batch record by batch number. Returns batch status, yield, quality disposition, and expiration date.

naftiko: "0.5"
info:
  label: "SAP Manufacturing Batch Record Lookup"
  description: "Queries SAP S/4HANA for a pharmaceutical manufacturing batch record by batch number. Returns batch status, yield, quality disposition, and expiration date."
  tags:
    - manufacturing
    - batch-records
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-batch
      port: 8080
      tools:
        - name: get-batch-record
          description: "Look up a manufacturing batch record by batch number in SAP S/4HANA. Returns status, yield percentage, quality disposition, and expiry date."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number (10-digit)."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
          call: "sap.get-batch"
          with:
            batch_number: "{{batch_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.BatchStatus"
            - name: yield_pct
              type: string
              mapping: "$.d.YieldPercentage"
            - name: disposition
              type: string
              mapping: "$.d.QualityDisposition"
            - name: expiry_date
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lilly-s4.sap.com/sap/opu/odata/sap/PP_BATCH_MGMT_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: batches
          path: "/A_Batch(BatchNumber='{{batch_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: batch_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-batch
              method: GET

Checks SAP PO at Eli Lilly.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at Eli Lilly."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at Eli Lilly."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.order.vendor"
            - name: status
              type: string
              mapping: "$.order.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Remediates vulnerabilities at Eli Lilly via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at Eli Lilly via scanning, Jira, and Slack."
  tags:
    - security
    - vulnerability-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-fix
      port: 8080
      tools:
        - name: remediate
          description: "Fix vulnerabilities at Eli Lilly."
          inputParameters:
            - name: target
              in: body
              type: string
              description: "Target."
            - name: policy
              in: body
              type: string
              description: "Policy."
          steps:
            - name: scan
              type: call
              call: "qualys.scan"
              with:
                target: "{{target}}"
                policy: "{{policy}}"
            - name: prioritize
              type: call
              call: "security.prioritize"
              with:
                scan: "{{scan.id}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Vulns: {{prioritize.critical}} critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Scan: {{prioritize.critical}} critical"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: scans
          path: "/fo/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: security
      baseUri: "https://security.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: vulns
          path: "/prioritize"
          operations:
            - name: prioritize
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lilly.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks IT incident in ServiceNow for Eli Lilly.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for Eli Lilly."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at Eli Lilly."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Creates a ServiceNow change request for deploying updates to GxP-validated systems, linking it to the validation documentation and quality approval workflow.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request for Validation"
  description: "Creates a ServiceNow change request for deploying updates to GxP-validated systems, linking it to the validation documentation and quality approval workflow."
  tags:
    - quality
    - change-management
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gxp-change-mgmt
      port: 8080
      tools:
        - name: create-validation-change
          description: "Create a ServiceNow change request for a GxP-validated system deployment, link validation docs, and notify QA."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "The GxP system name."
            - name: release_version
              in: body
              type: string
              description: "The release version to deploy."
            - name: validation_doc_url
              in: body
              type: string
              description: "URL to the validation documentation in SharePoint."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "GxP Release: {{system_name}} v{{release_version}}"
                category: "gxp_deployment"
                type: "normal"
                description: "Deploy {{system_name}} version {{release_version}}. Validation docs: {{validation_doc_url}}"
                assigned_group: "IT_GxP_Support"
            - name: notify-qa
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "quality_engineering"
                channel_id: "change_requests"
                text: "GxP change request {{create-change.number}} created for {{system_name}} v{{release_version}}. Validation docs: {{validation_doc_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves SharePoint metadata at Eli Lilly.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at Eli Lilly."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at Eli Lilly."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at Eli Lilly via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at Eli Lilly via Datadog and Slack."
  tags:
    - operations
    - sla
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sla-monitor
      port: 8080
      tools:
        - name: check-sla
          description: "Monitor SLAs at Eli Lilly."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: target
              in: body
              type: number
              description: "SLA target %."
          steps:
            - name: metrics
              type: call
              call: "datadog.get-sla"
              with:
                service: "{{service}}"
            - name: check
              type: call
              call: "analytics.check-sla"
              with:
                uptime: "{{metrics.uptime}}"
                target: "{{target}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#ops"
                text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
            - name: log
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "SLA breach: {{service}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/metrics"
          operations:
            - name: get-sla
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Executes a predefined analytics query against the Snowflake clinical data warehouse and returns trial-level enrollment, endpoint, and safety summary statistics.

naftiko: "0.5"
info:
  label: "Snowflake Trial Analytics Query"
  description: "Executes a predefined analytics query against the Snowflake clinical data warehouse and returns trial-level enrollment, endpoint, and safety summary statistics."
  tags:
    - clinical-trials
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clinical-analytics
      port: 8080
      tools:
        - name: query-trial-analytics
          description: "Run a trial analytics query on Snowflake, returning enrollment counts, primary endpoint results, and safety summary."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: analysis_type
              in: body
              type: string
              description: "Type of analysis: enrollment, efficacy, safety, or combined."
          call: "snowflake.execute-query"
          with:
            warehouse: "CLINICAL_WH"
            database: "CLINICAL_DB"
            schema: "TRIAL_ANALYTICS"
            statement: "CALL sp_trial_analysis('{{trial_id}}', '{{analysis_type}}')"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Checks SonarQube quality gate status for GxP-validated application code, ensuring compliance with coding standards before release.

naftiko: "0.5"
info:
  label: "SonarQube GxP Code Quality Gate"
  description: "Checks SonarQube quality gate status for GxP-validated application code, ensuring compliance with coding standards before release."
  tags:
    - quality
    - code-quality
    - sonarqube
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: check-quality-gate
          description: "Check the SonarQube quality gate status for a GxP project, returning pass/fail status and metric details."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
          call: "sonarqube.get-quality-gate"
          with:
            projectKey: "{{project_key}}"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.lilly.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status"
          operations:
            - name: get-quality-gate
              method: GET

Searches Splunk at Eli Lilly.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at Eli Lilly."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at Eli Lilly."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL query."
          call: "splunk.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.results.count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.lilly.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Searches Splunk for security events related to GxP systems, returning recent alerts, failed logins, and unauthorized access attempts in regulated environments.

naftiko: "0.5"
info:
  label: "Splunk Security Event Lookup"
  description: "Searches Splunk for security events related to GxP systems, returning recent alerts, failed logins, and unauthorized access attempts in regulated environments."
  tags:
    - security
    - compliance
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: gxp-security
      port: 8080
      tools:
        - name: search-security-events
          description: "Search Splunk for security events on GxP-validated systems. Creates a ServiceNow incident if critical events are found."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "The GxP system name to search events for."
            - name: time_range
              in: body
              type: string
              description: "Time range: 1h, 24h, 7d."
          steps:
            - name: run-search
              type: call
              call: "splunk.create-search"
              with:
                search: "search index=gxp_security host={{system_name}} earliest=-{{time_range}} | stats count by severity, source"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "GxP Security Alert: {{system_name}}"
                category: "security"
                description: "Security events detected on {{system_name}} in last {{time_range}}. Splunk job: {{run-search.sid}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.lilly.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lilly.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

Triggers a demand forecast refresh in SAP S/4HANA for pharmaceutical products, then pushes updated forecasts to Snowflake for downstream analytics and alerts the supply chain team.

naftiko: "0.5"
info:
  label: "Supply Chain Demand Forecast Refresh"
  description: "Triggers a demand forecast refresh in SAP S/4HANA for pharmaceutical products, then pushes updated forecasts to Snowflake for downstream analytics and alerts the supply chain team."
  tags:
    - supply-chain
    - forecasting
    - sap-s4hana
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: demand-forecasting
      port: 8080
      tools:
        - name: refresh-demand-forecast
          description: "Trigger a demand forecast refresh for a product family, sync to Snowflake, and notify the supply chain team."
          inputParameters:
            - name: product_family
              in: body
              type: string
              description: "The product family code for forecasting."
            - name: forecast_horizon
              in: body
              type: string
              description: "Forecast horizon in months (e.g., 12, 24)."
          steps:
            - name: trigger-forecast
              type: call
              call: "sap.run-forecast"
              with:
                product_family: "{{product_family}}"
                horizon_months: "{{forecast_horizon}}"
            - name: sync-to-snowflake
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "SUPPLY_CHAIN_WH"
                statement: "CALL sp_load_forecast('{{product_family}}', '{{forecast_horizon}}')"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "supply_chain"
                channel_id: "demand_planning"
                text: "Demand forecast refreshed for {{product_family}} ({{forecast_horizon}} month horizon). Data synced to Snowflake."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lilly-s4.sap.com/sap/opu/odata/sap/PP_DEMAND_PLAN_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: forecasts
          path: "/A_DemandForecast"
          operations:
            - name: run-forecast
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lilly.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Publishes a Tableau workbook containing clinical trial analytics to Tableau Server and sets permissions for the study team.

naftiko: "0.5"
info:
  label: "Tableau Clinical Dashboard Publisher"
  description: "Publishes a Tableau workbook containing clinical trial analytics to Tableau Server and sets permissions for the study team."
  tags:
    - clinical-trials
    - analytics
    - tableau
    - tableau-server
capability:
  exposes:
    - type: mcp
      namespace: clinical-dashboards
      port: 8080
      tools:
        - name: publish-clinical-dashboard
          description: "Publish a clinical trial analytics workbook to Tableau Server."
          inputParameters:
            - name: workbook_name
              in: body
              type: string
              description: "The Tableau workbook name."
            - name: project_name
              in: body
              type: string
              description: "The Tableau Server project to publish to."
          steps:
            - name: publish-workbook
              type: call
              call: "tableau.publish-workbook"
              with:
                site_id: "lilly_clinical"
                project: "{{project_name}}"
                workbook: "{{workbook_name}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_analytics"
                channel_id: "dashboards"
                text: "Tableau workbook {{workbook_name}} published to project {{project_name}}. View at: {{publish-workbook.contentUrl}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.lilly.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: publish-workbook
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves Teams activity at Eli Lilly.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at Eli Lilly."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at Eli Lilly."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Executes a real-world evidence analytics query against the Teradata data warehouse for post-market surveillance studies and outcomes research.

naftiko: "0.5"
info:
  label: "Teradata Real-World Evidence Query"
  description: "Executes a real-world evidence analytics query against the Teradata data warehouse for post-market surveillance studies and outcomes research."
  tags:
    - pharmacovigilance
    - real-world-evidence
    - teradata
capability:
  exposes:
    - type: mcp
      namespace: rwe-analytics
      port: 8080
      tools:
        - name: query-rwe-data
          description: "Execute a real-world evidence query against Teradata for post-market studies."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The pharmaceutical product name."
            - name: study_type
              in: body
              type: string
              description: "RWE study type: outcomes, adherence, switching, safety."
          call: "teradata.execute-query"
          with:
            database: "RWE_DB"
            query: "CALL sp_rwe_analysis('{{product_name}}', '{{study_type}}')"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://teradata.lilly.com/api/query/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
      resources:
        - name: queries
          path: "/systems/lilly-rwe/queries"
          operations:
            - name: execute-query
              method: POST

Triggers a Terraform run via GitHub Actions to provision cloud lab infrastructure on AWS for computational chemistry workloads.

naftiko: "0.5"
info:
  label: "Terraform Lab Infrastructure Provisioner"
  description: "Triggers a Terraform run via GitHub Actions to provision cloud lab infrastructure on AWS for computational chemistry workloads."
  tags:
    - drug-development
    - infrastructure
    - terraform
    - github-actions
    - amazon-web-services
capability:
  exposes:
    - type: mcp
      namespace: lab-infra-provisioning
      port: 8080
      tools:
        - name: provision-lab-infra
          description: "Trigger a Terraform-based infrastructure provisioning workflow for lab computing resources via GitHub Actions."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The research project identifier."
            - name: instance_type
              in: body
              type: string
              description: "AWS instance type (e.g., p3.2xlarge for GPU workloads)."
            - name: instance_count
              in: body
              type: string
              description: "Number of instances to provision."
          steps:
            - name: trigger-workflow
              type: call
              call: "github.dispatch-workflow"
              with:
                owner: "eli-lilly"
                repo: "lab-infrastructure"
                workflow_id: "provision-lab.yml"
                ref: "main"
                inputs:
                  project_id: "{{project_id}}"
                  instance_type: "{{instance_type}}"
                  instance_count: "{{instance_count}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "research_computing"
                channel_id: "provisioning"
                text: "Lab infrastructure provisioning triggered for project {{project_id}}: {{instance_count}}x {{instance_type}}. GitHub Actions run: {{trigger-workflow.id}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatches
          path: "/repos/{{owner}}/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks Terraform workspace at Eli Lilly.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at Eli Lilly."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at Eli Lilly."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-ws"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.attributes.name"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-ws
              method: GET

Checks Vault secret at Eli Lilly.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at Eli Lilly."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at Eli Lilly."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.lilly.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

Processes invoices at Eli Lilly via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at Eli Lilly via OCR, SAP matching, approval, and Oracle recording."
  tags:
    - finance
    - accounts-payable
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: invoice-proc
      port: 8080
      tools:
        - name: process-invoice
          description: "Process invoices at Eli Lilly."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
          steps:
            - name: extract
              type: call
              call: "ocr.extract"
              with:
                doc: "{{invoice_id}}"
            - name: match
              type: call
              call: "sap.match-po"
              with:
                vendor: "{{vendor_id}}"
                amount: "{{extract.total}}"
            - name: approve
              type: call
              call: "workflow.submit"
              with:
                invoice: "{{invoice_id}}"
            - name: record
              type: call
              call: "oracle.create-payment"
              with:
                invoice: "{{invoice_id}}"
  consumes:
    - type: http
      namespace: ocr
      baseUri: "https://ocr.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ocr_token"
      resources:
        - name: invoices
          path: "/extract"
          operations:
            - name: extract
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: pos
          path: "/match"
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: approvals
          path: "/submit"
          operations:
            - name: submit
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Reviews vendors at Eli Lilly.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at Eli Lilly."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at Eli Lilly."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

Retrieves employee profile from Workday for Eli Lilly.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for Eli Lilly."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up Eli Lilly employee in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.worker.name"
            - name: title
              type: string
              mapping: "$.worker.title"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5.lilly.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

Schedules a Zoom meeting for clinical investigator training, adds it to the study calendar, and sends invitations through Microsoft Teams.

naftiko: "0.5"
info:
  label: "Zoom Clinical Investigator Meeting Scheduler"
  description: "Schedules a Zoom meeting for clinical investigator training, adds it to the study calendar, and sends invitations through Microsoft Teams."
  tags:
    - clinical-trials
    - meetings
    - zoom
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: investigator-meetings
      port: 8080
      tools:
        - name: schedule-investigator-meeting
          description: "Schedule a Zoom meeting for clinical investigator training and notify attendees via Teams."
          inputParameters:
            - name: trial_id
              in: body
              type: string
              description: "The clinical trial identifier."
            - name: meeting_topic
              in: body
              type: string
              description: "The meeting topic."
            - name: start_time
              in: body
              type: string
              description: "Meeting start time in ISO 8601 format."
            - name: duration_minutes
              in: body
              type: string
              description: "Meeting duration in minutes."
          steps:
            - name: create-meeting
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "{{trial_id}}: {{meeting_topic}}"
                type: 2
                start_time: "{{start_time}}"
                duration: "{{duration_minutes}}"
                settings:
                  join_before_host: false
                  waiting_room: true
            - name: announce-meeting
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "clinical_operations"
                channel_id: "investigator_meetings"
                text: "Investigator meeting scheduled for trial {{trial_id}}: {{meeting_topic}}. Join: {{create-meeting.join_url}}. Start: {{start_time}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Searches ZoomInfo for healthcare professional contact information to support commercial outreach and medical affairs engagement for new therapeutic launches.

naftiko: "0.5"
info:
  label: "ZoomInfo HCP Prospecting"
  description: "Searches ZoomInfo for healthcare professional contact information to support commercial outreach and medical affairs engagement for new therapeutic launches."
  tags:
    - commercial
    - hcp-prospecting
    - zoominfo
capability:
  exposes:
    - type: mcp
      namespace: hcp-prospecting
      port: 8080
      tools:
        - name: search-hcp-contacts
          description: "Search ZoomInfo for healthcare professional contact details by specialty, geography, and institution."
          inputParameters:
            - name: specialty
              in: body
              type: string
              description: "Medical specialty (e.g., endocrinology, oncology)."
            - name: state
              in: body
              type: string
              description: "US state abbreviation."
          call: "zoominfo.search-contacts"
          with:
            jobTitle: "physician"
            specialty: "{{specialty}}"
            state: "{{state}}"
            industry: "healthcare"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/contact"
          operations:
            - name: search-contacts
              method: POST