Johnson & Johnson Capabilities

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

Sort
Expand

Accepts a Veeva Vault regulatory document ID, retrieves the document text, sends it to Anthropic Claude for summarization, and posts the AI-generated summary to the regulatory affairs Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Anthropic-Powered Regulatory Document Summarizer"
  description: "Accepts a Veeva Vault regulatory document ID, retrieves the document text, sends it to Anthropic Claude for summarization, and posts the AI-generated summary to the regulatory affairs Microsoft Teams channel."
  tags:
    - ai
    - regulatory
    - veeva
    - anthropic
    - microsoft-teams
    - pharma
capability:
  exposes:
    - type: mcp
      namespace: ai-regulatory
      port: 8080
      tools:
        - name: summarize-regulatory-document
          description: "Given a Veeva Vault document ID, retrieve the document content and generate an executive summary using Anthropic Claude. Post the summary to the regulatory affairs Teams channel."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Veeva Vault document ID to summarize."
            - name: document_type
              in: body
              type: string
              description: "The document type context (e.g., IND, NDA, Clinical Study Report) to guide the summary."
          steps:
            - name: get-document
              type: call
              call: "veeva.get-document-content"
              with:
                document_id: "{{document_id}}"
            - name: generate-summary
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "You are a regulatory affairs expert at a pharmaceutical company. Summarize this {{document_type}} document in 3-5 bullet points highlighting key findings, safety signals, and regulatory actions required: {{get-document.content}}"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_regulatory_channel_id"
                text: "AI Summary of {{document_type}} (Vault ID: {{document_id}}): {{generate-summary.content}}"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: document-content
          path: "/objects/documents/{{document_id}}/file"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document-content
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Handles Azure Data Factory pipeline failures by creating a ServiceNow incident and notifying the data engineering team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Failure Handler"
  description: "Handles Azure Data Factory pipeline failures by creating a ServiceNow incident and notifying the data engineering team for Johnson & Johnson."
  tags:
    - data-engineering
    - azure-data-factory
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-engineering
      port: 8080
      tools:
        - name: handle-adf-failure
          description: "Given a pipeline run ID and failure details, create a ServiceNow incident and notify the team."
          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."
            - name: error_message
              in: body
              type: string
              description: "The error message from the failed run."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "ADF Pipeline Failure: {{pipeline_name}}"
                description: "Pipeline: {{pipeline_name}} | Run: {{run_id}} | Error: {{error_message}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.data_eng_channel"
                text: "ADF Pipeline FAILURE: {{pipeline_name}} (Run: {{run_id}}). Error: {{error_message}}. SNOW: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the latest build status from Azure DevOps for a given pipeline in Johnson & Johnson CI/CD operations.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Lookup"
  description: "Retrieves the latest build status from Azure DevOps for a given pipeline in Johnson & Johnson CI/CD operations."
  tags:
    - devops
    - azure-devops
    - ci-cd
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: get-build-status
          description: "Given a pipeline ID, return the latest build result, status, and build number."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline definition ID."
          call: azdo.get-latest-build
          with:
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: build_number
              type: string
              mapping: "$.value[0].buildNumber"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/jnj"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: builds
          path: "/_apis/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: query
          operations:
            - name: get-latest-build
              method: GET

Before an Azure DevOps production release deployment, checks ServiceNow for an approved change request, validates the deployment window, and gates the release accordingly.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Deployment Gate"
  description: "Before an Azure DevOps production release deployment, checks ServiceNow for an approved change request, validates the deployment window, and gates the release accordingly."
  tags:
    - devops
    - change-management
    - azure-devops
    - servicenow
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: release-management
      port: 8080
      tools:
        - name: gate-production-release
          description: "Given an Azure DevOps release ID and a ServiceNow change request number, verify the change is approved and within the deployment window before allowing the release to proceed."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "The Azure DevOps release definition and run ID."
            - name: change_request_number
              in: body
              type: string
              description: "The ServiceNow change request number (e.g., CHG0045678)."
            - name: deployment_environment
              in: body
              type: string
              description: "Target deployment environment: staging or production."
          steps:
            - name: get-change-request
              type: call
              call: "servicenow.get-change-request"
              with:
                change_number: "{{change_request_number}}"
            - name: notify-release-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_release_channel_id"
                text: "Release gate check: Release {{release_id}} | Change {{change_request_number}} state: {{get-change-request.state}} | Environment: {{deployment_environment}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates the clinical database lock process by verifying data completeness in Snowflake, updating status in Veeva Vault, and notifying stakeholders for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Data Lock Orchestrator"
  description: "Orchestrates the clinical database lock process by verifying data completeness in Snowflake, updating status in Veeva Vault, and notifying stakeholders for Johnson & Johnson."
  tags:
    - clinical-trials
    - data-management
    - snowflake
    - veeva-vault
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-mgmt
      port: 8080
      tools:
        - name: execute-data-lock
          description: "Given a study ID and database identifier, verify completeness, update lock status, and notify the team."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: database_id
              in: body
              type: string
              description: "The clinical database identifier."
            - name: lock_type
              in: body
              type: string
              description: "Lock type (soft-lock, hard-lock)."
          steps:
            - name: verify-completeness
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT COUNT(*) as open_queries FROM data_queries WHERE study_id = '{{study_id}}' AND status = 'Open'"
                warehouse: "CLINICAL_WH"
            - name: update-vault-status
              type: call
              call: veeva.update-object-record
              with:
                object_type: "study_database__c"
                id: "{{database_id}}"
                lock_status__c: "{{lock_type}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cdm_channel"
                text: "Database Lock: Study {{study_id}} — {{lock_type}} initiated. Open queries: {{verify-completeness.data}}. Vault updated."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles clinical data between Veeva Vault and Snowflake, logs discrepancies in Jira, and alerts the data management team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Data Reconciliation Checker"
  description: "Reconciles clinical data between Veeva Vault and Snowflake, logs discrepancies in Jira, and alerts the data management team for Johnson & Johnson."
  tags:
    - clinical-trials
    - data-management
    - veeva-vault
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-quality
      port: 8080
      tools:
        - name: reconcile-clinical-data
          description: "Given a study ID, compare record counts between Veeva Vault and Snowflake and report discrepancies."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: data_domain
              in: body
              type: string
              description: "Data domain to reconcile (demographics, adverse-events, labs)."
          steps:
            - name: query-vault
              type: call
              call: veeva.query-submissions
              with:
                query: "SELECT COUNT(*) FROM {{data_domain}}__c WHERE study_id__c = '{{study_id}}'"
            - name: query-snowflake
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT COUNT(*) as cnt FROM {{data_domain}} WHERE study_id = '{{study_id}}'"
                warehouse: "CLINICAL_WH"
            - name: log-discrepancy
              type: call
              call: jira.create-issue
              with:
                project: "CDM"
                summary: "Data Reconciliation: {{study_id}} — {{data_domain}}"
                issuetype: "Bug"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cdm_channel"
                text: "Data Reconciliation for Study {{study_id}} ({{data_domain}}): Vault={{query-vault.totalCount}}, Snowflake={{query-snowflake.data}}. Jira: {{log-discrepancy.key}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.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: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks IRB approval status for clinical sites by querying Veeva Vault, updating Jira, and notifying the regulatory team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical IRB Approval Tracking Orchestrator"
  description: "Tracks IRB approval status for clinical sites by querying Veeva Vault, updating Jira, and notifying the regulatory team for Johnson & Johnson."
  tags:
    - clinical-trials
    - regulatory
    - veeva-vault
    - jira
capability:
  exposes:
    - type: mcp
      namespace: clinical-regulatory
      port: 8080
      tools:
        - name: track-irb-approvals
          description: "Given a study ID, check IRB approval status across sites, update tracking, and notify the team."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: region
              in: body
              type: string
              description: "The geographic region to check."
          steps:
            - name: query-irb-status
              type: call
              call: veeva.query-submissions
              with:
                query: "SELECT site_id__c, irb_status__c FROM irb_submission__c WHERE study_id__c = '{{study_id}}' AND region__c = '{{region}}'"
            - name: update-tracker
              type: call
              call: jira.create-issue
              with:
                project: "REG"
                summary: "IRB Status Update: Study {{study_id}} — {{region}}"
                issuetype: "Task"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.regulatory_channel"
                text: "IRB Approval Status for Study {{study_id}} ({{region}}): {{query-irb-status.totalCount}} sites tracked. Jira: {{update-tracker.key}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: query-submissions
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes clinical protocol amendments by updating Veeva Vault, creating Jira tracking tasks, and notifying the clinical team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Protocol Amendment Processor"
  description: "Processes clinical protocol amendments by updating Veeva Vault, creating Jira tracking tasks, and notifying the clinical team for Johnson & Johnson."
  tags:
    - clinical-trials
    - veeva-vault
    - jira
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: clinical-regulatory
      port: 8080
      tools:
        - name: process-protocol-amendment
          description: "Given protocol amendment details, update the document in Veeva Vault, create a Jira task, and notify affected teams."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: amendment_number
              in: body
              type: string
              description: "The amendment version number."
            - name: amendment_summary
              in: body
              type: string
              description: "Summary of protocol changes."
            - name: impacted_sites
              in: body
              type: string
              description: "Comma-separated list of impacted site IDs."
          steps:
            - name: update-vault
              type: call
              call: veeva.create-object-record
              with:
                object_type: "protocol_amendment__c"
                study_id__c: "{{study_id}}"
                amendment_number__c: "{{amendment_number}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project: "CLIN"
                summary: "Protocol Amendment {{amendment_number}} for Study {{study_id}}"
                issuetype: "Task"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.clinical_ops_channel"
                text: "Protocol Amendment {{amendment_number}} for Study {{study_id}} processed. Impacted sites: {{impacted_sites}}. Jira: {{create-jira-task.key}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes Suspected Unexpected Serious Adverse Reactions by logging in Veeva Vault, creating urgent ServiceNow cases, and alerting the DSMB for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Safety Reporting SUSAR Handler"
  description: "Processes Suspected Unexpected Serious Adverse Reactions by logging in Veeva Vault, creating urgent ServiceNow cases, and alerting the DSMB for Johnson & Johnson."
  tags:
    - drug-safety
    - clinical-trials
    - veeva-vault
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: clinical-safety
      port: 8080
      tools:
        - name: process-susar
          description: "Given SUSAR details, log in Veeva Vault, create an urgent ServiceNow case, and alert the DSMB."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: patient_id
              in: body
              type: string
              description: "Anonymized patient identifier."
            - name: event_term
              in: body
              type: string
              description: "The adverse event MedDRA preferred term."
            - name: seriousness_criteria
              in: body
              type: string
              description: "Seriousness criteria met."
          steps:
            - name: log-in-vault
              type: call
              call: veeva.create-object-record
              with:
                object_type: "safety_case__c"
                study_id__c: "{{study_id}}"
                patient_id__c: "{{patient_id}}"
                event_term__c: "{{event_term}}"
            - name: create-urgent-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SUSAR: {{event_term}} — Study {{study_id}}"
                priority: "1"
            - name: alert-dsmb
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.dsmb_channel"
                text: "URGENT SUSAR: {{event_term}} in Study {{study_id}} (Patient {{patient_id}}). Seriousness: {{seriousness_criteria}}. Vault: {{log-in-vault.id}}. SNOW: {{create-urgent-case.number}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates monitoring visit schedules in Veeva Vault, assigns tasks in Jira, and notifies the CRA team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Site Monitoring Visit Scheduler"
  description: "Creates monitoring visit schedules in Veeva Vault, assigns tasks in Jira, and notifies the CRA team for Johnson & Johnson."
  tags:
    - clinical-trials
    - veeva-vault
    - jira
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: clinical-monitoring
      port: 8080
      tools:
        - name: schedule-monitoring-visit
          description: "Given site and visit details, create a Veeva Vault record, a Jira task, and a Teams notification."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The clinical site identifier."
            - name: visit_type
              in: body
              type: string
              description: "Type of monitoring visit (routine, for-cause, closeout)."
            - name: visit_date
              in: body
              type: string
              description: "Scheduled date for the visit."
            - name: cra_name
              in: body
              type: string
              description: "Name of the assigned CRA."
          steps:
            - name: create-vault-record
              type: call
              call: veeva.create-object-record
              with:
                object_type: "monitoring_visit__c"
                site_id__c: "{{site_id}}"
                visit_type__c: "{{visit_type}}"
                visit_date__c: "{{visit_date}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project: "CLIN"
                summary: "Monitoring Visit: {{visit_type}} at Site {{site_id}} on {{visit_date}}"
                issuetype: "Task"
            - name: notify-cra-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cra_channel"
                text: "New {{visit_type}} monitoring visit at Site {{site_id}} on {{visit_date}}. CRA: {{cra_name}}. Jira: {{create-jira-task.key}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks clinical study budgets by pulling actuals from SAP, comparing to plan in Snowflake, and notifying finance for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Study Budget Tracker"
  description: "Tracks clinical study budgets by pulling actuals from SAP, comparing to plan in Snowflake, and notifying finance for Johnson & Johnson."
  tags:
    - clinical-trials
    - finance
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clinical-finance
      port: 8080
      tools:
        - name: track-study-budget
          description: "Given a study ID and fiscal period, pull actuals from SAP, compare to budget, and alert on variances."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period to analyze."
          steps:
            - name: get-actuals
              type: call
              call: sap.get-cost-report
              with:
                study_id: "{{study_id}}"
                period: "{{fiscal_period}}"
            - name: get-budget
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT budget_amount, study_id FROM clinical_budgets WHERE study_id = '{{study_id}}' AND period = '{{fiscal_period}}'"
                warehouse: "FINANCE_WH"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.clinical_finance_channel"
                text: "Study Budget Alert: {{study_id}} for {{fiscal_period}}. Actuals: {{get-actuals.total}}. Budget: {{get-budget.data}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for current enrollment figures by study, generates a summary, and posts to the clinical operations Teams channel for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Clinical Trial Enrollment Status Reporter"
  description: "Queries Snowflake for current enrollment figures by study, generates a summary, and posts to the clinical operations Teams channel for Johnson & Johnson."
  tags:
    - clinical-trials
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: report-enrollment-status
          description: "Given a study ID, query enrollment data, format a summary, and post to the designated Teams channel."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study protocol number."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for clinical operations."
          steps:
            - name: query-enrollment
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT site_id, enrolled_count, target FROM enrollment_tracker WHERE study_id = '{{study_id}}'"
                warehouse: "CLINICAL_WH"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Enrollment Status for Study {{study_id}}: {{query-enrollment.data}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a new clinical trial site is approved in the study management system, creates the site record in Veeva Vault, assigns the study team, and sends an activation notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Site Activation in Veeva Vault"
  description: "When a new clinical trial site is approved in the study management system, creates the site record in Veeva Vault, assigns the study team, and sends an activation notification via Microsoft Teams."
  tags:
    - clinical-operations
    - veeva
    - microsoft-teams
    - pharma
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: clinical-ops
      port: 8080
      tools:
        - name: activate-clinical-site
          description: "Given a clinical trial study ID and site details, create the site activation record in Veeva Vault and notify the clinical operations team in Microsoft Teams."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "The clinical study identifier (e.g., CR-2026-001)."
            - name: site_id
              in: body
              type: string
              description: "The investigator site identifier."
            - name: site_name
              in: body
              type: string
              description: "The name of the clinical investigation site."
            - name: principal_investigator
              in: body
              type: string
              description: "Name of the principal investigator at the site."
          steps:
            - name: create-site-record
              type: call
              call: "veeva.create-site-document"
              with:
                study_id: "{{study_id}}"
                site_id: "{{site_id}}"
                site_name: "{{site_name}}"
                pi_name: "{{principal_investigator}}"
            - name: notify-clinical-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_clinical_ops_channel_id"
                text: "Site activated: {{site_name}} ({{site_id}}) for study {{study_id}} | PI: {{principal_investigator}} | Vault doc: {{create-site-record.document_id}}"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: documents
          path: "/objects/documents"
          operations:
            - name: create-site-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When AWS or Azure spend exceeds a budget threshold, creates a ServiceNow FinOps task and notifies the cloud infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Responder"
  description: "When AWS or Azure spend exceeds a budget threshold, creates a ServiceNow FinOps task and notifies the cloud infrastructure team via Microsoft Teams."
  tags:
    - cloud
    - finops
    - aws
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given a cloud cost anomaly event (provider, account, service, overage amount), create a ServiceNow FinOps task and alert the cloud team channel in Teams."
          inputParameters:
            - name: cloud_provider
              in: body
              type: string
              description: "Cloud provider identifier: aws or azure."
            - name: account_id
              in: body
              type: string
              description: "The cloud account or subscription ID with the anomaly."
            - name: anomaly_amount
              in: body
              type: number
              description: "The overage amount in USD triggering the alert."
            - name: service_name
              in: body
              type: string
              description: "The cloud service name responsible for the anomaly."
          steps:
            - name: create-finops-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Cloud cost anomaly: {{cloud_provider}} {{service_name}} — ${{anomaly_amount}} overage"
                category: "finops"
                assigned_group: "Cloud_FinOps"
            - name: notify-cloud-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_cloud_channel_id"
                text: "Cost Anomaly: {{cloud_provider}} account {{account_id}} | Service: {{service_name}} | Overage: ${{anomaly_amount}} | Task: {{create-finops-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Handles cold chain temperature excursions by logging in SAP, creating a quality incident, and alerting logistics and quality teams for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Cold Chain Temperature Excursion Handler"
  description: "Handles cold chain temperature excursions by logging in SAP, creating a quality incident, and alerting logistics and quality teams for Johnson & Johnson."
  tags:
    - supply-chain
    - cold-chain
    - quality
    - sap
capability:
  exposes:
    - type: mcp
      namespace: cold-chain-ops
      port: 8080
      tools:
        - name: handle-temp-excursion
          description: "Given temperature excursion details, log in SAP, create a ServiceNow quality incident, and alert teams."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The shipment identifier."
            - name: product_name
              in: body
              type: string
              description: "The product being shipped."
            - name: temperature_reading
              in: body
              type: string
              description: "The temperature reading."
            - name: acceptable_range
              in: body
              type: string
              description: "The acceptable temperature range."
            - name: duration_minutes
              in: body
              type: integer
              description: "Duration of excursion in minutes."
          steps:
            - name: log-sap-excursion
              type: call
              call: sap.create-quality-notification
              with:
                notification_type: "Q2"
                description: "Cold Chain Excursion: Shipment {{shipment_id}}, Product {{product_name}}, Temp {{temperature_reading}}"
            - name: create-quality-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cold Chain Excursion: {{product_name}} — Shipment {{shipment_id}}"
                priority: "2"
            - name: alert-teams
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cold_chain_channel"
                text: "COLD CHAIN ALERT: Temp excursion for {{product_name}} (Shipment {{shipment_id}}). Reading: {{temperature_reading}} (range: {{acceptable_range}}). SAP: {{log-sap-excursion.notification_number}}. SNOW: {{create-quality-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches Johnson & Johnson Confluence knowledge base for regulatory guidance documents by keyword.

naftiko: "0.5"
info:
  label: "Confluence Regulatory Knowledge Search"
  description: "Searches Johnson & Johnson Confluence knowledge base for regulatory guidance documents by keyword."
  tags:
    - regulatory
    - confluence
    - knowledge-management
    - search
capability:
  exposes:
    - type: mcp
      namespace: regulatory-kb
      port: 8080
      tools:
        - name: search-regulatory-docs
          description: "Given a search query, return matching Confluence pages with titles, space keys, and URLs."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search query for regulatory guidance documents."
          call: confluence.search-content
          with:
            search_query: "{{search_query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_size
              type: integer
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://jnj.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/content/search?cql=text~'{{search_query}}'"
          inputParameters:
            - name: search_query
              in: query
          operations:
            - name: search-content
              method: GET

Orchestrates ML model deployment by promoting a model in Databricks, updating the model registry, and notifying the data science team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Pipeline"
  description: "Orchestrates ML model deployment by promoting a model in Databricks, updating the model registry, and notifying the data science team for Johnson & Johnson."
  tags:
    - r-and-d
    - databricks
    - machine-learning
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: rd-ml-ops
      port: 8080
      tools:
        - name: deploy-ml-model
          description: "Given a model name and version, promote in Databricks MLflow, register in the model registry, and notify the team."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The MLflow model name."
            - name: model_version
              in: body
              type: string
              description: "The model version to promote."
            - name: target_stage
              in: body
              type: string
              description: "Target stage (Staging, Production)."
          steps:
            - name: promote-model
              type: call
              call: databricks.transition-model-stage
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
                stage: "{{target_stage}}"
            - name: log-deployment
              type: call
              call: servicenow.create-incident
              with:
                short_description: "ML Model Deployment: {{model_name}} v{{model_version}} to {{target_stage}}"
                category: "ml_ops"
            - name: notify-ds-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.data_science_channel"
                text: "ML Model Deployed: {{model_name}} v{{model_version}} promoted to {{target_stage}}. SNOW: {{log-deployment.number}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://jnj.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-versions
          path: "/mlflow/model-versions/transition-stage"
          operations:
            - name: transition-model-stage
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current health status of a monitored service from Datadog for Johnson & Johnson SRE operations.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Retrieves the current health status of a monitored service from Datadog for Johnson & Johnson SRE operations."
  tags:
    - monitoring
    - datadog
    - sre
    - health-check
capability:
  exposes:
    - type: mcp
      namespace: sre-ops
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a service name, return the overall status, number of active monitors, and last check time."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: datadog.get-service-status
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: overall_status
              type: string
              mapping: "$.overall_status"
            - name: active_monitors
              type: integer
              mapping: "$.counts.total"
            - name: last_triggered
              type: string
              mapping: "$.last_triggered_ts"
  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/search?query=service:{{service_name}}"
          inputParameters:
            - name: service_name
              in: query
          operations:
            - name: get-service-status
              method: GET

Initiates periodic SOP review cycles by identifying documents due for review in Veeva Vault, creating Jira tasks, and notifying owners for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Document Control SOP Review Cycle Initiator"
  description: "Initiates periodic SOP review cycles by identifying documents due for review in Veeva Vault, creating Jira tasks, and notifying owners for Johnson & Johnson."
  tags:
    - quality
    - document-control
    - veeva-vault
    - jira
capability:
  exposes:
    - type: mcp
      namespace: doc-control
      port: 8080
      tools:
        - name: initiate-sop-review-cycle
          description: "Given a document category and review period, find SOPs due for review, create tracking tasks, and notify owners."
          inputParameters:
            - name: document_category
              in: body
              type: string
              description: "The SOP document category (manufacturing, QC, clinical)."
            - name: review_due_days
              in: body
              type: integer
              description: "Days until review due date to include."
          steps:
            - name: find-docs-due
              type: call
              call: veeva.query-submissions
              with:
                query: "SELECT id, name__v FROM documents WHERE category__c = '{{document_category}}'"
            - name: create-jira-tasks
              type: call
              call: jira.create-issue
              with:
                project: "QMS"
                summary: "SOP Review Cycle: {{document_category}} — {{find-docs-due.totalCount}} documents"
                issuetype: "Task"
            - name: notify-owners
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.doc_control_channel"
                text: "SOP Review Cycle: {{find-docs-due.totalCount}} {{document_category}} documents due within {{review_due_days}} days. Jira: {{create-jira-tasks.key}}."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Receives an adverse event report, creates a pharmacovigilance case in ServiceNow, and notifies the drug safety team via Teams for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Drug Safety Adverse Event Report Processor"
  description: "Receives an adverse event report, creates a pharmacovigilance case in ServiceNow, and notifies the drug safety team via Teams for Johnson & Johnson."
  tags:
    - drug-safety
    - pharmacovigilance
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: drug-safety
      port: 8080
      tools:
        - name: process-adverse-event
          description: "Given adverse event details, create a PV case in ServiceNow and send an urgent notification to the drug safety officer."
          inputParameters:
            - name: patient_id
              in: body
              type: string
              description: "Anonymized patient identifier."
            - name: product_name
              in: body
              type: string
              description: "The drug product name."
            - name: event_description
              in: body
              type: string
              description: "Description of the adverse event."
            - name: severity
              in: body
              type: string
              description: "Severity classification (mild, moderate, severe, life-threatening)."
          steps:
            - name: create-pv-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AE Report: {{product_name}} — {{severity}}"
                category: "pharmacovigilance"
                description: "Patient: {{patient_id}} | Product: {{product_name}} | Event: {{event_description}} | Severity: {{severity}}"
            - name: notify-safety-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.drug_safety_channel"
                text: "URGENT: New {{severity}} AE for {{product_name}}. Case: {{create-pv-case.number}}. Patient: {{patient_id}}. Review required within 24 hours."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is confirmed in Workday, deactivates the user in Salesforce and Microsoft 365, closes open ServiceNow tickets, and notifies the manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Access Revocation"
  description: "When an employee termination is confirmed in Workday, deactivates the user in Salesforce and Microsoft 365, closes open ServiceNow tickets, and notifies the manager via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - salesforce
    - microsoft-teams
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, deactivate system access in Salesforce and Microsoft 365, close open ServiceNow tickets, and notify the manager via Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working day in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: deactivate-sf-user
              type: call
              call: "salesforce.deactivate-user"
              with:
                user_email: "{{get-employee.work_email}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Offboarding complete for {{get-employee.full_name}} (termination: {{termination_date}}). All system access has been revoked."
  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: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: PATCH
    - 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

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee."
  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 for a new Johnson & Johnson employee."
          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: business_segment
              in: body
              type: string
              description: "The J&J segment the employee is joining: MedTech or Innovative Medicine."
          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"
            - 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 Johnson & Johnson, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.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: PUT
    - 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

Processes environmental monitoring excursions in manufacturing by logging in SAP QM, creating a ServiceNow incident, and alerting quality for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Environmental Monitoring Alert Handler"
  description: "Processes environmental monitoring excursions in manufacturing by logging in SAP QM, creating a ServiceNow incident, and alerting quality for Johnson & Johnson."
  tags:
    - manufacturing
    - quality
    - sap
    - environmental-monitoring
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-em
      port: 8080
      tools:
        - name: handle-em-excursion
          description: "Given environmental excursion details, log a quality notification in SAP, create a ServiceNow incident, and alert quality."
          inputParameters:
            - name: area_name
              in: body
              type: string
              description: "The monitored area name."
            - name: parameter
              in: body
              type: string
              description: "The environmental parameter."
            - name: reading
              in: body
              type: string
              description: "The actual reading value."
            - name: limit
              in: body
              type: string
              description: "The acceptable limit value."
            - name: plant
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: log-sap-qn
              type: call
              call: sap.create-quality-notification
              with:
                notification_type: "Q2"
                description: "EM Excursion: {{area_name}} — {{parameter}} reading {{reading}} exceeds limit {{limit}}"
                plant: "{{plant}}"
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "EM Excursion: {{area_name}} — {{parameter}}"
                category: "environmental_monitoring"
            - name: alert-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.em_quality_channel"
                text: "EM ALERT: {{parameter}} excursion in {{area_name}} at Plant {{plant}}. Reading: {{reading}} (limit: {{limit}}). SAP QN: {{log-sap-qn.notification_number}}. SNOW: {{create-snow-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates FDA inspection readiness checklists by pulling SOPs from SharePoint, checking training compliance in Workday, and creating Jira tracking for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "FDA Inspection Readiness Checklist Generator"
  description: "Generates FDA inspection readiness checklists by pulling SOPs from SharePoint, checking training compliance in Workday, and creating Jira tracking for Johnson & Johnson."
  tags:
    - regulatory
    - compliance
    - sharepoint
    - workday
capability:
  exposes:
    - type: mcp
      namespace: regulatory-compliance
      port: 8080
      tools:
        - name: generate-inspection-checklist
          description: "Given a facility and inspection type, compile SOP readiness, training status, and create tracking tasks."
          inputParameters:
            - name: facility_name
              in: body
              type: string
              description: "The facility being inspected."
            - name: inspection_type
              in: body
              type: string
              description: "Type of FDA inspection (pre-approval, routine, for-cause)."
          steps:
            - name: check-sops
              type: call
              call: sharepoint.get-document-list
              with:
                library: "SOPs"
                filter: "facility eq '{{facility_name}}'"
            - name: check-training
              type: call
              call: workday.get-training-compliance
              with:
                facility: "{{facility_name}}"
                program: "GMP_Training"
            - name: create-epic
              type: call
              call: jira.create-issue
              with:
                project: "REG"
                summary: "FDA Inspection Readiness: {{facility_name}} — {{inspection_type}}"
                issuetype: "Epic"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.quality_compliance_channel"
                text: "FDA Inspection Readiness for {{facility_name}} ({{inspection_type}}): {{check-sops.count}} SOPs, {{check-training.compliance_rate}}% training compliant. Jira: {{create-epic.key}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://jnj.sharepoint.com/_api/web"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: lists
          path: "/lists"
          operations:
            - name: get-document-list
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Learning/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learningAssignments"
          operations:
            - name: get-training-compliance
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers GxP validation pipelines in GitHub Actions, logs validation events in ServiceNow, and notifies the QA team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "GitHub Actions GxP Validation Pipeline Trigger"
  description: "Triggers GxP validation pipelines in GitHub Actions, logs validation events in ServiceNow, and notifies the QA team for Johnson & Johnson."
  tags:
    - devops
    - github-actions
    - gxp
    - validation
capability:
  exposes:
    - type: mcp
      namespace: gxp-devops
      port: 8080
      tools:
        - name: trigger-gxp-validation
          description: "Given a system name and validation type, trigger the pipeline, log in ServiceNow, and notify QA."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name."
            - name: validation_type
              in: body
              type: string
              description: "Type of validation (IQ, OQ, PQ)."
            - name: system_name
              in: body
              type: string
              description: "The GxP system being validated."
          steps:
            - name: trigger-pipeline
              type: call
              call: github.trigger-workflow
              with:
                repo: "{{repo_name}}"
                workflow: "gxp-validation.yml"
            - name: log-validation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "GxP Validation: {{validation_type}} — {{system_name}}"
                category: "gxp_validation"
            - name: notify-qa
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.gxp_qa_channel"
                text: "GxP Validation triggered: {{validation_type}} for {{system_name}}. Repo: {{repo_name}}. SNOW: {{log-validation.number}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: trigger-workflow
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

On a protected-branch pipeline failure in GitHub Actions, creates a ServiceNow incident and posts a failure summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Actions Pipeline Failure Alert"
  description: "On a protected-branch pipeline failure in GitHub Actions, creates a ServiceNow incident and posts a failure summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - cicd
    - github-actions
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event, open a ServiceNow incident and alert the engineering Teams channel with the repository, branch, and workflow context."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository name in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the pipeline failed."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions run ID for the failed run."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[CI Failure] {{repository}} / {{branch}} — {{workflow_name}}"
                category: "software"
                urgency: "2"
            - name: post-alert
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Pipeline Failure: {{repository}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Run: {{run_id}} | Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks a GitHub repository for branch protection rules and required status checks for Johnson & Johnson DevSecOps compliance.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Check"
  description: "Checks a GitHub repository for branch protection rules and required status checks for Johnson & Johnson DevSecOps compliance."
  tags:
    - devops
    - github
    - compliance
    - security
capability:
  exposes:
    - type: mcp
      namespace: devsecops
      port: 8080
      tools:
        - name: check-repo-compliance
          description: "Given a repository name, return branch protection status, required reviews count, and CODEOWNERS presence."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name (org/repo format)."
          call: github.get-branch-protection
          with:
            repo_name: "{{repo_name}}"
          outputParameters:
            - name: protection_enabled
              type: boolean
              mapping: "$.enabled"
            - name: required_reviews
              type: integer
              mapping: "$.required_pull_request_reviews.required_approving_review_count"
            - name: enforce_admins
              type: boolean
              mapping: "$.enforce_admins.enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo_name}}/branches/main/protection"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-branch-protection
              method: GET

When a new digital health project is created in ServiceNow, provisions a GitHub repository with standard branch protection, assigns the project team, and notifies the engineering lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Provisioning for New Project"
  description: "When a new digital health project is created in ServiceNow, provisions a GitHub repository with standard branch protection, assigns the project team, and notifies the engineering lead via Microsoft Teams."
  tags:
    - devops
    - github
    - servicenow
    - microsoft-teams
    - developer-experience
capability:
  exposes:
    - type: mcp
      namespace: dev-provisioning
      port: 8080
      tools:
        - name: provision-project-repository
          description: "Given a project name and GitHub organization, create a new GitHub repository with standard branch protection rules and notify the engineering lead via Microsoft Teams."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "The project name used as the repository name."
            - name: github_org
              in: body
              type: string
              description: "The GitHub organization to create the repository in."
            - name: team_lead_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the engineering team lead."
          steps:
            - name: create-repo
              type: call
              call: "github.create-repository"
              with:
                org: "{{github_org}}"
                name: "{{project_name}}"
                private: "true"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{team_lead_upn}}"
                text: "Repository provisioned: {{github_org}}/{{project_name}} | URL: {{create-repo.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repositories
          path: "/orgs/{{org}}/repos"
          inputParameters:
            - name: org
              in: path
          operations:
            - name: create-repository
              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

When GitHub Advanced Security detects a critical or high severity CVE in a production repository, creates a ServiceNow security incident and notifies the product security engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub Advanced Security detects a critical or high severity CVE in a production repository, creates a ServiceNow security incident and notifies the product security engineering team via Microsoft Teams."
  tags:
    - devops
    - security
    - github
    - servicenow
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: product-security
      port: 8080
      tools:
        - name: triage-security-alert
          description: "Given a GitHub Dependabot or code-scanning alert for a production repository, create a ServiceNow security incident and notify the product security team in Microsoft Teams."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: alert_number
              in: body
              type: integer
              description: "The GitHub security alert number."
            - name: severity
              in: body
              type: string
              description: "Severity: critical, high, medium, or low."
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier if available (e.g., CVE-2024-12345)."
          steps:
            - name: get-alert
              type: call
              call: "github.get-dependabot-alert"
              with:
                repository: "{{repository}}"
                alert_number: "{{alert_number}}"
            - name: create-sec-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[Security] {{severity}} vulnerability in {{repository}}: {{cve_id}}"
                category: "security"
                urgency: "1"
            - name: notify-security-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Security Alert: {{severity}} — {{cve_id}} in {{repository}} | Incident: {{create-sec-incident.number}} | Details: {{get-alert.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repository}}/dependabot/alerts/{{alert_number}}"
          inputParameters:
            - name: repository
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Manages GxP-validated system change requests by creating a ServiceNow change, logging in Veeva Vault audit trail, and notifying approvers for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "GxP System Change Approval Workflow"
  description: "Manages GxP-validated system change requests by creating a ServiceNow change, logging in Veeva Vault audit trail, and notifying approvers for Johnson & Johnson."
  tags:
    - compliance
    - gxp
    - servicenow
    - veeva-vault
capability:
  exposes:
    - type: mcp
      namespace: gxp-compliance
      port: 8080
      tools:
        - name: initiate-gxp-change
          description: "Given change request details, create a ServiceNow change request, log in Veeva Vault, and notify the CAB."
          inputParameters:
            - name: system_name
              in: body
              type: string
              description: "Name of the GxP-validated system."
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed change."
            - name: risk_level
              in: body
              type: string
              description: "Risk classification (low, medium, high, critical)."
          steps:
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "GxP Change: {{system_name}} — {{risk_level}} risk"
                category: "gxp_change_control"
                description: "System: {{system_name}} | Change: {{change_description}} | Risk: {{risk_level}}"
            - name: log-vault-audit
              type: call
              call: veeva.create-object-record
              with:
                object_type: "change_control__c"
                system_name__c: "{{system_name}}"
                description__c: "{{change_description}}"
            - name: notify-cab
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cab_channel"
                text: "GxP Change Request: {{system_name}} ({{risk_level}} risk). SNOW: {{create-change-request.number}}. Vault: {{log-vault-audit.id}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.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: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates HCP speaker program events by creating events in Salesforce, logging compliance checks, and notifying medical affairs for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "HCP Speaker Program Event Coordinator"
  description: "Coordinates HCP speaker program events by creating events in Salesforce, logging compliance checks, and notifying medical affairs for Johnson & Johnson."
  tags:
    - medical-affairs
    - salesforce
    - compliance
    - events
capability:
  exposes:
    - type: mcp
      namespace: medical-affairs-events
      port: 8080
      tools:
        - name: coordinate-speaker-event
          description: "Given speaker event details, create the event in Salesforce, verify FMV compliance, and notify the team."
          inputParameters:
            - name: speaker_name
              in: body
              type: string
              description: "Name of the HCP speaker."
            - name: event_title
              in: body
              type: string
              description: "Title of the speaker program event."
            - name: event_date
              in: body
              type: string
              description: "Date of the event."
            - name: honorarium_amount
              in: body
              type: string
              description: "Speaker honorarium amount."
          steps:
            - name: create-event
              type: call
              call: salesforce.create-record
              with:
                object_type: "Speaker_Event__c"
                Speaker_Name__c: "{{speaker_name}}"
                Event_Title__c: "{{event_title}}"
            - name: check-fmv
              type: call
              call: servicenow.create-incident
              with:
                short_description: "FMV Compliance Check: {{speaker_name}} — {{honorarium_amount}}"
                category: "compliance"
            - name: notify-med-affairs
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.med_affairs_events_channel"
                text: "Speaker Event: {{event_title}} on {{event_date}}. Speaker: {{speaker_name}}. Honorarium: {{honorarium_amount}}. SFDC: {{create-event.id}}. FMV: {{check-fmv.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects/Speaker_Event__c"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Tracks vulnerability remediation by pulling scan results, creating ServiceNow tickets, and reporting to the CISO dashboard for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "IT Security Vulnerability Remediation Tracker"
  description: "Tracks vulnerability remediation by pulling scan results, creating ServiceNow tickets, and reporting to the CISO dashboard for Johnson & Johnson."
  tags:
    - security
    - servicenow
    - compliance
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: track-vulnerability-remediation
          description: "Given a scan ID and severity threshold, pull results, create remediation tickets, and update the dashboard."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The vulnerability scan identifier."
            - name: severity_threshold
              in: body
              type: string
              description: "Minimum severity to track (critical, high, medium)."
          steps:
            - name: get-findings
              type: call
              call: servicenow.get-vulnerabilities
              with:
                scan_id: "{{scan_id}}"
                severity: "{{severity_threshold}}"
            - name: create-tickets
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Vulnerability Remediation: Scan {{scan_id}}"
                category: "security"
            - name: notify-security
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.security_ops_channel"
                text: "Vulnerability Scan {{scan_id}}: {{get-findings.count}} findings at {{severity_threshold}}+ severity. Ticket: {{create-tickets.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the status and details of a Jira issue by key for Johnson & Johnson clinical operations project tracking.

naftiko: "0.5"
info:
  label: "Jira Clinical Issue Status Lookup"
  description: "Retrieves the status and details of a Jira issue by key for Johnson & Johnson clinical operations project tracking."
  tags:
    - clinical-trials
    - jira
    - project-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: clinical-pm
      port: 8080
      tools:
        - name: get-issue-status
          description: "Given a Jira issue key, return the issue summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., CLIN-1234)."
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jnj.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Tracks laboratory instrument calibration schedules by querying SAP PM, creating ServiceNow work orders, and notifying lab managers for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Laboratory Instrument Calibration Tracker"
  description: "Tracks laboratory instrument calibration schedules by querying SAP PM, creating ServiceNow work orders, and notifying lab managers for Johnson & Johnson."
  tags:
    - r-and-d
    - quality
    - sap
    - laboratory
capability:
  exposes:
    - type: mcp
      namespace: lab-ops
      port: 8080
      tools:
        - name: track-calibration
          description: "Given a lab identifier, find instruments due for calibration, create work orders, and notify lab management."
          inputParameters:
            - name: lab_id
              in: body
              type: string
              description: "The laboratory identifier."
            - name: days_ahead
              in: body
              type: integer
              description: "Days ahead to check for calibration due dates."
          steps:
            - name: query-instruments
              type: call
              call: sap.get-equipment-list
              with:
                lab_id: "{{lab_id}}"
                next_calibration_within: "{{days_ahead}}"
            - name: create-work-orders
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Lab Calibration Due: {{query-instruments.count}} instruments in Lab {{lab_id}}"
                category: "lab_operations"
            - name: notify-lab-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.lab_ops_channel"
                text: "Calibration Alert: {{query-instruments.count}} instruments in Lab {{lab_id}} due within {{days_ahead}} days. SNOW: {{create-work-orders.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a candidate applies via LinkedIn Recruiter, creates a candidate record in Workday Recruiting, assigns the requisition, and notifies the hiring manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Recruiting Pipeline Sync"
  description: "When a candidate applies via LinkedIn Recruiter, creates a candidate record in Workday Recruiting, assigns the requisition, and notifies the hiring manager via Microsoft Teams."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - microsoft-teams
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: sync-linkedin-candidate
          description: "Given a LinkedIn Recruiter candidate ID and a Workday job requisition ID, create the candidate record in Workday and notify the hiring manager via Microsoft Teams."
          inputParameters:
            - name: linkedin_candidate_id
              in: body
              type: string
              description: "The LinkedIn Recruiter candidate profile ID."
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID the candidate is applying to."
          steps:
            - name: get-candidate
              type: call
              call: "linkedin.get-candidate-profile"
              with:
                candidate_id: "{{linkedin_candidate_id}}"
            - name: create-candidate
              type: call
              call: "workday.create-candidate"
              with:
                first_name: "{{get-candidate.first_name}}"
                last_name: "{{get-candidate.last_name}}"
                email: "{{get-candidate.email}}"
                requisition_id: "{{requisition_id}}"
            - name: notify-hiring-manager
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_talent_channel_id"
                text: "New candidate synced: {{get-candidate.first_name}} {{get-candidate.last_name}} for requisition {{requisition_id}} | Workday candidate ID: {{create-candidate.candidate_id}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: candidate-profiles
          path: "/recruiterProfiles/{{candidate_id}}"
          inputParameters:
            - name: candidate_id
              in: path
          operations:
            - name: get-candidate-profile
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: candidates
          path: "/candidates"
          operations:
            - name: create-candidate
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Sources MSL candidates from LinkedIn, creates profiles in Workday recruiting, and notifies the talent acquisition team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline for Medical Science Liaisons"
  description: "Sources MSL candidates from LinkedIn, creates profiles in Workday recruiting, and notifies the talent acquisition team for Johnson & Johnson."
  tags:
    - hr
    - linkedin
    - workday
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: hr-talent-sourcing
      port: 8080
      tools:
        - name: source-msl-candidates
          description: "Given search criteria for MSL roles, source candidates from LinkedIn, create prospects in Workday, and notify TA."
          inputParameters:
            - name: therapeutic_area
              in: body
              type: string
              description: "The target therapeutic area."
            - name: location
              in: body
              type: string
              description: "The target geographic location."
            - name: experience_years
              in: body
              type: integer
              description: "Minimum years of experience."
          steps:
            - name: search-linkedin
              type: call
              call: linkedin.search-candidates
              with:
                keywords: "Medical Science Liaison {{therapeutic_area}}"
                location: "{{location}}"
            - name: create-prospects
              type: call
              call: workday.create-prospect
              with:
                source: "LinkedIn"
                requisition_area: "{{therapeutic_area}}"
            - name: notify-ta
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.talent_channel"
                text: "MSL Talent Pipeline: {{search-linkedin.count}} candidates found for {{therapeutic_area}} in {{location}}."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: people-search
          path: "/people?keywords={{keywords}}"
          inputParameters:
            - name: keywords
              in: query
          operations:
            - name: search-candidates
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Recruiting/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: prospects
          path: "/prospects"
          operations:
            - name: create-prospect
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes manufacturing deviations by creating a ServiceNow incident, logging in SAP QM, and notifying quality assurance for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Manufacturing Deviation Handler"
  description: "Processes manufacturing deviations by creating a ServiceNow incident, logging in SAP QM, and notifying quality assurance for Johnson & Johnson."
  tags:
    - manufacturing
    - quality
    - servicenow
    - sap
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-qa
      port: 8080
      tools:
        - name: handle-deviation
          description: "Given deviation details, create a ServiceNow incident, log in SAP quality management, and notify the QA team."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The manufacturing batch number."
            - name: deviation_type
              in: body
              type: string
              description: "Type of deviation (process, equipment, material)."
            - name: description
              in: body
              type: string
              description: "Detailed description of the deviation."
            - name: plant
              in: body
              type: string
              description: "The manufacturing plant code."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "MFG Deviation: {{deviation_type}} — Batch {{batch_number}}"
                category: "manufacturing_quality"
                description: "Plant: {{plant}} | Batch: {{batch_number}} | Type: {{deviation_type}} | Details: {{description}}"
            - name: log-sap-notification
              type: call
              call: sap.create-quality-notification
              with:
                notification_type: "Q2"
                material: "{{batch_number}}"
                plant: "{{plant}}"
                description: "{{deviation_type}}: {{description}}"
            - name: notify-qa
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.qa_channel"
                text: "MFG Deviation Alert: {{deviation_type}} at Plant {{plant}}, Batch {{batch_number}}. SNOW: {{create-snow-incident.number}}. SAP QN: {{log-sap-notification.notification_number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.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: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a medical device complaint is logged in Salesforce Service Cloud, enriches it with product master data from SAP, creates a quality event in Veeva Vault, and routes to the quality team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Medical Device Complaint Case Triage"
  description: "When a medical device complaint is logged in Salesforce Service Cloud, enriches it with product master data from SAP, creates a quality event in Veeva Vault, and routes to the quality team via Microsoft Teams."
  tags:
    - customer-support
    - quality
    - salesforce
    - sap
    - veeva
    - microsoft-teams
    - medtech
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: triage-device-complaint
          description: "Given a Salesforce case ID for a medical device complaint, retrieve SAP product details, create a Veeva quality event, and notify the quality team in Microsoft Teams."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID for the device complaint."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: get-product
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{get-case.product_code}}"
            - name: create-quality-event
              type: call
              call: "veeva.create-quality-event"
              with:
                case_id: "{{case_id}}"
                product_name: "{{get-product.material_description}}"
                complaint_summary: "{{get-case.description}}"
            - name: notify-quality-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_quality_channel_id"
                text: "Device complaint triaged: Case {{case_id}} | Product: {{get-product.material_description}} | Veeva event: {{create-quality-event.event_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: quality-events
          path: "/objects/quality_events__v"
          operations:
            - name: create-quality-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes medical information requests by logging in Salesforce, searching the knowledge base, and notifying the medical affairs team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Medical Information Request Handler"
  description: "Processes medical information requests by logging in Salesforce, searching the knowledge base, and notifying the medical affairs team for Johnson & Johnson."
  tags:
    - medical-affairs
    - salesforce
    - knowledge-management
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: medical-affairs
      port: 8080
      tools:
        - name: handle-med-info-request
          description: "Given a medical information request, log in Salesforce, search the knowledge base, and notify medical affairs."
          inputParameters:
            - name: requestor_name
              in: body
              type: string
              description: "Name of the healthcare professional."
            - name: product_name
              in: body
              type: string
              description: "The product being inquired about."
            - name: question
              in: body
              type: string
              description: "The medical information question."
            - name: channel
              in: body
              type: string
              description: "Request channel (phone, email, web)."
          steps:
            - name: log-in-salesforce
              type: call
              call: salesforce.create-case
              with:
                subject: "MedInfo Request: {{product_name}}"
                description: "Requestor: {{requestor_name}} | Product: {{product_name}} | Question: {{question}}"
                type: "Medical_Information"
            - name: search-knowledge
              type: call
              call: confluence.search-content
              with:
                search_query: "{{product_name}} {{question}}"
            - name: notify-med-affairs
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.med_affairs_channel"
                text: "New MedInfo Request from {{requestor_name}} about {{product_name}}. Case: {{log-in-salesforce.id}}. KB matches: {{search-knowledge.totalSize}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://jnj.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search-content
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Launches periodic access certification campaigns by pulling user data from Okta, creating review tasks, and notifying managers for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Okta Access Certification Campaign Launcher"
  description: "Launches periodic access certification campaigns by pulling user data from Okta, creating review tasks, and notifying managers for Johnson & Johnson."
  tags:
    - security
    - okta
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: launch-access-certification
          description: "Given a certification scope, pull active users from Okta, create review tasks, and notify owners."
          inputParameters:
            - name: application_name
              in: body
              type: string
              description: "The Okta application name to certify."
            - name: campaign_name
              in: body
              type: string
              description: "The certification campaign name."
          steps:
            - name: get-users
              type: call
              call: okta.get-app-users
              with:
                application_name: "{{application_name}}"
            - name: create-campaign
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Access Certification: {{campaign_name}} — {{application_name}}"
                category: "identity_governance"
            - name: notify-owners
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.iam_channel"
                text: "Access Certification: {{campaign_name}} for {{application_name}}. {{get-users.count}} users to review. SNOW: {{create-campaign.number}}."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://jnj.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: app-users
          path: "/apps/{{application_name}}/users"
          inputParameters:
            - name: application_name
              in: path
          operations:
            - name: get-app-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current status and profile of an Okta user by login email for Johnson & Johnson identity management.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Retrieves the current status and profile of an Okta user by login email for Johnson & Johnson identity management."
  tags:
    - security
    - okta
    - identity
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: get-user-status
          description: "Given a user email, return the Okta user status, last login, and MFA enrollment status."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user login email address."
          call: okta.get-user
          with:
            user_email: "{{user_email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
            - name: mfa_enrolled
              type: boolean
              mapping: "$.credentials.provider.type"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://jnj.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_email}}"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: get-user
              method: GET

Processes patient assistance program enrollments by creating cases in Salesforce, verifying eligibility, and notifying patient services for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Patient Assistance Program Enrollment Processor"
  description: "Processes patient assistance program enrollments by creating cases in Salesforce, verifying eligibility, and notifying patient services for Johnson & Johnson."
  tags:
    - commercial
    - salesforce
    - patient-services
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: patient-services
      port: 8080
      tools:
        - name: process-pap-enrollment
          description: "Given patient enrollment details, create a Salesforce case, verify eligibility, and notify the patient services team."
          inputParameters:
            - name: patient_id
              in: body
              type: string
              description: "The patient identifier."
            - name: product_name
              in: body
              type: string
              description: "The product for which assistance is requested."
            - name: insurance_status
              in: body
              type: string
              description: "Patient insurance status."
          steps:
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "PAP Enrollment: {{product_name}} — Patient {{patient_id}}"
                type: "Patient_Assistance"
            - name: verify-eligibility
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT eligible FROM pap_eligibility_rules WHERE product = '{{product_name}}'"
                warehouse: "COMMERCIAL_WH"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.patient_services_channel"
                text: "PAP Enrollment: Patient {{patient_id}} for {{product_name}}. Eligibility: {{verify-eligibility.data}}. Case: {{create-case.id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Returns current headcount by department and cost center from Workday, segmented by business unit for workforce planning across MedTech and Innovative Medicine.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Returns current headcount by department and cost center from Workday, segmented by business unit for workforce planning across MedTech and Innovative Medicine."
  tags:
    - hr
    - payroll
    - headcount
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns a list of active employees grouped by department and cost center from Workday. Use for headcount planning, budget forecasting, and organizational design."
          call: "workday.headcount-report"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.Report_Entry"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.Employee_ID"
                - name: full_name
                  type: string
                  mapping: "$.Worker"
                - name: department
                  type: string
                  mapping: "$.Cost_Center"
                - name: employment_type
                  type: string
                  mapping: "$.Worker_Type"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/service/customreport2"
      authentication:
        type: basic
        username: "$secrets.workday_report_user"
        password: "$secrets.workday_report_password"
      resources:
        - name: headcount
          path: "/jnj/headcount_by_department"
          operations:
            - name: headcount-report
              method: GET
              outputRawFormat: json

Runs pharmacovigilance signal detection queries in Snowflake, generates summary reports, and alerts the safety review board for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Pharmacovigilance Signal Detection Reporter"
  description: "Runs pharmacovigilance signal detection queries in Snowflake, generates summary reports, and alerts the safety review board for Johnson & Johnson."
  tags:
    - drug-safety
    - pharmacovigilance
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: pv-analytics
      port: 8080
      tools:
        - name: run-signal-detection
          description: "Given a product and time period, run signal detection queries, create a Jira tracking issue, and alert the safety board."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The drug product name."
            - name: period_start
              in: body
              type: string
              description: "Analysis period start date."
            - name: period_end
              in: body
              type: string
              description: "Analysis period end date."
          steps:
            - name: run-detection
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL pv_signal_detection('{{product_name}}', '{{period_start}}', '{{period_end}}')"
                warehouse: "PV_WH"
            - name: create-review-ticket
              type: call
              call: jira.create-issue
              with:
                project: "PV"
                summary: "Signal Detection: {{product_name}} ({{period_start}} to {{period_end}})"
                issuetype: "Task"
            - name: alert-safety-board
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.safety_board_channel"
                text: "PV Signal Detection: {{product_name}} ({{period_start}} to {{period_end}}). Signals: {{run-detection.signal_count}}. Jira: {{create-review-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.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: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the last refresh status of a Power BI dataset for Johnson & Johnson analytics operations.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status of a Power BI dataset for Johnson & Johnson analytics operations."
  tags:
    - analytics
    - power-bi
    - reporting
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI dataset ID, return the last refresh status, start time, and end time."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: powerbi.get-refresh-history
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  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?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Triggers a Power BI dataset refresh for the pharmaceutical sales performance dashboard and posts refresh status to the commercial excellence Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Power BI Pharma Sales Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the pharmaceutical sales performance dashboard and posts refresh status to the commercial excellence Microsoft Teams channel."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - pharma
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-sales-dashboard
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh for the pharmaceutical sales dashboard and notify the commercial excellence Teams channel."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the pharma sales dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: post-status
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_commercial_channel_id"
                text: "Power BI refresh triggered: dataset {{dataset_id}} in workspace {{workspace_id}}. Results available shortly."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Coordinates product recall activities by creating cases in Salesforce, notifying logistics via SAP, and alerting leadership for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Product Recall Coordination Workflow"
  description: "Coordinates product recall activities by creating cases in Salesforce, notifying logistics via SAP, and alerting leadership for Johnson & Johnson."
  tags:
    - quality
    - product-recall
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: quality-recall
      port: 8080
      tools:
        - name: initiate-recall
          description: "Given product recall details, create a Salesforce case, update SAP batch status, and send urgent notifications."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The product name being recalled."
            - name: batch_numbers
              in: body
              type: string
              description: "Comma-separated affected batch numbers."
            - name: recall_reason
              in: body
              type: string
              description: "Reason for the recall."
            - name: recall_class
              in: body
              type: string
              description: "Recall classification (Class I, II, III)."
          steps:
            - name: create-recall-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Product Recall: {{product_name}} — {{recall_class}}"
                type: "Product_Recall"
            - name: update-batch-status
              type: call
              call: sap.update-batch-status
              with:
                batch_numbers: "{{batch_numbers}}"
                status: "blocked"
            - name: alert-leadership
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.executive_channel"
                text: "URGENT — Product Recall: {{product_name}} ({{recall_class}}). Batches: {{batch_numbers}}. Case: {{create-recall-case.id}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Refreshes the R&D pipeline dashboard by pulling compound status from Snowflake, updating Power BI, and notifying R&D leadership for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "R&D Compound Pipeline Dashboard Refresh"
  description: "Refreshes the R&D pipeline dashboard by pulling compound status from Snowflake, updating Power BI, and notifying R&D leadership for Johnson & Johnson."
  tags:
    - r-and-d
    - snowflake
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: rd-analytics
      port: 8080
      tools:
        - name: refresh-pipeline-dashboard
          description: "Trigger a pipeline data extract from Snowflake, refresh the Power BI dataset, and notify leadership."
          inputParameters:
            - name: dashboard_id
              in: body
              type: string
              description: "The Power BI dashboard dataset ID."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel for R&D leadership."
          steps:
            - name: extract-pipeline-data
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL refresh_rd_pipeline_snapshot()"
                warehouse: "RD_WH"
            - name: refresh-powerbi
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dashboard_id}}"
            - name: notify-leadership
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "R&D Pipeline Dashboard refreshed. Data as of {{extract-pipeline-data.timestamp}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.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: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates RWE data ingestion from external sources into Snowflake, validates data quality, and notifies the HEOR team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Real-World Evidence Data Ingestion Pipeline"
  description: "Orchestrates RWE data ingestion from external sources into Snowflake, validates data quality, and notifies the HEOR team for Johnson & Johnson."
  tags:
    - r-and-d
    - real-world-evidence
    - snowflake
    - data-engineering
capability:
  exposes:
    - type: mcp
      namespace: rwe-analytics
      port: 8080
      tools:
        - name: ingest-rwe-data
          description: "Given a data source and dataset identifier, ingest into Snowflake, run quality checks, and notify HEOR."
          inputParameters:
            - name: data_source
              in: body
              type: string
              description: "The RWE data source name (claims, EMR, registry)."
            - name: dataset_id
              in: body
              type: string
              description: "The dataset identifier."
            - name: study_id
              in: body
              type: string
              description: "The associated study ID."
          steps:
            - name: ingest-data
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL rwe_ingest_pipeline('{{data_source}}', '{{dataset_id}}', '{{study_id}}')"
                warehouse: "RWE_WH"
            - name: validate-quality
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL rwe_data_quality_check('{{dataset_id}}')"
                warehouse: "RWE_WH"
            - name: notify-heor
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.heor_channel"
                text: "RWE Data Ingestion Complete: {{data_source}} ({{dataset_id}}) for Study {{study_id}}. Records: {{ingest-data.row_count}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Veeva Vault for upcoming regulatory submission deadlines, creates Jira tracking tickets, and alerts the regulatory affairs team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Regulatory Submission Deadline Tracker"
  description: "Queries Veeva Vault for upcoming regulatory submission deadlines, creates Jira tracking tickets, and alerts the regulatory affairs team for Johnson & Johnson."
  tags:
    - regulatory
    - veeva-vault
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: track-submission-deadlines
          description: "Given a time horizon in days, find upcoming submission deadlines, create Jira tickets, and post a summary."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to check for deadlines."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel for regulatory affairs notifications."
          steps:
            - name: query-deadlines
              type: call
              call: veeva.query-submissions
              with:
                query: "SELECT id, name__v, submission_date__c FROM submission__c WHERE submission_date__c <= DATEADD(day,{{days_ahead}},GETDATE())"
            - name: create-tracker
              type: call
              call: jira.create-issue
              with:
                project: "REG"
                summary: "Upcoming Submissions: {{query-deadlines.totalCount}} items within {{days_ahead}} days"
                issuetype: "Task"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Regulatory Alert: {{query-deadlines.totalCount}} submissions due within {{days_ahead}} days. Jira: {{create-tracker.key}}"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: object-records
          path: "/vobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-object-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://jnj.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Assembles and validates a regulatory submission document package from Veeva Vault for an FDA or EMA submission, cross-checks against the SAP submission tracking record, and notifies the regulatory affairs team.

naftiko: "0.5"
info:
  label: "Regulatory Submission Document Package"
  description: "Assembles and validates a regulatory submission document package from Veeva Vault for an FDA or EMA submission, cross-checks against the SAP submission tracking record, and notifies the regulatory affairs team."
  tags:
    - regulatory
    - veeva
    - sap
    - microsoft-teams
    - pharma
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: prepare-submission-package
          description: "Given a regulatory submission ID, retrieve all required documents from Veeva Vault, validate completeness against the SAP submission checklist, and notify the regulatory affairs team in Teams."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "The regulatory submission ID (e.g., NDA-2026-001)."
            - name: submission_type
              in: body
              type: string
              description: "The submission type: NDA, BLA, 510k, CE-mark, or PMA."
          steps:
            - name: get-documents
              type: call
              call: "veeva.list-submission-documents"
              with:
                submission_id: "{{submission_id}}"
            - name: notify-reg-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_regulatory_channel_id"
                text: "Submission package assembled: {{submission_id}} ({{submission_type}}) | Documents retrieved: {{get-documents.document_count}} | Ready for final review."
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: submission-documents
          path: "/objects/documents"
          operations:
            - name: list-submission-documents
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates commercial territory realignment by updating Salesforce territories, adjusting Workday reporting, and notifying the commercial team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Salesforce Commercial Territory Realignment Orchestrator"
  description: "Orchestrates commercial territory realignment by updating Salesforce territories, adjusting Workday reporting, and notifying the commercial team for Johnson & Johnson."
  tags:
    - commercial
    - salesforce
    - workday
    - territory-management
capability:
  exposes:
    - type: mcp
      namespace: commercial-ops-mgmt
      port: 8080
      tools:
        - name: realign-territories
          description: "Given territory changes, update Salesforce assignments, adjust Workday structures, and notify the team."
          inputParameters:
            - name: territory_id
              in: body
              type: string
              description: "The territory identifier."
            - name: new_rep_id
              in: body
              type: string
              description: "The new sales representative employee ID."
            - name: effective_date
              in: body
              type: string
              description: "Effective date of the realignment."
          steps:
            - name: update-salesforce
              type: call
              call: salesforce.update-record
              with:
                object_type: "Territory2"
                id: "{{territory_id}}"
                Assigned_Rep__c: "{{new_rep_id}}"
            - name: update-workday
              type: call
              call: workday.update-assignment
              with:
                employee_id: "{{new_rep_id}}"
                territory: "{{territory_id}}"
            - name: notify-commercial
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.commercial_ops_channel"
                text: "Territory Realignment: Territory {{territory_id}} assigned to Rep {{new_rep_id}} effective {{effective_date}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: territories
          path: "/sobjects/Territory2/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Staffing/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: assignments
          path: "/workers/{{employee_id}}/assignments"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: update-assignment
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a new lead is created in Salesforce for an Innovative Medicine product, enriches the lead with additional contact and company data, then updates the Salesforce record.

naftiko: "0.5"
info:
  label: "Salesforce CRM Lead Enrichment"
  description: "When a new lead is created in Salesforce for an Innovative Medicine product, enriches the lead with additional contact and company data, then updates the Salesforce record."
  tags:
    - sales
    - crm
    - salesforce
    - enrichment
    - pharma
capability:
  exposes:
    - type: mcp
      namespace: crm-enrichment
      port: 8080
      tools:
        - name: enrich-pharma-lead
          description: "Given a Salesforce lead ID for an Innovative Medicine product, retrieve the lead details and update the record with enriched medical specialty and institution data."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-read.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: update-lead
              type: call
              call: "salesforce-write.update-lead"
              with:
                lead_id: "{{lead_id}}"
                lead_source: "Enriched"
                status: "Working"
  consumes:
    - type: http
      namespace: salesforce-read
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: salesforce-write
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

Retrieves healthcare provider account details from Salesforce CRM by account ID for Johnson & Johnson commercial operations.

naftiko: "0.5"
info:
  label: "Salesforce HCP Account Lookup"
  description: "Retrieves healthcare provider account details from Salesforce CRM by account ID for Johnson & Johnson commercial operations."
  tags:
    - commercial
    - salesforce
    - hcp
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: commercial-ops
      port: 8080
      tools:
        - name: get-hcp-account
          description: "Given a Salesforce account ID, return the HCP name, specialty, prescribing tier, and territory."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the healthcare provider."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: hcp_name
              type: string
              mapping: "$.Name"
            - name: specialty
              type: string
              mapping: "$.Specialty__c"
            - name: tier
              type: string
              mapping: "$.Prescribing_Tier__c"
            - name: territory
              type: string
              mapping: "$.Territory__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Tracks KOL engagement activities by pulling data from Salesforce, summarizing in Snowflake, and reporting to medical affairs for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Salesforce Key Opinion Leader Engagement Tracker"
  description: "Tracks KOL engagement activities by pulling data from Salesforce, summarizing in Snowflake, and reporting to medical affairs for Johnson & Johnson."
  tags:
    - medical-affairs
    - salesforce
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: medical-affairs-analytics
      port: 8080
      tools:
        - name: track-kol-engagement
          description: "Given a therapeutic area, pull KOL engagement data, aggregate in Snowflake, and post a summary."
          inputParameters:
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area (e.g., oncology, immunology)."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., Q1-2026)."
          steps:
            - name: pull-kol-data
              type: call
              call: salesforce.query
              with:
                q: "SELECT Name, Total_Engagements__c FROM Contact WHERE Therapeutic_Area__c = '{{therapeutic_area}}' AND KOL_Flag__c = true"
            - name: aggregate-data
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO kol_engagement_summary SELECT * FROM staged_kol_data WHERE period = '{{period}}'"
                warehouse: "ANALYTICS_WH"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.med_affairs_channel"
                text: "KOL Engagement Summary for {{therapeutic_area}} ({{period}}): {{pull-kol-data.totalSize}} KOLs tracked."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a MedTech sales opportunity in Salesforce reaches a Verbal Commit stage, creates a corresponding SAP sales order and notifies the regional sales manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Medical Device Sales Opportunity Sync"
  description: "When a MedTech sales opportunity in Salesforce reaches a Verbal Commit stage, creates a corresponding SAP sales order and notifies the regional sales manager via Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - medtech
    - erp
capability:
  exposes:
    - type: mcp
      namespace: medtech-sales
      port: 8080
      tools:
        - name: sync-opportunity-to-sap
          description: "Given a Salesforce opportunity ID at Verbal Commit stage, create a SAP sales order and write the SAP document number back to Salesforce. Use when a medtech deal is confirmed."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID to sync into SAP."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-read.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-order
              type: call
              call: "sap-sd.create-sales-order"
              with:
                customer_id: "{{get-opportunity.account_external_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
            - name: update-opportunity
              type: call
              call: "salesforce-write.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_order_number: "{{create-sap-order.document_number}}"
  consumes:
    - type: http
      namespace: salesforce-read
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-sd
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: salesforce-write
      baseUri: "https://jnj.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: update-opportunity
              method: PATCH

Queries SAP Ariba for supplier contracts expiring within the next 60 days, creates a ServiceNow procurement renewal task for each, and posts a contract expiry digest to the procurement Teams channel.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Monitor"
  description: "Queries SAP Ariba for supplier contracts expiring within the next 60 days, creates a ServiceNow procurement renewal task for each, and posts a contract expiry digest to the procurement Teams channel."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: contract-ops
      port: 8080
      tools:
        - name: monitor-expiring-contracts
          description: "Retrieve all SAP Ariba contracts expiring in the next 60 days, open a ServiceNow renewal task for each, and post a summary digest to the procurement Teams channel."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: integer
              description: "Number of days ahead to look for expiring contracts (default 60)."
          steps:
            - name: get-expiring-contracts
              type: call
              call: "ariba.list-expiring-contracts"
              with:
                days: "{{days_until_expiry}}"
            - name: create-renewal-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Contract renewal required: {{days_until_expiry}} day expiry window"
                category: "procurement"
                assigned_group: "Strategic_Sourcing"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Contract Expiry Digest: {{get-expiring-contracts.contract_count}} contracts expiring within {{days_until_expiry}} days | Renewal task: {{create-renewal-task.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          operations:
            - name: list-expiring-contracts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Manages contract renewal workflows by checking expiring contracts in SAP Ariba, creating ServiceNow tasks, and notifying procurement for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Workflow"
  description: "Manages contract renewal workflows by checking expiring contracts in SAP Ariba, creating ServiceNow tasks, and notifying procurement for Johnson & Johnson."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-contracts
      port: 8080
      tools:
        - name: process-contract-renewal
          description: "Given a contract ID, check renewal terms, create a ServiceNow task, and notify procurement."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP Ariba contract ID."
            - name: contract_owner
              in: body
              type: string
              description: "The contract owner name."
          steps:
            - name: get-contract
              type: call
              call: ariba.get-contract
              with:
                contract_id: "{{contract_id}}"
            - name: create-renewal-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Contract Renewal: {{get-contract.title}} — Expires {{get-contract.end_date}}"
                category: "procurement"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.procurement_channel"
                text: "Contract Renewal: {{get-contract.title}} ({{contract_id}}) expires {{get-contract.end_date}}. Task: {{create-renewal-task.number}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement/v2/jnj"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves batch genealogy and traceability data from SAP for a given batch number in Johnson & Johnson manufacturing.

naftiko: "0.5"
info:
  label: "SAP Batch Genealogy Lookup"
  description: "Retrieves batch genealogy and traceability data from SAP for a given batch number in Johnson & Johnson manufacturing."
  tags:
    - manufacturing
    - sap
    - batch-tracking
    - quality
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-batch-genealogy
          description: "Given a batch number and plant code, return the batch creation date, material, and expiry date."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "The SAP batch number."
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
          call: sap.get-batch
          with:
            batch_number: "{{batch_number}}"
            plant: "{{plant}}"
          outputParameters:
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: manufacture_date
              type: string
              mapping: "$.d.ManufactureDate"
            - name: shelf_life_expiry
              type: string
              mapping: "$.d.ShelfLifeExpirationDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch(Material='',Batch='{{batch_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: batch_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-batch
              method: GET

When an expense report is submitted in SAP Concur, validates the cost center in Workday and routes the approval request to the expense approver via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When an expense report is submitted in SAP Concur, validates the cost center in Workday and routes the approval request to the expense approver via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - workday
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given a SAP Concur expense report ID, validate the cost center against Workday and route the approval notification to the designated approver via Microsoft Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to process."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-report.approver_email}}"
                text: "Expense report {{report_id}} from {{get-report.submitter_name}} for {{get-report.total_amount}} {{get-report.currency}} requires your approval in SAP Concur."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reportdetails/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - 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 travel expense reports for policy violations, creates audit findings in ServiceNow, and notifies finance for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Compliance Checker"
  description: "Checks travel expense reports for policy violations, creates audit findings in ServiceNow, and notifies finance for Johnson & Johnson."
  tags:
    - finance
    - sap-concur
    - compliance
    - audit
capability:
  exposes:
    - type: mcp
      namespace: finance-compliance
      port: 8080
      tools:
        - name: check-travel-compliance
          description: "Given an expense report ID, check for policy violations, create audit findings, and notify the compliance team."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The employee ID who submitted the report."
          steps:
            - name: get-report
              type: call
              call: concur.get-expense-report
              with:
                report_id: "{{report_id}}"
            - name: log-findings
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Travel Compliance Review: Report {{report_id}}"
                category: "finance_audit"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.finance_compliance_channel"
                text: "Travel Compliance: Report {{report_id}} by Employee {{employee_id}}. Total: {{get-report.total}}. Violations: {{get-report.violations_count}}. SNOW: {{log-findings.number}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reports cost center budget variances from SAP, creates finance review tasks, and notifies the finance team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Variance Reporter"
  description: "Reports cost center budget variances from SAP, creates finance review tasks, and notifies the finance team for Johnson & Johnson."
  tags:
    - finance
    - sap
    - budgeting
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: report-budget-variance
          description: "Given a cost center and period, calculate budget variance, create a review task, and notify finance."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period (e.g., 2026-03)."
          steps:
            - name: get-variance
              type: call
              call: sap.get-budget-variance
              with:
                cost_center: "{{cost_center}}"
                period: "{{fiscal_period}}"
            - name: create-review
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Budget Variance: CC {{cost_center}} — {{fiscal_period}}"
                category: "finance"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.finance_channel"
                text: "Budget Variance: CC {{cost_center}} for {{fiscal_period}}. Variance: {{get-variance.variance}}. Review: {{create-review.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves cost element master data from SAP for Johnson & Johnson finance and controlling operations.

naftiko: "0.5"
info:
  label: "SAP Cost Element Lookup"
  description: "Retrieves cost element master data from SAP for Johnson & Johnson finance and controlling operations."
  tags:
    - finance
    - sap
    - controlling
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: finance-controlling
      port: 8080
      tools:
        - name: get-cost-element
          description: "Given a cost element code, return the description, category, and controlling area."
          inputParameters:
            - name: cost_element
              in: body
              type: string
              description: "The SAP cost element code."
          call: sap.get-cost-element
          with:
            cost_element: "{{cost_element}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.CostElementDescription"
            - name: category
              type: string
              mapping: "$.d.CostElementCategory"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_COSTELEMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: get-record
              method: GET

Retrieves outbound delivery document details from SAP by delivery number for Johnson & Johnson logistics operations.

naftiko: "0.5"
info:
  label: "SAP Delivery Document Lookup"
  description: "Retrieves outbound delivery document details from SAP by delivery number for Johnson & Johnson logistics operations."
  tags:
    - logistics
    - sap
    - delivery
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: logistics-ops
      port: 8080
      tools:
        - name: get-delivery-document
          description: "Given a SAP delivery number, return the ship-to party, delivery date, and total weight."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: ship_to
              type: string
              mapping: "$.d.ShipToParty"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
            - name: total_weight
              type: string
              mapping: "$.d.HeaderGrossWeight"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: get-record
              method: GET

Creates breakdown maintenance notifications in SAP when equipment failures are reported and notifies the maintenance team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Equipment Breakdown Incident Creator"
  description: "Creates breakdown maintenance notifications in SAP when equipment failures are reported and notifies the maintenance team for Johnson & Johnson."
  tags:
    - manufacturing
    - sap
    - maintenance
    - incident
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-breakdown
      port: 8080
      tools:
        - name: create-breakdown-incident
          description: "Given equipment failure details, create a SAP breakdown notification and a ServiceNow incident."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment ID."
            - name: failure_description
              in: body
              type: string
              description: "Description of the equipment failure."
            - name: plant
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: priority
              in: body
              type: string
              description: "Incident priority (P1-P4)."
          steps:
            - name: create-sap-notification
              type: call
              call: sap.create-maintenance-notification
              with:
                equipment: "{{equipment_id}}"
                notification_type: "M2"
                description: "{{failure_description}}"
                plant: "{{plant}}"
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Equipment Breakdown: {{equipment_id}} at Plant {{plant}}"
                priority: "{{priority}}"
                description: "Equipment: {{equipment_id}} | Failure: {{failure_description}} | Plant: {{plant}} | SAP: {{create-sap-notification.notification_number}}"
            - name: notify-maintenance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.maintenance_channel"
                text: "EQUIPMENT BREAKDOWN: {{equipment_id}} at Plant {{plant}}. Priority: {{priority}}. SAP: {{create-sap-notification.notification_number}}. SNOW: {{create-snow-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes goods receipt in SAP, triggers quality inspection, and notifies the warehouse team upon completion for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt and Quality Release"
  description: "Processes goods receipt in SAP, triggers quality inspection, and notifies the warehouse team upon completion for Johnson & Johnson."
  tags:
    - supply-chain
    - sap
    - quality
    - warehouse
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: process-goods-receipt
          description: "Given a purchase order and delivery details, post goods receipt, trigger quality inspection, and notify warehouse."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: delivery_number
              in: body
              type: string
              description: "The inbound delivery number."
            - name: plant
              in: body
              type: string
              description: "The receiving plant code."
          steps:
            - name: post-goods-receipt
              type: call
              call: sap.post-goods-receipt
              with:
                po_number: "{{po_number}}"
                delivery: "{{delivery_number}}"
                plant: "{{plant}}"
            - name: trigger-qi
              type: call
              call: sap.create-inspection-lot
              with:
                material_document: "{{post-goods-receipt.material_document}}"
                plant: "{{plant}}"
            - name: notify-warehouse
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.warehouse_channel"
                text: "Goods Receipt for PO {{po_number}}, Delivery {{delivery_number}} at Plant {{plant}}. Material Doc: {{post-goods-receipt.material_document}}. QI Lot: {{trigger-qi.inspection_lot}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Reconciles intercompany billing documents in SAP across company codes and creates exception reports for Johnson & Johnson finance operations.

naftiko: "0.5"
info:
  label: "SAP Intercompany Billing Reconciliation"
  description: "Reconciles intercompany billing documents in SAP across company codes and creates exception reports for Johnson & Johnson finance operations."
  tags:
    - finance
    - sap
    - billing
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: finance-intercompany
      port: 8080
      tools:
        - name: reconcile-intercompany-billing
          description: "Given company codes and a billing period, reconcile intercompany transactions and report exceptions."
          inputParameters:
            - name: sender_company
              in: body
              type: string
              description: "The sending company code."
            - name: receiver_company
              in: body
              type: string
              description: "The receiving company code."
            - name: billing_period
              in: body
              type: string
              description: "The billing period to reconcile."
          steps:
            - name: get-sender-docs
              type: call
              call: sap.get-billing-documents
              with:
                company_code: "{{sender_company}}"
                period: "{{billing_period}}"
            - name: get-receiver-docs
              type: call
              call: sap.get-billing-documents
              with:
                company_code: "{{receiver_company}}"
                period: "{{billing_period}}"
            - name: create-exception-report
              type: call
              call: servicenow.create-incident
              with:
                short_description: "IC Billing Reconciliation: {{sender_company}} to {{receiver_company}} — {{billing_period}}"
                category: "finance_reconciliation"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.finance_ic_channel"
                text: "IC Billing Reconciliation: {{sender_company}} to {{receiver_company}} for {{billing_period}}. Sender docs: {{get-sender-docs.count}}. Receiver docs: {{get-receiver-docs.count}}. SNOW: {{create-exception-report.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves current inventory stock levels from SAP for a material at a given plant for Johnson & Johnson supply chain operations.

naftiko: "0.5"
info:
  label: "SAP Inventory Stock Lookup"
  description: "Retrieves current inventory stock levels from SAP for a material at a given plant for Johnson & Johnson supply chain operations."
  tags:
    - supply-chain
    - sap
    - inventory
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: get-stock-level
          description: "Given a material number and plant code, return the unrestricted stock, quality inspection stock, and blocked stock quantities."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
          call: sap.get-stock
          with:
            material_number: "{{material_number}}"
            plant: "{{plant}}"
          outputParameters:
            - name: unrestricted
              type: string
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: quality_inspection
              type: string
              mapping: "$.d.QualityInspectionStockQty"
            - name: blocked
              type: string
              mapping: "$.d.BlockedStockQty"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-stock
              method: GET

At month-end close, queries SAP for all open AP invoices past their due date in a given cost center, creates a ServiceNow finance task, and posts the reconciliation list to the Finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Invoice Period Close Reconciliation"
  description: "At month-end close, queries SAP for all open AP invoices past their due date in a given cost center, creates a ServiceNow finance task, and posts the reconciliation list to the Finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - servicenow
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-ap-period-close
          description: "Given a SAP company code and fiscal period, retrieve all open and overdue AP invoices, open a ServiceNow finance reconciliation task, and post the summary to the Finance Teams channel."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code for the legal entity being closed."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period to close in YYYYMM format."
          steps:
            - name: get-open-invoices
              type: call
              call: "sap.list-open-invoices"
              with:
                company_code: "{{company_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: create-close-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "AP period close reconciliation: {{company_code}} period {{fiscal_period}}"
                category: "finance"
                assigned_group: "Finance_AP"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "AP Close: {{company_code}} / {{fiscal_period}} | Open invoices: {{get-open-invoices.invoice_count}} | Task: {{create-close-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: list-open-invoices
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Validates invoices by performing three-way matching in SAP, logs exceptions in ServiceNow, and notifies accounts payable for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Validator"
  description: "Validates invoices by performing three-way matching in SAP, logs exceptions in ServiceNow, and notifies accounts payable for Johnson & Johnson."
  tags:
    - finance
    - sap
    - accounts-payable
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: validate-invoice-match
          description: "Given an invoice number, perform three-way match validation, log exceptions, and notify AP."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
          steps:
            - name: check-match
              type: call
              call: sap.validate-three-way-match
              with:
                invoice_number: "{{invoice_number}}"
                company_code: "{{company_code}}"
            - name: log-exception
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Invoice Match Exception: {{invoice_number}}"
                category: "accounts_payable"
            - name: notify-ap
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.ap_channel"
                text: "Invoice Match: {{invoice_number}} in Company {{company_code}}. Status: {{check-match.status}}. Variance: {{check-match.variance}}. SNOW: {{log-exception.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves material master data from SAP S/4HANA by material number for Johnson & Johnson manufacturing and supply chain operations.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number for Johnson & Johnson manufacturing and supply chain operations."
  tags:
    - manufacturing
    - sap
    - supply-chain
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number, return the material description, base unit of measure, and material group."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number (e.g., MAT-001234)."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Handles MRP run exceptions from SAP by creating supply chain alerts, logging in ServiceNow, and notifying the planning team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP MRP Run Exception Handler"
  description: "Handles MRP run exceptions from SAP by creating supply chain alerts, logging in ServiceNow, and notifying the planning team for Johnson & Johnson."
  tags:
    - supply-chain
    - sap
    - planning
    - manufacturing
capability:
  exposes:
    - type: mcp
      namespace: supply-planning
      port: 8080
      tools:
        - name: handle-mrp-exception
          description: "Given MRP exception details, create a ServiceNow alert and notify the supply planning team."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The material with the MRP exception."
            - name: exception_type
              in: body
              type: string
              description: "Type of MRP exception (shortage, excess, rescheduling)."
            - name: plant
              in: body
              type: string
              description: "The plant code."
            - name: quantity
              in: body
              type: string
              description: "The exception quantity."
          steps:
            - name: create-alert
              type: call
              call: servicenow.create-incident
              with:
                short_description: "MRP Exception: {{exception_type}} — Material {{material_number}}"
                category: "supply_planning"
            - name: notify-planning
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.planning_channel"
                text: "MRP Exception: {{exception_type}} for Material {{material_number}} at Plant {{plant}}. Qty: {{quantity}}. SNOW: {{create-alert.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates planned maintenance orders in SAP for manufacturing equipment, schedules in ServiceNow, and notifies the maintenance team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Planned Maintenance Order Creator"
  description: "Creates planned maintenance orders in SAP for manufacturing equipment, schedules in ServiceNow, and notifies the maintenance team for Johnson & Johnson."
  tags:
    - manufacturing
    - sap
    - maintenance
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-maintenance
      port: 8080
      tools:
        - name: create-maintenance-order
          description: "Given equipment details, create a SAP maintenance order, a ServiceNow work order, and notify maintenance."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment ID."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance (preventive, calibration, qualification)."
            - name: plant
              in: body
              type: string
              description: "The plant code."
            - name: scheduled_date
              in: body
              type: string
              description: "Scheduled maintenance date."
          steps:
            - name: create-sap-order
              type: call
              call: sap.create-maintenance-order
              with:
                equipment: "{{equipment_id}}"
                order_type: "{{maintenance_type}}"
                plant: "{{plant}}"
            - name: create-snow-work-order
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Maintenance: {{maintenance_type}} — Equipment {{equipment_id}}"
                category: "manufacturing_maintenance"
            - name: notify-maintenance
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.maintenance_channel"
                text: "Maintenance Scheduled: {{maintenance_type}} for Equipment {{equipment_id}} at Plant {{plant}} on {{scheduled_date}}. SAP: {{create-sap-order.order_number}}. SNOW: {{create-snow-work-order.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves production order status and details from SAP for Johnson & Johnson manufacturing operations.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves production order status and details from SAP for Johnson & Johnson manufacturing operations."
  tags:
    - manufacturing
    - sap
    - production
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-mgmt
      port: 8080
      tools:
        - name: get-production-order
          description: "Given a SAP production order number, return the order type, status, planned quantity, and material."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: sap.get-prod-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: order_type
              type: string
              mapping: "$.d.ManufacturingOrderType"
            - name: status
              type: string
              mapping: "$.d.MfgOrderPlannedTotalQty"
            - name: material
              type: string
              mapping: "$.d.Material"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-prod-order
              method: GET

Looks up a SAP S/4HANA purchase order by number and returns the header status, supplier name, total value, and delivery schedule for procurement visibility.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status Lookup"
  description: "Looks up a SAP S/4HANA purchase order by number and returns the header status, supplier name, total value, and delivery schedule for procurement visibility."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns status, supplier, total value, and delivery schedule. Use for procurement status checks and accounts payable reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Retrieves quality inspection lot details from SAP for Johnson & Johnson quality assurance operations.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves quality inspection lot details from SAP for Johnson & Johnson quality assurance operations."
  tags:
    - quality
    - sap
    - manufacturing
    - inspection
capability:
  exposes:
    - type: mcp
      namespace: quality-mgmt
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Given an inspection lot number, return the material, inspection type, lot status, and result."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP quality inspection lot number."
          call: sap.get-inspection-lot
          with:
            inspection_lot: "{{inspection_lot}}"
          outputParameters:
            - name: material
              type: string
              mapping: "$.d.Material"
            - name: inspection_type
              type: string
              mapping: "$.d.InspectionLotType"
            - name: lot_status
              type: string
              mapping: "$.d.InspectionLotStatusID"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{inspection_lot}}')"
          inputParameters:
            - name: inspection_lot
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Tracks outbound shipments in SAP TM, updates delivery status in Salesforce, and notifies the distribution team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Transport Management Shipment Tracker"
  description: "Tracks outbound shipments in SAP TM, updates delivery status in Salesforce, and notifies the distribution team for Johnson & Johnson."
  tags:
    - supply-chain
    - sap
    - salesforce
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: distribution-ops
      port: 8080
      tools:
        - name: track-shipment
          description: "Given a shipment ID, retrieve tracking data from SAP TM, update Salesforce, and notify distribution."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The SAP Transportation Management shipment ID."
            - name: salesforce_order_id
              in: body
              type: string
              description: "The related Salesforce order ID."
          steps:
            - name: get-tracking
              type: call
              call: sap.get-shipment-status
              with:
                shipment_id: "{{shipment_id}}"
            - name: update-salesforce
              type: call
              call: salesforce.update-record
              with:
                object_type: "Order"
                id: "{{salesforce_order_id}}"
                Shipping_Status__c: "{{get-tracking.status}}"
            - name: notify-distribution
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.distribution_channel"
                text: "Shipment Update: {{shipment_id}} — Status: {{get-tracking.status}}. ETA: {{get-tracking.eta}}. Salesforce updated."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://jnj.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves vendor master data from SAP S/4HANA by vendor number for Johnson & Johnson procurement operations.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number for Johnson & Johnson procurement operations."
  tags:
    - procurement
    - sap
    - vendor-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, return the vendor name, payment terms, and purchasing organization."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor account number."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: purchasing_org
              type: string
              mapping: "$.d.PurchasingOrganization"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Monitors warehouse capacity levels in SAP, creates planning alerts in ServiceNow, and notifies logistics when thresholds are breached for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SAP Warehouse Capacity Planning Alert"
  description: "Monitors warehouse capacity levels in SAP, creates planning alerts in ServiceNow, and notifies logistics when thresholds are breached for Johnson & Johnson."
  tags:
    - supply-chain
    - sap
    - warehouse
    - capacity-planning
capability:
  exposes:
    - type: mcp
      namespace: logistics-planning
      port: 8080
      tools:
        - name: alert-warehouse-capacity
          description: "Given a warehouse and capacity threshold, check current utilization and alert if exceeded."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "The SAP warehouse number."
            - name: threshold_percent
              in: body
              type: integer
              description: "Capacity utilization threshold percentage."
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
          steps:
            - name: check-capacity
              type: call
              call: sap.get-warehouse-utilization
              with:
                warehouse: "{{warehouse_id}}"
                plant: "{{plant}}"
            - name: create-alert
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Warehouse Capacity Alert: {{warehouse_id}} at {{check-capacity.utilization}}%"
                category: "logistics"
            - name: notify-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.logistics_channel"
                text: "Warehouse Capacity: {{warehouse_id}} at Plant {{plant}} is at {{check-capacity.utilization}}% (threshold: {{threshold_percent}}%). SNOW: {{create-alert.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates and routes a ServiceNow change request for validated production infrastructure changes, attaches risk assessment, and notifies stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Automation"
  description: "Creates and routes a ServiceNow change request for validated production infrastructure changes, attaches risk assessment, and notifies stakeholders via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: itsm-change
      port: 8080
      tools:
        - name: open-change-request
          description: "Given a change description, affected configuration item, and risk level, create a ServiceNow change request and notify the change owner and CAB via Microsoft Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed infrastructure or application change."
            - name: affected_ci
              in: body
              type: string
              description: "The configuration item being changed."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: owner_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the change owner."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "{{change_description}}"
                cmdb_ci: "{{affected_ci}}"
                risk: "{{risk_level}}"
            - name: notify-owner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{owner_upn}}"
                text: "Change request {{create-change.number}} opened for {{affected_ci}} (risk: {{risk_level}}). Please review in ServiceNow."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves configuration item details from ServiceNow CMDB by asset tag for Johnson & Johnson IT asset management.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Retrieves configuration item details from ServiceNow CMDB by asset tag for Johnson & Johnson IT asset management."
  tags:
    - it-operations
    - servicenow
    - cmdb
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-cmdb-asset
          description: "Given an asset tag, return the CI name, class, operational status, and assigned support group."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The ServiceNow asset tag identifier."
          call: servicenow.get-ci
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: ci_name
              type: string
              mapping: "$.result.name"
            - name: ci_class
              type: string
              mapping: "$.result.sys_class_name"
            - name: operational_status
              type: string
              mapping: "$.result.operational_status"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb-ci
          path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-ci
              method: GET

When a P1 incident is opened in ServiceNow, pages the on-call engineer via Microsoft Teams and posts a war-room bridge link to the IT operations channel.

naftiko: "0.5"
info:
  label: "ServiceNow ITSM Incident P1 Escalation"
  description: "When a P1 incident is opened in ServiceNow, pages the on-call engineer via Microsoft Teams and posts a war-room bridge link to the IT operations channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: escalate-p1-incident
          description: "Given a ServiceNow P1 incident number, retrieve the incident details and page the on-call engineer and IT leadership via Microsoft Teams with a war-room bridge link."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: bridge_url
              in: body
              type: string
              description: "The Teams meeting or bridge URL for the incident war room."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_oncall_channel_id"
                text: "P1 INCIDENT: {{incident_number}} | {{get-incident.short_description}} | Affected: {{get-incident.cmdb_ci}} | Bridge: {{bridge_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves standard operating procedure document metadata from SharePoint by document name for Johnson & Johnson quality operations.

naftiko: "0.5"
info:
  label: "SharePoint SOP Document Retrieval"
  description: "Retrieves standard operating procedure document metadata from SharePoint by document name for Johnson & Johnson quality operations."
  tags:
    - quality
    - sharepoint
    - document-management
    - sop
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: get-sop-document
          description: "Given an SOP document name or ID, return the document title, version, approval status, and URL."
          inputParameters:
            - name: document_name
              in: body
              type: string
              description: "The SOP document name or ID."
          call: sharepoint.get-document
          with:
            document_name: "{{document_name}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.d.Title"
            - name: version
              type: string
              mapping: "$.d.UIVersionLabel"
            - name: modified
              type: string
              mapping: "$.d.Modified"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://jnj.sharepoint.com/_api/web"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: files
          path: "/GetFileByServerRelativeUrl('/sites/SOPs/{{document_name}}')"
          inputParameters:
            - name: document_name
              in: path
          operations:
            - name: get-document
              method: GET

Validates training records in SharePoint against Workday assignments and creates compliance tickets for gaps for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "SharePoint Training Record Validator"
  description: "Validates training records in SharePoint against Workday assignments and creates compliance tickets for gaps for Johnson & Johnson."
  tags:
    - quality
    - sharepoint
    - workday
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: quality-training
      port: 8080
      tools:
        - name: validate-training-records
          description: "Given a department and training program, cross-reference SharePoint records with Workday and report gaps."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department to validate."
            - name: training_program
              in: body
              type: string
              description: "The training program name."
          steps:
            - name: get-sharepoint-records
              type: call
              call: sharepoint.get-training-records
              with:
                department: "{{department}}"
                program: "{{training_program}}"
            - name: get-workday-assignments
              type: call
              call: workday.get-training-assignments
              with:
                department: "{{department}}"
                program: "{{training_program}}"
            - name: create-gap-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Training Compliance Gap: {{department}} — {{training_program}}"
                category: "quality_compliance"
            - name: notify-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.quality_training_channel"
                text: "Training Gap Alert: {{department}} for {{training_program}}. SharePoint: {{get-sharepoint-records.count}}. Workday: {{get-workday-assignments.count}}. SNOW: {{create-gap-ticket.number}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://jnj.sharepoint.com/_api/web"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: lists
          path: "/lists"
          operations:
            - name: get-training-records
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Learning/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learningAssignments"
          operations:
            - name: get-training-assignments
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Executes a predefined SQL query against the Johnson & Johnson clinical data warehouse in Snowflake and returns summary results.

naftiko: "0.5"
info:
  label: "Snowflake Clinical Query Runner"
  description: "Executes a predefined SQL query against the Johnson & Johnson clinical data warehouse in Snowflake and returns summary results."
  tags:
    - clinical-trials
    - snowflake
    - data-warehouse
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: clinical-analytics
      port: 8080
      tools:
        - name: run-clinical-query
          description: "Given a query identifier and optional study ID filter, execute the corresponding Snowflake query and return results."
          inputParameters:
            - name: query_id
              in: body
              type: string
              description: "Predefined query identifier (e.g., enrollment-summary, ae-counts)."
            - name: study_id
              in: body
              type: string
              description: "Optional clinical study ID filter."
          call: snowflake.execute-query
          with:
            query_id: "{{query_id}}"
            study_id: "{{study_id}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.resultSetMetaData.numRows"
            - name: data
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Runs a Snowflake data quality validation query on a specified table and posts a quality report to the data engineering Microsoft Teams channel, opening a ServiceNow task when failures exceed the threshold.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert"
  description: "Runs a Snowflake data quality validation query on a specified table and posts a quality report to the data engineering Microsoft Teams channel, opening a ServiceNow task when failures exceed the threshold."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - microsoft-teams
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table name and quality threshold percentage, run a null/completeness check and post results to the data engineering Teams channel. Open a ServiceNow task if failures exceed the threshold."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name (e.g., PROD_DB.CLINICAL.PATIENT_DEMOGRAPHICS)."
            - name: failure_threshold_pct
              in: body
              type: number
              description: "The percentage of null or invalid records that triggers a ServiceNow task (0-100)."
          steps:
            - name: run-quality-query
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as total, SUM(CASE WHEN id IS NULL THEN 1 ELSE 0 END) as nulls FROM {{table_name}}"
            - name: create-dq-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Data quality issue detected: {{table_name}}"
                category: "data_quality"
                assigned_group: "Data_Engineering"
            - name: post-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Data Quality Report: {{table_name}} | Total rows: {{run-quality-query.total}} | Null IDs: {{run-quality-query.nulls}} | Task: {{create-dq-task.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for the latest real-world evidence cohort data for a specified therapeutic area, returns cohort size and key demographic breakdowns for medical affairs reporting.

naftiko: "0.5"
info:
  label: "Snowflake Real-World Evidence Data Snapshot"
  description: "Queries Snowflake for the latest real-world evidence cohort data for a specified therapeutic area, returns cohort size and key demographic breakdowns for medical affairs reporting."
  tags:
    - data
    - analytics
    - snowflake
    - reporting
    - pharma
    - real-world-evidence
capability:
  exposes:
    - type: mcp
      namespace: rwe-analytics
      port: 8080
      tools:
        - name: get-rwe-cohort-snapshot
          description: "Given a therapeutic area code and data cutoff date, query Snowflake for the RWE patient cohort size, age distribution, and key comorbidities for medical affairs reporting."
          inputParameters:
            - name: therapeutic_area
              in: body
              type: string
              description: "The therapeutic area code (e.g., ONCOLOGY, IMMUNOLOGY, NEUROSCIENCE)."
            - name: data_cutoff_date
              in: body
              type: string
              description: "The data cutoff date in YYYY-MM-DD format."
          call: "snowflake.execute-statement"
          with:
            statement: "SELECT therapeutic_area, COUNT(*) as cohort_size, AVG(age) as mean_age FROM PROD_RWE.PATIENTS WHERE therapeutic_area = '{{therapeutic_area}}' AND data_date <= '{{data_cutoff_date}}' GROUP BY 1"
          outputParameters:
            - name: cohort_size
              type: number
              mapping: "$.data[0].COHORT_SIZE"
            - name: mean_age
              type: number
              mapping: "$.data[0].MEAN_AGE"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://jnj.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Detects shipment delays in SAP, creates a ServiceNow case, and alerts the logistics team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Supply Chain Shipment Delay Escalation"
  description: "Detects shipment delays in SAP, creates a ServiceNow case, and alerts the logistics team for Johnson & Johnson."
  tags:
    - supply-chain
    - sap
    - servicenow
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: escalate-shipment-delay
          description: "Given a delivery number and delay reason, create a ServiceNow case and notify supply chain leadership."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery number."
            - name: delay_reason
              in: body
              type: string
              description: "Reason for the shipment delay."
            - name: expected_date
              in: body
              type: string
              description: "Originally expected delivery date."
            - name: new_date
              in: body
              type: string
              description: "Revised delivery date."
          steps:
            - name: create-sc-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Shipment Delay: Delivery {{delivery_number}}"
                category: "supply_chain"
                description: "Delivery: {{delivery_number}} | Reason: {{delay_reason}} | Original: {{expected_date}} | Revised: {{new_date}}"
            - name: notify-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.supply_chain_channel"
                text: "Supply Chain Alert: Delivery {{delivery_number}} delayed from {{expected_date}} to {{new_date}}. Reason: {{delay_reason}}. Case: {{create-sc-case.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks the last extract refresh status for a Tableau workbook for Johnson & Johnson analytics operations.

naftiko: "0.5"
info:
  label: "Tableau Workbook Refresh Status"
  description: "Checks the last extract refresh status for a Tableau workbook for Johnson & Johnson analytics operations."
  tags:
    - analytics
    - tableau
    - reporting
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: analytics-tableau
      port: 8080
      tools:
        - name: get-workbook-refresh
          description: "Given a Tableau workbook ID, return the last refresh status and extract time."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          call: tableau.get-extract-refresh
          with:
            workbook_id: "{{workbook_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.extractRefreshes[0].status"
            - name: completed_at
              type: string
              mapping: "$.extractRefreshes[0].completedAt"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://jnj.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refreshes"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: get-extract-refresh
              method: GET

Manages infrastructure provisioning by creating ServiceNow change requests, triggering Terraform plans, and notifying the cloud team for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning with Approval"
  description: "Manages infrastructure provisioning by creating ServiceNow change requests, triggering Terraform plans, and notifying the cloud team for Johnson & Johnson."
  tags:
    - devops
    - terraform
    - servicenow
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: provision-infrastructure
          description: "Given infrastructure requirements, create a change request, generate a Terraform plan, and notify cloud engineering."
          inputParameters:
            - name: environment
              in: body
              type: string
              description: "Target environment (dev, staging, production)."
            - name: resource_type
              in: body
              type: string
              description: "Type of resource to provision."
            - name: requestor
              in: body
              type: string
              description: "Name of the requestor."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Infra Provisioning: {{resource_type}} in {{environment}}"
                category: "cloud_infrastructure"
            - name: trigger-plan
              type: call
              call: github.trigger-workflow
              with:
                repo: "infrastructure"
                workflow: "terraform-plan.yml"
            - name: notify-cloud-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.cloud_eng_channel"
                text: "Infra Request: {{resource_type}} in {{environment}} by {{requestor}}. Change: {{create-change.number}}. Terraform plan triggered."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.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: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: trigger-workflow
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current lifecycle status of a document in Veeva Vault by document ID for Johnson & Johnson regulatory operations.

naftiko: "0.5"
info:
  label: "Veeva Vault Document Status Lookup"
  description: "Retrieves the current lifecycle status of a document in Veeva Vault by document ID for Johnson & Johnson regulatory operations."
  tags:
    - regulatory
    - veeva-vault
    - document-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: get-document-status
          description: "Given a Veeva Vault document ID, return the lifecycle state, owner, and last modified date."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The Veeva Vault document ID."
          call: veeva.get-document
          with:
            document_id: "{{document_id}}"
          outputParameters:
            - name: lifecycle_state
              type: string
              mapping: "$.responseDetails.lifecycle__v"
            - name: owner
              type: string
              mapping: "$.responseDetails.owner__v"
            - name: last_modified
              type: string
              mapping: "$.responseDetails.last_modified_date__v"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: documents
          path: "/objects/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET

Retrieves the latest document versions and approval states from Veeva Vault for a given product dossier, and flags any documents in Draft state past their review deadline.

naftiko: "0.5"
info:
  label: "Veeva Vault Document Version Control Check"
  description: "Retrieves the latest document versions and approval states from Veeva Vault for a given product dossier, and flags any documents in Draft state past their review deadline."
  tags:
    - regulatory
    - quality
    - veeva
    - compliance
    - pharma
capability:
  exposes:
    - type: mcp
      namespace: vault-ops
      port: 8080
      tools:
        - name: check-dossier-document-states
          description: "Given a Veeva Vault product dossier ID, retrieve all contained documents and their lifecycle states. Flag any that are in Draft state and past the expected review deadline."
          inputParameters:
            - name: dossier_id
              in: body
              type: string
              description: "The Veeva Vault dossier or binder ID to check."
            - name: review_deadline
              in: body
              type: string
              description: "The review deadline date in YYYY-MM-DD format."
          call: "veeva.list-binder-documents"
          with:
            dossier_id: "{{dossier_id}}"
          outputParameters:
            - name: document_count
              type: number
              mapping: "$.responseStatus"
            - name: documents
              type: array
              mapping: "$.data"
              items:
                - name: document_id
                  type: string
                  mapping: "$.id"
                - name: state
                  type: string
                  mapping: "$.lifecycle_state__v"
  consumes:
    - type: http
      namespace: veeva
      baseUri: "https://jnj.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_token"
      resources:
        - name: binder-documents
          path: "/objects/binders/{{dossier_id}}/documents"
          inputParameters:
            - name: dossier_id
              in: path
          operations:
            - name: list-binder-documents
              method: GET

Orchestrates vendor qualification reviews by pulling vendor data from SAP, creating a ServiceNow assessment task, and notifying procurement for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Vendor Qualification Review Orchestrator"
  description: "Orchestrates vendor qualification reviews by pulling vendor data from SAP, creating a ServiceNow assessment task, and notifying procurement for Johnson & Johnson."
  tags:
    - procurement
    - sap
    - servicenow
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: initiate-vendor-review
          description: "Given a vendor number, retrieve vendor details from SAP, create an assessment task, and notify procurement."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
            - name: review_type
              in: body
              type: string
              description: "Type of qualification review (initial, periodic, for-cause)."
          steps:
            - name: get-vendor-data
              type: call
              call: sap.get-vendor
              with:
                vendor_number: "{{vendor_number}}"
            - name: create-assessment
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Vendor Qualification: {{get-vendor-data.SupplierName}} — {{review_type}}"
                category: "vendor_management"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.procurement_channel"
                text: "Vendor Review initiated for {{get-vendor-data.SupplierName}} ({{vendor_number}}). Type: {{review_type}}. Task: {{create-assessment.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves employee absence and leave balance from Workday for Johnson & Johnson HR operations.

naftiko: "0.5"
info:
  label: "Workday Absence Balance Lookup"
  description: "Retrieves employee absence and leave balance from Workday for Johnson & Johnson HR operations."
  tags:
    - hr
    - workday
    - absence
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: get-absence-balance
          description: "Given an employee ID, return the PTO balance, sick leave balance, and next scheduled absence."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: workday.get-absence-balance
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: pto_balance
              type: string
              mapping: "$.TimeOff.PTO_Balance"
            - name: sick_balance
              type: string
              mapping: "$.TimeOff.Sick_Balance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Absence_Management/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absences
          path: "/workers/{{employee_id}}/absenceBalances"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-absence-balance
              method: GET

Retrieves compensation plan details for an employee from Workday for Johnson & Johnson HR total rewards operations.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves compensation plan details for an employee from Workday for Johnson & Johnson HR total rewards operations."
  tags:
    - hr
    - workday
    - compensation
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-rewards
      port: 8080
      tools:
        - name: get-compensation
          description: "Given an employee ID, return the base pay, bonus target percentage, and compensation grade."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: workday.get-compensation
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: base_pay
              type: string
              mapping: "$.Compensation.Base_Pay"
            - name: bonus_target
              type: string
              mapping: "$.Compensation.Bonus_Target_Percent"
            - name: grade
              type: string
              mapping: "$.Compensation.Compensation_Grade"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Compensation/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{employee_id}}/compensationPlans"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-compensation
              method: GET

Retrieves employee profile details from Workday by employee ID for Johnson & Johnson HR operations.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile details from Workday by employee ID for Johnson & Johnson HR operations."
  tags:
    - hr
    - workday
    - employee
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday employee ID, return the name, department, manager, and hire date."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: workday.get-worker
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Worker_Data.Personal_Data.Name_Data.Legal_Name.Name_Detail_Data.Formatted_Name"
            - name: department
              type: string
              mapping: "$.Worker.Worker_Data.Organization_Data.Worker_Organization_Data[0].Organization_Data.Organization_Name"
            - name: hire_date
              type: string
              mapping: "$.Worker.Worker_Data.Employment_Data.Worker_Status_Data.Hire_Date"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Human_Resources/v42.0"
      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

Identifies overdue compliance training assignments in Workday and sends reminder notifications for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Reminder"
  description: "Identifies overdue compliance training assignments in Workday and sends reminder notifications for Johnson & Johnson."
  tags:
    - hr
    - workday
    - compliance
    - training
capability:
  exposes:
    - type: mcp
      namespace: hr-compliance
      port: 8080
      tools:
        - name: send-compliance-reminders
          description: "Given a compliance training program ID, find overdue assignments and send reminders."
          inputParameters:
            - name: program_id
              in: body
              type: string
              description: "The Workday learning program ID."
            - name: days_overdue
              in: body
              type: integer
              description: "Minimum days overdue to trigger reminder."
          steps:
            - name: get-overdue
              type: call
              call: workday.get-overdue-training
              with:
                program_id: "{{program_id}}"
                days_overdue: "{{days_overdue}}"
            - name: send-reminder
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.hr_compliance_channel"
                text: "Compliance Training Alert: {{get-overdue.count}} employees overdue for program {{program_id}} (>{{days_overdue}} days)."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Learning/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/learningAssignments?overdue=true&program={{program_id}}"
          inputParameters:
            - name: program_id
              in: query
          operations:
            - name: get-overdue-training
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Workday for mandatory compliance training completion rates by department and flags departments below the required threshold via a ServiceNow task and Microsoft Teams alert.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Queries Workday for mandatory compliance training completion rates by department and flags departments below the required threshold via a ServiceNow task and Microsoft Teams alert."
  tags:
    - hr
    - compliance
    - workday
    - servicenow
    - microsoft-teams
    - learning-development
capability:
  exposes:
    - type: mcp
      namespace: compliance-learning
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Given a compliance course ID and required completion percentage threshold, check Workday training completion rates by department and alert HR leaders of non-compliant departments via Teams."
          inputParameters:
            - name: course_id
              in: body
              type: string
              description: "The Workday Learning course ID for the mandatory compliance training."
            - name: completion_threshold_pct
              in: body
              type: number
              description: "The required completion percentage (e.g., 95 for 95%)."
          steps:
            - name: get-completion-rates
              type: call
              call: "workday.get-course-completion-rates"
              with:
                course_id: "{{course_id}}"
            - name: create-compliance-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Compliance training gap: course {{course_id}} below {{completion_threshold_pct}}% threshold"
                category: "hr_compliance"
                assigned_group: "HR_Compliance"
            - name: alert-hr
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Compliance Alert: Course {{course_id}} — departments below {{completion_threshold_pct}}% threshold | ServiceNow task: {{create-compliance-task.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: course-completions
          path: "/learningCourseCompletions"
          operations:
            - name: get-course-completion-rates
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://jnj.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls open position headcount from Workday and compares against the SAP cost center budget, posting a variance digest to the Finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Workday Position Budget Variance Report"
  description: "Pulls open position headcount from Workday and compares against the SAP cost center budget, posting a variance digest to the Finance Microsoft Teams channel."
  tags:
    - hr
    - finance
    - workday
    - sap
    - reporting
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance-reporting
      port: 8080
      tools:
        - name: report-position-budget-variance
          description: "Pull open position data from Workday and compare against the SAP cost center budget. Post a variance summary to the Finance Teams channel for headcount cost management."
          inputParameters:
            - name: cost_center_id
              in: body
              type: string
              description: "The SAP cost center ID to analyze for budget variance."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period to compare, e.g., 2026-Q2."
          steps:
            - name: get-positions
              type: call
              call: "workday.get-open-positions"
              with:
                cost_center_id: "{{cost_center_id}}"
            - name: post-variance
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Headcount Budget Report: Cost Center {{cost_center_id}} | Open positions: {{get-positions.open_count}} | Period: {{fiscal_period}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: positions
          path: "/positions"
          operations:
            - name: get-open-positions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes new position requisitions by validating budget in SAP, creating the requisition in Workday, and notifying HR for Johnson & Johnson.

naftiko: "0.5"
info:
  label: "Workday Position Requisition Approval Workflow"
  description: "Processes new position requisitions by validating budget in SAP, creating the requisition in Workday, and notifying HR for Johnson & Johnson."
  tags:
    - hr
    - workday
    - sap
    - hiring
capability:
  exposes:
    - type: mcp
      namespace: hr-talent
      port: 8080
      tools:
        - name: process-position-requisition
          description: "Given requisition details, validate budget, create the position in Workday, and notify HR."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "The department requesting the position."
            - name: job_title
              in: body
              type: string
              description: "The job title."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center."
            - name: hiring_manager
              in: body
              type: string
              description: "Name of the hiring manager."
          steps:
            - name: validate-budget
              type: call
              call: sap.check-budget
              with:
                cost_center: "{{cost_center}}"
                amount_type: "headcount"
            - name: create-requisition
              type: call
              call: workday.create-requisition
              with:
                department: "{{department}}"
                job_title: "{{job_title}}"
                hiring_manager: "{{hiring_manager}}"
            - name: notify-hr
              type: call
              call: msteams.send-message
              with:
                channel_id: "$secrets.hr_recruiting_channel"
                text: "New Position Requisition: {{job_title}} in {{department}}. Manager: {{hiring_manager}}. Budget: {{validate-budget.status}}. Workday Req: {{create-requisition.requisition_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://jnj-s4.sap.com/sap/opu/odata/sap/API_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/service/jnj/Recruiting/v42.0"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/jobRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST