Abbott Capabilities

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

Sort
Expand

Retrieves a regulatory submission document from Veeva Vault, sends it to the Anthropic Claude API for intelligent summarization, and posts the summary to the regulatory affairs Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Regulatory Document Summarization"
  description: "Retrieves a regulatory submission document from Veeva Vault, sends it to the Anthropic Claude API for intelligent summarization, and posts the summary to the regulatory affairs Teams channel."
  tags:
    - ai
    - regulatory
    - veeva
    - anthropic
    - healthcare
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 send it to Anthropic Claude for summarization with regulatory focus. Post the AI summary to the regulatory Teams channel. Use when regulatory teams need quick comprehension of lengthy submission documents."
          inputParameters:
            - name: vault_document_id
              in: body
              type: string
              description: "Veeva Vault document ID to summarize."
            - name: reg_channel_id
              in: body
              type: string
              description: "Regulatory affairs Teams channel ID."
          steps:
            - name: get-document
              type: call
              call: veeva-ai.get-document
              with:
                document_id: "{{vault_document_id}}"
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                prompt: "Summarize this regulatory submission document for a pharmaceutical regulatory affairs team. Identify key claims, study results, and action items: {{get-document.content}}"
            - name: post-summary
              type: call
              call: msteams-ai-reg.post-channel-message
              with:
                channel_id: "{{reg_channel_id}}"
                text: "Regulatory Summary for document {{vault_document_id}}: {{generate-summary.content[0].text}}"
  consumes:
    - type: http
      namespace: veeva-ai
      baseUri: "https://abbott.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
    - 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-ai-reg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves metadata for archived data files in Amazon S3, returning object size, storage class, and last modified date.

naftiko: "0.5"
info:
  label: "Amazon S3 Data Archive Lookup"
  description: "Retrieves metadata for archived data files in Amazon S3, returning object size, storage class, and last modified date."
  tags:
    - data
    - cloud
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: data-archive
      port: 8080
      tools:
        - name: get-archive-metadata
          description: "Given an S3 bucket and key prefix, return matching object metadata including size, storage class, and timestamps. Use when data teams need to locate archived datasets."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "S3 bucket name."
            - name: prefix
              in: body
              type: string
              description: "Object key prefix."
          call: s3.list-objects
          with:
            bucket: "{{bucket}}"
            prefix: "{{prefix}}"
          outputParameters:
            - name: object_count
              type: integer
              mapping: "$.KeyCount"
            - name: total_size_bytes
              type: integer
              mapping: "$.total_size"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_s3_auth"
        placement: header
      resources:
        - name: objects
          path: "/{{bucket}}?list-type=2&prefix={{prefix}}"
          inputParameters:
            - name: bucket
              in: path
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET

Queries the Kong API gateway for health status of registered services, returning uptime, request counts, and error rates.

naftiko: "0.5"
info:
  label: "API Gateway Health Check"
  description: "Queries the Kong API gateway for health status of registered services, returning uptime, request counts, and error rates."
  tags:
    - it
    - integration
    - kong
capability:
  exposes:
    - type: mcp
      namespace: api-health
      port: 8080
      tools:
        - name: check-api-gateway-health
          description: "Given a service name, return the API gateway health metrics including uptime, request volume, and error rate. Use when platform engineering needs API service visibility."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Kong service name."
          call: kong.get-service-status
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.status"
            - name: request_count
              type: integer
              mapping: "$.data.request_count"
            - name: error_rate
              type: number
              mapping: "$.data.error_rate"
  consumes:
    - type: http
      namespace: kong
      baseUri: "https://abbott-api.konghq.com/admin-api"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.kong_admin_key"
        placement: header
      resources:
        - name: services
          path: "/services/{{service}}/status"
          inputParameters:
            - name: service
              in: path
          operations:
            - name: get-service-status
              method: GET

Retrieves Azure Active Directory group membership for a user, returning all group names and their types.

naftiko: "0.5"
info:
  label: "Azure AD Group Membership Lookup"
  description: "Retrieves Azure Active Directory group membership for a user, returning all group names and their types."
  tags:
    - security
    - identity
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: ad-groups
      port: 8080
      tools:
        - name: get-user-groups
          description: "Given a user principal name, return all Azure AD group memberships with group names and types. Use when IT security needs to audit user group assignments."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "User principal name (email)."
          call: azure-ad.get-member-of
          with:
            upn: "{{user_upn}}"
          outputParameters:
            - name: group_count
              type: integer
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.azure_ad_token"
      resources:
        - name: users
          path: "/users/{{upn}}/memberOf"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-member-of
              method: GET

Queries Azure Cost Management for current month spend by resource group, returning cost breakdown and budget utilization.

naftiko: "0.5"
info:
  label: "Azure Resource Cost Lookup"
  description: "Queries Azure Cost Management for current month spend by resource group, returning cost breakdown and budget utilization."
  tags:
    - it
    - cloud
    - microsoft-azure
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost
      port: 8080
      tools:
        - name: get-resource-group-cost
          description: "Given an Azure resource group name, return current month spend, budget limit, and utilization percentage. Use when FinOps teams need cost visibility."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
          call: azure.get-cost-summary
          with:
            rg_name: "{{resource_group}}"
          outputParameters:
            - name: current_spend
              type: number
              mapping: "$.properties.rows[0].cost"
            - name: budget_limit
              type: number
              mapping: "$.properties.budget_limit"
            - name: utilization_percent
              type: number
              mapping: "$.properties.utilization"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{rg_name}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: rg_name
              in: path
          operations:
            - name: get-cost-summary
              method: POST

Uploads a regulatory document to a specified Box folder and returns the file ID and shared link.

naftiko: "0.5"
info:
  label: "Box Regulatory File Upload"
  description: "Uploads a regulatory document to a specified Box folder and returns the file ID and shared link."
  tags:
    - regulatory
    - documentation
    - box
capability:
  exposes:
    - type: mcp
      namespace: file-storage
      port: 8080
      tools:
        - name: upload-to-box
          description: "Given a folder ID and file details, upload the document to Box and return the file ID and link. Use when regulatory teams need to store documents in Box."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "Box folder ID."
            - name: file_name
              in: body
              type: string
              description: "Name of the file to upload."
          call: box.upload-file
          with:
            folder_id: "{{folder_id}}"
            name: "{{file_name}}"
          outputParameters:
            - name: file_id
              type: string
              mapping: "$.entries[0].id"
            - name: shared_link
              type: string
              mapping: "$.entries[0].shared_link.url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://upload.box.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST

When a GitHub Actions workflow fails on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Observability"
  description: "When a GitHub Actions workflow fails on a protected branch, opens a Jira bug, creates a Datadog deployment marker, and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: devops-ci
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions failure event with repo, branch, commit, and workflow details, open a Jira bug in the engineering project, create a Datadog deployment event, and post an alert to the engineering Teams channel. Use when a protected-branch CI pipeline fails."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository full name."
            - name: branch
              in: body
              type: string
              description: "Branch where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "Failing commit SHA."
            - name: workflow_name
              in: body
              type: string
              description: "Name of the failed GitHub Actions workflow."
            - name: run_url
              in: body
              type: string
              description: "URL to the failed workflow run."
            - name: eng_channel_id
              in: body
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: create-bug
              type: call
              call: jira-eng.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Commit: {{commit_sha}}\nRun: {{run_url}}"
            - name: log-deploy-event
              type: call
              call: datadog-ci.create-event
              with:
                title: "CI Failure: {{repo}} — {{branch}}"
                text: "Commit {{commit_sha}} | Workflow {{workflow_name}} failed"
                alert_type: "error"
            - name: alert-eng
              type: call
              call: msteams-eng.post-channel-message
              with:
                channel_id: "{{eng_channel_id}}"
                text: "CI Failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira-eng
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-ci
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates clinical database lock by running final data quality checks, generating discrepancy reports, locking the database, and notifying biostatistics.

naftiko: "0.5"
info:
  label: "Clinical Data Lock Orchestration"
  description: "Orchestrates clinical database lock by running final data quality checks, generating discrepancy reports, locking the database, and notifying biostatistics."
  tags:
    - clinical
    - rd
    - quality
    - snowflake
    - oracle
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-data-lock
      port: 8080
      tools:
        - name: execute-database-lock
          description: "Given a study ID and lock date, run data quality checks, generate discrepancy report, lock the database, and notify biostatistics. Use when clinical data management is ready to lock a study database."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical study identifier."
            - name: lock_date
              in: body
              type: string
              description: "Target database lock date in YYYY-MM-DD format."
          steps:
            - name: run-quality-checks
              type: call
              call: snowflake.execute-query
              with:
                query_name: "clinical_data_quality_check"
                params: "{{study_id}}"
            - name: generate-discrepancy-report
              type: call
              call: snowflake.execute-query
              with:
                query_name: "discrepancy_report"
                params: "{{study_id}}"
            - name: lock-database
              type: call
              call: oracle-clinical.lock-study
              with:
                study_id: "{{study_id}}"
                lock_date: "{{lock_date}}"
            - name: notify-biostat
              type: call
              call: msteams.send-message
              with:
                channel_id: "biostatistics"
                text: "Study {{study_id}} database locked as of {{lock_date}}. Open queries: {{run-quality-checks.open_query_count}}. Discrepancies: {{generate-discrepancy-report.discrepancy_count}}. Lock status: {{lock-database.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.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: oracle-clinical
      baseUri: "https://abbott-ctms.oracle.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}/lock"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: lock-study
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Activates a clinical trial site by verifying IRB approval, provisioning site access, creating monitoring visits, and notifying the clinical operations team.

naftiko: "0.5"
info:
  label: "Clinical Site Activation Orchestration"
  description: "Activates a clinical trial site by verifying IRB approval, provisioning site access, creating monitoring visits, and notifying the clinical operations team."
  tags:
    - clinical
    - rd
    - oracle
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: site-activation
      port: 8080
      tools:
        - name: activate-clinical-site
          description: "Given a study ID and site ID, verify IRB approval, provision site access, schedule monitoring, and notify the team. Use when clinical operations is ready to activate a new trial site."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical study identifier."
            - name: site_id
              in: body
              type: string
              description: "Clinical site identifier."
          steps:
            - name: verify-irb
              type: call
              call: oracle-clinical.get-irb-status
              with:
                study_id: "{{study_id}}"
                site_id: "{{site_id}}"
            - name: provision-access
              type: call
              call: okta.assign-group
              with:
                group_name: "study-{{study_id}}-site-{{site_id}}"
                site_id: "{{site_id}}"
            - name: schedule-monitoring
              type: call
              call: oracle-clinical.create-visit
              with:
                study_id: "{{study_id}}"
                site_id: "{{site_id}}"
                visit_type: "site_initiation"
            - name: notify-ops
              type: call
              call: msteams.send-message
              with:
                channel_id: "clinical-ops"
                text: "Site {{site_id}} activated for study {{study_id}}. IRB status: {{verify-irb.status}}. Initiation visit scheduled: {{schedule-monitoring.visit_date}}"
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://abbott-ctms.oracle.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: irb
          path: "/studies/{{study_id}}/sites/{{site_id}}/irb"
          inputParameters:
            - name: study_id
              in: path
            - name: site_id
              in: path
          operations:
            - name: get-irb-status
              method: GET
        - name: visits
          path: "/studies/{{study_id}}/sites/{{site_id}}/visits"
          inputParameters:
            - name: study_id
              in: path
            - name: site_id
              in: path
          operations:
            - name: create-visit
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: assign-group
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a serious adverse event is reported, logs it in the safety database, notifies the medical monitor, creates a regulatory filing task, and updates the trial management system.

naftiko: "0.5"
info:
  label: "Clinical Trial Adverse Event Reporting"
  description: "When a serious adverse event is reported, logs it in the safety database, notifies the medical monitor, creates a regulatory filing task, and updates the trial management system."
  tags:
    - clinical
    - regulatory
    - safety
    - oracle
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: clinical-safety
      port: 8080
      tools:
        - name: report-adverse-event
          description: "Given a study ID, patient ID, and event description, log the adverse event in the safety database, alert the medical monitor, create a regulatory task, and update the CTMS. Use when clinical sites report serious adverse events."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical study identifier."
            - name: patient_id
              in: body
              type: string
              description: "Patient subject identifier."
            - name: event_description
              in: body
              type: string
              description: "Description of the adverse event."
            - name: severity
              in: body
              type: string
              description: "Event severity: mild, moderate, severe, life-threatening."
          steps:
            - name: log-safety-event
              type: call
              call: oracle-argus.create-case
              with:
                study_id: "{{study_id}}"
                subject_id: "{{patient_id}}"
                description: "{{event_description}}"
                seriousness: "{{severity}}"
            - name: notify-medical-monitor
              type: call
              call: msteams.send-message
              with:
                channel_id: "medical-monitoring"
                text: "SAE Alert - Study {{study_id}}, Patient {{patient_id}}: {{event_description}} ({{severity}}). Argus case: {{log-safety-event.case_number}}"
            - name: create-regulatory-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Regulatory SAE report - {{log-safety-event.case_number}}"
                category: "regulatory_filing"
                priority: "1"
                assigned_group: "Regulatory_Safety"
            - name: update-ctms
              type: call
              call: oracle-clinical.update-study-event
              with:
                study_id: "{{study_id}}"
                subject_id: "{{patient_id}}"
                safety_case: "{{log-safety-event.case_number}}"
  consumes:
    - type: http
      namespace: oracle-argus
      baseUri: "https://abbott-argus.oracle.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_argus_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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: oracle-clinical
      baseUri: "https://abbott-ctms.oracle.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: study-events
          path: "/studies/{{study_id}}/subjects/{{subject_id}}/events"
          inputParameters:
            - name: study_id
              in: path
            - name: subject_id
              in: path
          operations:
            - name: update-study-event
              method: POST

Queries the clinical trial management system for current patient enrollment counts, site-level progress, and projected completion dates for a given study.

naftiko: "0.5"
info:
  label: "Clinical Trial Patient Enrollment Tracker"
  description: "Queries the clinical trial management system for current patient enrollment counts, site-level progress, and projected completion dates for a given study."
  tags:
    - clinical
    - rd
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: clinical-enrollment
      port: 8080
      tools:
        - name: get-enrollment-status
          description: "Given a clinical study ID, return current enrollment count, target enrollment, site breakdown, and projected completion date. Use when clinical ops needs enrollment visibility."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical trial study identifier."
          call: oracle-clinical.get-study-enrollment
          with:
            study_id: "{{study_id}}"
          outputParameters:
            - name: enrolled_count
              type: integer
              mapping: "$.data.enrolled"
            - name: target_count
              type: integer
              mapping: "$.data.target"
            - name: projected_completion
              type: string
              mapping: "$.data.projected_completion_date"
  consumes:
    - type: http
      namespace: oracle-clinical
      baseUri: "https://abbott-ctms.oracle.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.oracle_ctms_token"
      resources:
        - name: studies
          path: "/studies/{{study_id}}/enrollment"
          inputParameters:
            - name: study_id
              in: path
          operations:
            - name: get-study-enrollment
              method: GET

Tracks regulatory submission status for clinical trial documents in Veeva Vault, logs updates in ServiceNow, and notifies the regulatory affairs team via Teams.

naftiko: "0.5"
info:
  label: "Clinical Trial Regulatory Submission Tracker"
  description: "Tracks regulatory submission status for clinical trial documents in Veeva Vault, logs updates in ServiceNow, and notifies the regulatory affairs team via Teams."
  tags:
    - regulatory
    - clinical
    - veeva
    - servicenow
    - healthcare
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: track-submission-status
          description: "Given a Veeva Vault document ID, retrieve the current regulatory submission status, update the corresponding ServiceNow record, and notify the regulatory affairs Teams channel. Use when regulatory teams need to track submission milestones."
          inputParameters:
            - name: vault_document_id
              in: body
              type: string
              description: "Veeva Vault document ID for the regulatory submission."
            - name: servicenow_record_id
              in: body
              type: string
              description: "ServiceNow record sys_id to update with submission status."
            - name: teams_channel_id
              in: body
              type: string
              description: "Regulatory affairs Teams channel ID."
          steps:
            - name: get-doc-status
              type: call
              call: veeva-vault.get-document
              with:
                document_id: "{{vault_document_id}}"
            - name: update-snow-record
              type: call
              call: servicenow-reg.update-record
              with:
                sys_id: "{{servicenow_record_id}}"
                submission_status: "{{get-doc-status.lifecycle_state}}"
                last_updated: "{{get-doc-status.modified_date}}"
            - name: notify-reg-team
              type: call
              call: msteams-reg.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Regulatory submission {{vault_document_id}} status: {{get-doc-status.lifecycle_state}} (updated {{get-doc-status.modified_date}}). ServiceNow updated: {{servicenow_record_id}}"
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott.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
    - type: http
      namespace: servicenow-reg
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_regulatory_submission/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: msteams-reg
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira ticket for the cloud team, and posts an alert to the FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Response"
  description: "When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira ticket for the cloud team, and posts an alert to the FinOps Teams channel."
  tags:
    - finops
    - cloud
    - aws
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an AWS cost anomaly ID, service name, and estimated overage, create a Datadog warning event, open a Jira ticket for the cloud FinOps team, and post to the FinOps Teams channel. Use when AWS Cost Anomaly Detection triggers above the configured threshold."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "AWS Cost Anomaly Detection anomaly ID."
            - name: service_name
              in: body
              type: string
              description: "AWS service generating the cost anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated cost overage in USD."
            - name: finops_channel_id
              in: body
              type: string
              description: "FinOps Teams channel ID."
          steps:
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "AWS Cost Anomaly: {{service_name}}"
                text: "Anomaly {{anomaly_id}} — estimated overage ${{estimated_overage_usd}}"
                alert_type: "warning"
            - name: open-jira
              type: call
              call: jira-cloud.create-issue
              with:
                project_key: "CLOUD"
                issuetype: "Task"
                summary: "Cost anomaly: {{service_name}} +${{estimated_overage_usd}}"
                description: "AWS anomaly {{anomaly_id}}. Datadog: {{create-dd-event.id}}. Investigate and remediate."
            - name: alert-finops
              type: call
              call: msteams-finops.post-channel-message
              with:
                channel_id: "{{finops_channel_id}}"
                text: "AWS Cost Anomaly on {{service_name}}: +${{estimated_overage_usd}} | Jira: {{open-jira.key}} | Datadog: {{create-dd-event.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira-cloud
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Initiates a compliance document review cycle by retrieving the document from Veeva Vault, creating reviewer tasks in ServiceNow, setting deadlines, and notifying reviewers.

naftiko: "0.5"
info:
  label: "Compliance Document Review Orchestration"
  description: "Initiates a compliance document review cycle by retrieving the document from Veeva Vault, creating reviewer tasks in ServiceNow, setting deadlines, and notifying reviewers."
  tags:
    - compliance
    - quality
    - veeva-vault
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance-review
      port: 8080
      tools:
        - name: initiate-document-review
          description: "Given a Veeva document ID and reviewer list, create review tasks, set deadlines, and notify reviewers. Use when quality or compliance initiates periodic document reviews."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "Veeva Vault document ID."
            - name: review_deadline
              in: body
              type: string
              description: "Review deadline in YYYY-MM-DD format."
          steps:
            - name: get-document
              type: call
              call: veeva-vault.get-document
              with:
                doc_id: "{{document_id}}"
            - name: create-review-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Review: {{get-document.title}}"
                category: "compliance_review"
                assigned_group: "Quality_Compliance"
                due_date: "{{review_deadline}}"
            - name: notify-reviewers
              type: call
              call: msteams.send-message
              with:
                channel_id: "compliance-reviews"
                text: "Document review requested: {{get-document.title}} (v{{get-document.version}}). Due: {{review_deadline}}. Task: {{create-review-task.number}}"
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: documents
          path: "/objects/documents/{{doc_id}}"
          inputParameters:
            - name: doc_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a standard operating procedure document from Confluence by page ID, returning title, content, version, and last updated date.

naftiko: "0.5"
info:
  label: "Confluence SOP Retrieval"
  description: "Retrieves a standard operating procedure document from Confluence by page ID, returning title, content, version, and last updated date."
  tags:
    - quality
    - documentation
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: sop-library
      port: 8080
      tools:
        - name: get-sop-document
          description: "Given a Confluence page ID, return the SOP title, body content, version number, and last modified date. Use when quality or operations staff need to reference standard procedures."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID."
          call: confluence.get-page
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: version
              type: integer
              mapping: "$.version.number"
            - name: last_updated
              type: string
              mapping: "$.version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://abbott.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=version,body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

Queries CrowdStrike Falcon for threat detections on a specific endpoint, returning detection details, severity, and recommended actions.

naftiko: "0.5"
info:
  label: "CrowdStrike Endpoint Threat Lookup"
  description: "Queries CrowdStrike Falcon for threat detections on a specific endpoint, returning detection details, severity, and recommended actions."
  tags:
    - security
    - endpoint
    - crowdstrike
capability:
  exposes:
    - type: mcp
      namespace: endpoint-security
      port: 8080
      tools:
        - name: get-endpoint-threats
          description: "Given a hostname, return active threat detections, severity levels, and recommended remediation actions. Use when security operations investigates endpoint alerts."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "Endpoint hostname."
          call: crowdstrike.get-detections
          with:
            filter: "device.hostname:'{{hostname}}'"
          outputParameters:
            - name: detection_count
              type: integer
              mapping: "$.meta.pagination.total"
            - name: max_severity
              type: string
              mapping: "$.resources[0].max_severity_displayname"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: detections
          path: "/detects/queries/detects/v1"
          operations:
            - name: get-detections
              method: GET

Analyzes customer complaint trends by querying Snowflake for complaint data grouped by product line, category, and time period.

naftiko: "0.5"
info:
  label: "Customer Complaint Trend Analysis"
  description: "Analyzes customer complaint trends by querying Snowflake for complaint data grouped by product line, category, and time period."
  tags:
    - quality
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: complaint-analytics
      port: 8080
      tools:
        - name: analyze-complaint-trends
          description: "Given a product line and time period, return complaint counts by category, trending patterns, and comparison to prior period. Use when quality teams need complaint trend visibility."
          inputParameters:
            - name: product_line
              in: body
              type: string
              description: "Product line name, e.g. 'Diagnostics', 'Nutrition', 'Medical Devices'."
            - name: period
              in: body
              type: string
              description: "Analysis period, e.g. 'last_90_days'."
          call: snowflake.execute-query
          with:
            query_name: "complaint_trend_analysis"
            params: "{{product_line}},{{period}}"
          outputParameters:
            - name: total_complaints
              type: integer
              mapping: "$.data[0].total"
            - name: top_category
              type: string
              mapping: "$.data[0].top_category"
            - name: trend_direction
              type: string
              mapping: "$.data[0].trend"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Deploys a machine learning model from Databricks to production by registering the model, running validation, deploying the endpoint, and notifying the data science team.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Orchestration"
  description: "Deploys a machine learning model from Databricks to production by registering the model, running validation, deploying the endpoint, and notifying the data science team."
  tags:
    - rd
    - ai
    - databricks
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ml-deployment
      port: 8080
      tools:
        - name: deploy-ml-model
          description: "Given a model name and version, register it, run validation tests, deploy to serving endpoint, and notify the team. Use when data science approves a model for production deployment."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Databricks model name."
            - name: model_version
              in: body
              type: string
              description: "Model version number."
          steps:
            - name: register-model
              type: call
              call: databricks.register-model-version
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
                stage: "Production"
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "ML model deployment: {{model_name}} v{{model_version}}"
                category: "application"
                assigned_group: "Data_Science"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "data-science"
                text: "Model {{model_name}} v{{model_version}} deployed to production. Change request: {{create-change-request.number}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://abbott.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: models
          path: "/mlflow/model-versions/transition-stage"
          operations:
            - name: register-model-version
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for the current health status of a monitored application, returning uptime, error rate, and active alerts.

naftiko: "0.5"
info:
  label: "Datadog Application Health Check"
  description: "Queries Datadog for the current health status of a monitored application, returning uptime, error rate, and active alerts."
  tags:
    - it
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: app-monitoring
      port: 8080
      tools:
        - name: get-app-health
          description: "Given a Datadog service name, return the current uptime percentage, error rate, and count of active alerts. Use when SRE teams need quick application health visibility."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Datadog service name."
          call: datadog.get-service-summary
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: uptime_percent
              type: number
              mapping: "$.data.uptime"
            - name: error_rate
              type: number
              mapping: "$.data.error_rate"
            - name: active_alerts
              type: integer
              mapping: "$.data.active_alerts_count"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/service_summary?service={{service}}"
          inputParameters:
            - name: service
              in: query
          operations:
            - name: get-service-summary
              method: GET

When a medical device complaint exceeds severity threshold, automatically creates a CAPA record, notifies the quality team, and updates the complaint tracking system.

naftiko: "0.5"
info:
  label: "Device Complaint to CAPA Orchestration"
  description: "When a medical device complaint exceeds severity threshold, automatically creates a CAPA record, notifies the quality team, and updates the complaint tracking system."
  tags:
    - quality
    - regulatory
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-complaint-capa
      port: 8080
      tools:
        - name: escalate-complaint-to-capa
          description: "Given a complaint case ID, evaluate severity and create a CAPA if threshold is met, notify quality leadership, and update the complaint record. Use when quality assurance identifies a high-severity device complaint."
          inputParameters:
            - name: complaint_case_id
              in: body
              type: string
              description: "Salesforce complaint case ID."
          steps:
            - name: get-complaint
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{complaint_case_id}}"
            - name: create-capa
              type: call
              call: servicenow.create-capa
              with:
                short_description: "CAPA from complaint: {{get-complaint.subject}}"
                severity: "{{get-complaint.severity}}"
                product_code: "{{get-complaint.product_code}}"
                source_complaint: "{{complaint_case_id}}"
            - name: notify-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-leadership"
                text: "CAPA {{create-capa.number}} created from device complaint {{complaint_case_id}} - Severity: {{get-complaint.severity}} - Product: {{get-complaint.product_code}}"
            - name: update-complaint
              type: call
              call: salesforce.update-case
              with:
                case_id: "{{complaint_case_id}}"
                capa_reference: "{{create-capa.number}}"
                status: "CAPA Initiated"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.my.salesforce.com/services/data/v59.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
            - name: update-case
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: capa
          path: "/table/u_capa"
          operations:
            - name: create-capa
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages reagent lot release by checking QC test results in SAP, verifying specifications, creating the release certificate, and notifying distribution.

naftiko: "0.5"
info:
  label: "Diagnostic Reagent Lot Release Orchestration"
  description: "Manages reagent lot release by checking QC test results in SAP, verifying specifications, creating the release certificate, and notifying distribution."
  tags:
    - quality
    - manufacturing
    - diagnostics
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lot-release
      port: 8080
      tools:
        - name: release-reagent-lot
          description: "Given a batch number and product code, verify QC results, generate release certificate, update SAP status, and notify distribution. Use when quality assurance releases a diagnostic reagent lot."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "Manufacturing batch number."
            - name: product_code
              in: body
              type: string
              description: "Diagnostic reagent product code."
          steps:
            - name: get-qc-results
              type: call
              call: sap-erp.get-inspection
              with:
                batch: "{{batch_number}}"
                material: "{{product_code}}"
            - name: update-batch-status
              type: call
              call: sap-erp.release-batch
              with:
                batch: "{{batch_number}}"
                status: "released"
            - name: create-certificate
              type: call
              call: servicenow.create-task
              with:
                short_description: "CoA generation: Batch {{batch_number}} - {{product_code}}"
                category: "quality_release"
                assigned_group: "Quality_Assurance"
            - name: notify-distribution
              type: call
              call: msteams.send-message
              with:
                channel_id: "diagnostics-distribution"
                text: "Reagent lot {{batch_number}} ({{product_code}}) released. QC result: {{get-qc-results.result}}. CoA task: {{create-certificate.number}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspections
          path: "/A_InspectionResult"
          operations:
            - name: get-inspection
              method: GET
        - name: batches
          path: "/A_BatchRelease"
          operations:
            - name: release-batch
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls the diagnostics division's open Salesforce opportunity pipeline, refreshes the Power BI executive dashboard, and emails a weekly summary to sales leadership.

naftiko: "0.5"
info:
  label: "Diagnostics Sales Opportunity Pipeline Report"
  description: "Pulls the diagnostics division's open Salesforce opportunity pipeline, refreshes the Power BI executive dashboard, and emails a weekly summary to sales leadership."
  tags:
    - sales
    - crm
    - salesforce
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-pipeline
      port: 8080
      tools:
        - name: publish-pipeline-report
          description: "Given a Salesforce opportunity filter and Power BI dataset ID, retrieve the open sales pipeline from Salesforce, trigger a Power BI refresh, and email the pipeline summary to sales leadership. Use weekly for sales forecast reviews."
          inputParameters:
            - name: division
              in: body
              type: string
              description: "Sales division to filter, e.g. 'Diagnostics' or 'Medical Devices'."
            - name: pbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the pipeline dashboard."
            - name: leadership_email
              in: body
              type: string
              description: "Sales leadership email distribution list."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce-pipeline.query-opportunities
              with:
                division: "{{division}}"
                stage_not_in: "Closed Won,Closed Lost"
            - name: refresh-pbi
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{pbi_dataset_id}}"
            - name: send-summary
              type: call
              call: msgraph-sales.send-email
              with:
                to: "{{leadership_email}}"
                subject: "{{division}} Pipeline Report — {{get-pipeline.record_count}} opportunities | ${{get-pipeline.total_value}}"
                body: "Open pipeline for {{division}}: {{get-pipeline.record_count}} opportunities totaling ${{get-pipeline.total_value}}. Power BI dashboard refreshed."
  consumes:
    - type: http
      namespace: salesforce-pipeline
      baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: division
              in: query
            - name: stage_not_in
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/users/{{sender}}/sendMail"
          operations:
            - name: send-email
              method: POST

Sends a contract for electronic signature via DocuSign, updates the Salesforce opportunity with the envelope status, and notifies legal when fully executed.

naftiko: "0.5"
info:
  label: "DocuSign Contract Execution Orchestration"
  description: "Sends a contract for electronic signature via DocuSign, updates the Salesforce opportunity with the envelope status, and notifies legal when fully executed."
  tags:
    - legal
    - sales
    - docusign
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-execution
      port: 8080
      tools:
        - name: send-contract-for-signature
          description: "Given a Salesforce opportunity ID and contract template, send the contract via DocuSign, update CRM, and notify legal upon completion. Use when sales needs to execute a customer contract."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: template_id
              in: body
              type: string
              description: "DocuSign template identifier."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: send-envelope
              type: call
              call: docusign.create-envelope
              with:
                template_id: "{{template_id}}"
                signer_email: "{{get-opportunity.contact_email}}"
                signer_name: "{{get-opportunity.contact_name}}"
            - name: update-crm
              type: call
              call: salesforce.update-opportunity
              with:
                opp_id: "{{opportunity_id}}"
                contract_status: "Sent for Signature"
                envelope_id: "{{send-envelope.envelope_id}}"
            - name: notify-legal
              type: call
              call: msteams.send-message
              with:
                channel_id: "legal-contracts"
                text: "Contract sent for {{get-opportunity.account_name}} via DocuSign. Envelope: {{send-envelope.envelope_id}}. Opportunity: {{opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/{{account_id}}/envelopes"
          operations:
            - name: create-envelope
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and removes Salesforce user license.

naftiko: "0.5"
info:
  label: "Employee Offboarding Deprovisioning"
  description: "When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and removes Salesforce user license."
  tags:
    - hr
    - offboarding
    - okta
    - workday
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a terminated employee's Workday ID and Okta user ID, deactivate their Okta account, close open ServiceNow access requests, and deactivate their Salesforce user license. Use immediately upon processing a termination in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the terminated employee."
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID to deactivate."
            - name: salesforce_user_id
              in: body
              type: string
              description: "Salesforce user ID to deactivate."
          steps:
            - name: deactivate-okta
              type: call
              call: okta-offboard.deactivate-user
              with:
                user_id: "{{okta_user_id}}"
            - name: close-access-requests
              type: call
              call: servicenow-offboard.patch-requests
              with:
                employee_id: "{{workday_employee_id}}"
                state: "closed_complete"
            - name: deactivate-sf
              type: call
              call: salesforce-offboard.update-user
              with:
                user_id: "{{salesforce_user_id}}"
                is_active: "false"
  consumes:
    - type: http
      namespace: okta-offboard
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: patch-requests
              method: PATCH
    - type: http
      namespace: salesforce-offboard
      baseUri: "https://abbott.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: update-user
              method: PATCH

When a Workday employee role change is approved, updates their Okta group memberships, adjusts Salesforce user profile, and notifies the IT help desk via ServiceNow.

naftiko: "0.5"
info:
  label: "Employee Role Change Provisioning"
  description: "When a Workday employee role change is approved, updates their Okta group memberships, adjusts Salesforce user profile, and notifies the IT help desk via ServiceNow."
  tags:
    - hr
    - identity
    - workday
    - okta
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: role-change
      port: 8080
      tools:
        - name: process-role-change
          description: "Given a Workday employee ID, new role, and Okta group assignments, update the employee's Okta group membership to reflect new role permissions, update their Salesforce user profile, and create a ServiceNow task for IT follow-up. Use when an employee's role or department changes."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee with the role change."
            - name: new_role
              in: body
              type: string
              description: "New job title or role description."
            - name: okta_add_groups
              in: body
              type: string
              description: "Comma-separated Okta group IDs to add the user to."
            - name: okta_remove_groups
              in: body
              type: string
              description: "Comma-separated Okta group IDs to remove the user from."
            - name: salesforce_user_id
              in: body
              type: string
              description: "Salesforce user ID to update."
          steps:
            - name: get-worker
              type: call
              call: workday-rc.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-okta-groups
              type: call
              call: okta-role.update-user-groups
              with:
                user_email: "{{get-worker.work_email}}"
                add_groups: "{{okta_add_groups}}"
                remove_groups: "{{okta_remove_groups}}"
            - name: update-sf-profile
              type: call
              call: salesforce-role.update-user
              with:
                user_id: "{{salesforce_user_id}}"
                title: "{{new_role}}"
            - name: create-it-task
              type: call
              call: servicenow-rc.create-task
              with:
                short_description: "Role change: {{get-worker.full_name}} → {{new_role}}"
                category: "access_management"
                assigned_group: "IT_Access_Provisioning"
  consumes:
    - type: http
      namespace: workday-rc
      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: okta-role
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-groups
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: update-user-groups
              method: POST
    - type: http
      namespace: salesforce-role
      baseUri: "https://abbott.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: update-user
              method: PATCH
    - type: http
      namespace: servicenow-rc
      baseUri: "https://abbott.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

When an employee transfers between divisions, updates Workday, re-provisions Okta group memberships, transfers ServiceNow assets, and notifies both managers.

naftiko: "0.5"
info:
  label: "Employee Transfer Orchestration"
  description: "When an employee transfers between divisions, updates Workday, re-provisions Okta group memberships, transfers ServiceNow assets, and notifies both managers."
  tags:
    - hr
    - identity
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: employee-transfer
      port: 8080
      tools:
        - name: process-employee-transfer
          description: "Given a worker ID, source department, and target department, update HR records, re-provision access, transfer assets, and notify stakeholders. Use when HR processes an inter-division transfer."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: target_department
              in: body
              type: string
              description: "Target department code."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-okta-groups
              type: call
              call: okta.update-user-groups
              with:
                user_email: "{{get-employee.work_email}}"
                new_department: "{{target_department}}"
            - name: transfer-assets
              type: call
              call: servicenow.transfer-assets
              with:
                user_id: "{{worker_id}}"
                new_department: "{{target_department}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-operations"
                text: "Transfer processed: {{get-employee.first_name}} {{get-employee.last_name}} to {{target_department}}. Access updated. Assets transferred."
  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: okta
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_email}}/groups"
          inputParameters:
            - name: user_email
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/alm_asset"
          operations:
            - name: transfer-assets
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When an environmental monitoring sensor detects an out-of-spec condition in a cleanroom, creates an incident, alerts quality, logs a deviation, and triggers investigation.

naftiko: "0.5"
info:
  label: "Environmental Monitoring Alert Response"
  description: "When an environmental monitoring sensor detects an out-of-spec condition in a cleanroom, creates an incident, alerts quality, logs a deviation, and triggers investigation."
  tags:
    - manufacturing
    - quality
    - compliance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: env-monitoring
      port: 8080
      tools:
        - name: handle-env-excursion
          description: "Given a sensor ID, parameter name, and measured value, create an incident, alert quality, log a deviation, and initiate investigation. Use when cleanroom environmental monitoring detects out-of-spec conditions."
          inputParameters:
            - name: sensor_id
              in: body
              type: string
              description: "Environmental monitoring sensor identifier."
            - name: parameter_name
              in: body
              type: string
              description: "Parameter out of spec, e.g. 'particle_count', 'temperature', 'humidity'."
            - name: measured_value
              in: body
              type: string
              description: "The measured out-of-spec value."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Environmental excursion: {{parameter_name}} at sensor {{sensor_id}}"
                category: "manufacturing_quality"
                priority: "2"
                assigned_group: "Quality_Assurance"
            - name: log-deviation
              type: call
              call: servicenow.create-deviation
              with:
                description: "Environmental excursion: {{parameter_name}} measured {{measured_value}} at sensor {{sensor_id}}"
                area: "cleanroom"
                incident_ref: "{{create-incident.number}}"
            - name: alert-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-alerts"
                text: "ENV ALERT: {{parameter_name}} excursion at sensor {{sensor_id}}. Value: {{measured_value}}. Deviation: {{log-deviation.number}}. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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
        - name: deviations
          path: "/table/u_deviation"
          operations:
            - name: create-deviation
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages equipment calibration by checking due dates in SAP, scheduling the calibration, assigning technicians, and updating the calibration certificate in the QMS.

naftiko: "0.5"
info:
  label: "Equipment Calibration Orchestration"
  description: "Manages equipment calibration by checking due dates in SAP, scheduling the calibration, assigning technicians, and updating the calibration certificate in the QMS."
  tags:
    - quality
    - manufacturing
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: calibration-mgmt
      port: 8080
      tools:
        - name: schedule-calibration
          description: "Given an equipment ID, check calibration due date, schedule the calibration, assign a technician, and update the QMS. Use when quality assurance manages calibration schedules."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "SAP equipment identifier."
          steps:
            - name: check-due-date
              type: call
              call: sap-erp.get-calibration-status
              with:
                equipment: "{{equipment_id}}"
            - name: create-work-order
              type: call
              call: servicenow.create-work-order
              with:
                short_description: "Calibration: Equipment {{equipment_id}}"
                category: "calibration"
                assigned_group: "Metrology_Lab"
                due_date: "{{check-due-date.next_cal_date}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-calibration"
                text: "Calibration scheduled for equipment {{equipment_id}}. Due: {{check-due-date.next_cal_date}}. Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/A_Equipment('{{equipment}}')/calibration"
          inputParameters:
            - name: equipment
              in: path
          operations:
            - name: get-calibration-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current status of a pending FDA 510(k) premarket notification by submission number from the regulatory affairs tracking system.

naftiko: "0.5"
info:
  label: "FDA 510(k) Submission Status Lookup"
  description: "Retrieves the current status of a pending FDA 510(k) premarket notification by submission number from the regulatory affairs tracking system."
  tags:
    - regulatory
    - fda
    - veeva-vault
capability:
  exposes:
    - type: mcp
      namespace: regulatory-submissions
      port: 8080
      tools:
        - name: get-510k-status
          description: "Given a 510(k) submission number, return the current review status, reviewer assignment, and expected decision date. Use when regulatory affairs needs to check submission progress."
          inputParameters:
            - name: submission_number
              in: body
              type: string
              description: "FDA 510(k) submission number, e.g. 'K231234'."
          call: veeva-vault.get-submission
          with:
            submission_id: "{{submission_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.status"
            - name: reviewer
              type: string
              mapping: "$.data.assigned_reviewer"
            - name: expected_decision_date
              type: string
              mapping: "$.data.target_date"
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: submissions
          path: "/objects/submission__c/{{submission_id}}"
          inputParameters:
            - name: submission_id
              in: path
          operations:
            - name: get-submission
              method: GET

When a customer reports a diagnostic instrument issue, creates a service case, identifies the nearest field engineer, dispatches them, and updates the customer.

naftiko: "0.5"
info:
  label: "Field Service Dispatch Orchestration"
  description: "When a customer reports a diagnostic instrument issue, creates a service case, identifies the nearest field engineer, dispatches them, and updates the customer."
  tags:
    - service
    - diagnostics
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-service
      port: 8080
      tools:
        - name: dispatch-field-engineer
          description: "Given a customer account ID and issue description, create a service case, find the nearest engineer, dispatch them, and notify the customer. Use when customer support escalates a field service need."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce customer account ID."
            - name: issue_description
              in: body
              type: string
              description: "Description of the instrument issue."
          steps:
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                account_id: "{{account_id}}"
                subject: "Field service: {{issue_description}}"
                type: "field_service"
            - name: find-engineer
              type: call
              call: servicenow.find-available-resource
              with:
                skill: "diagnostics_instruments"
                location: "{{account_id}}"
            - name: create-work-order
              type: call
              call: servicenow.create-work-order
              with:
                case_ref: "{{create-case.case_number}}"
                assigned_to: "{{find-engineer.engineer_id}}"
                description: "{{issue_description}}"
            - name: notify-customer
              type: call
              call: msteams.send-message
              with:
                channel_id: "customer-service"
                text: "Field engineer {{find-engineer.engineer_name}} dispatched for case {{create-case.case_number}}. ETA: {{find-engineer.estimated_arrival}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.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: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: resources
          path: "/table/cmn_schedule_span"
          operations:
            - name: find-available-resource
              method: GET
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Coordinates a new FreeStyle Libre product launch by creating a Marketo campaign, updating Salesforce opportunity stages, and scheduling LinkedIn promotional content.

naftiko: "0.5"
info:
  label: "FreeStyle Libre Device Launch Campaign"
  description: "Coordinates a new FreeStyle Libre product launch by creating a Marketo campaign, updating Salesforce opportunity stages, and scheduling LinkedIn promotional content."
  tags:
    - marketing
    - salesforce
    - marketo
    - linkedin
    - medical-devices
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: setup-device-launch-campaign
          description: "Given a product name, launch date, and target segment, create a Marketo email campaign, update related Salesforce opportunities to the pre-launch stage, and schedule a LinkedIn post for the launch date. Use when marketing a new medical device launch."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "Product name, e.g. 'FreeStyle Libre 3 Plus'."
            - name: launch_date
              in: body
              type: string
              description: "Product launch date in YYYY-MM-DD format."
            - name: target_segment
              in: body
              type: string
              description: "Target audience segment, e.g. 'Endocrinologists' or 'Diabetes Care'."
            - name: linkedin_copy
              in: body
              type: string
              description: "Copy text for the LinkedIn announcement post."
          steps:
            - name: create-marketo-campaign
              type: call
              call: marketo.create-campaign
              with:
                name: "{{product_name}} Launch — {{launch_date}}"
                segment: "{{target_segment}}"
                start_date: "{{launch_date}}"
            - name: update-sf-opportunities
              type: call
              call: salesforce-opps.update-opportunities
              with:
                product_name: "{{product_name}}"
                stage_name: "Pre-Launch"
            - name: schedule-linkedin-post
              type: call
              call: linkedin-mkt.create-post
              with:
                text: "{{linkedin_copy}}"
                scheduled_time: "{{launch_date}}"
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://abbott.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/campaigns.json"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: salesforce-opps
      baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: update-opportunities
              method: PATCH
    - type: http
      namespace: linkedin-mkt
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST

Checks a GitHub repository for branch protection rules, required reviewers, and security scanning configuration.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Check"
  description: "Checks a GitHub repository for branch protection rules, required reviewers, and security scanning configuration."
  tags:
    - security
    - devops
    - github
capability:
  exposes:
    - type: mcp
      namespace: repo-compliance
      port: 8080
      tools:
        - name: check-repo-compliance
          description: "Given a GitHub repository name, return branch protection status, required reviewer count, and security scanning enablement. Use when engineering leads need to verify repo governance."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository name in org/repo format."
          call: github.get-repo-settings
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: branch_protection_enabled
              type: boolean
              mapping: "$.data.branch_protection"
            - name: required_reviewers
              type: integer
              mapping: "$.data.required_reviewers"
            - name: security_scanning
              type: boolean
              mapping: "$.data.security_scanning_enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo-settings
              method: GET

When GitHub Advanced Security detects a critical CVE in a product codebase, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Alert Triage"
  description: "When GitHub Advanced Security detects a critical CVE in a product codebase, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams."
  tags:
    - security
    - github
    - devops
    - jira
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: sec-vuln
      port: 8080
      tools:
        - name: triage-security-alert
          description: "Given a GitHub security alert with CVE, severity, and affected package, create a high-priority Jira security ticket, log a Datadog error event, and alert the cybersecurity Teams channel. Use when GitHub Advanced Security emits a critical alert on a product or clinical system repo."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository full name."
            - name: cve_id
              in: body
              type: string
              description: "CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Severity: critical, high, medium, or low."
            - name: package_name
              in: body
              type: string
              description: "Affected package name."
            - name: sec_channel_id
              in: body
              type: string
              description: "Cybersecurity Teams channel ID."
          steps:
            - name: create-sec-ticket
              type: call
              call: jira-sec.create-issue
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "[{{severity}}] {{cve_id}} in {{repo}} — {{package_name}}"
                description: "CVE: {{cve_id}} | Package: {{package_name}} | Severity: {{severity}} | Repo: {{repo}}"
                priority: "Highest"
            - name: log-dd-event
              type: call
              call: datadog-sec.create-event
              with:
                title: "Security vulnerability: {{cve_id}} in {{repo}}"
                text: "Package {{package_name}} | Severity: {{severity}} | Jira: {{create-sec-ticket.key}}"
                alert_type: "error"
            - name: alert-security-team
              type: call
              call: msteams-sec.post-channel-message
              with:
                channel_id: "{{sec_channel_id}}"
                text: "SECURITY: {{severity}} CVE {{cve_id}} in {{repo}} / {{package_name}} | Jira: {{create-sec-ticket.key}} | Datadog: {{log-dd-event.url}}"
  consumes:
    - type: http
      namespace: jira-sec
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-sec
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams-sec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks GMP training compliance for a department by querying Workday Learning, returning completion rates and overdue assignments.

naftiko: "0.5"
info:
  label: "GMP Training Compliance Check"
  description: "Checks GMP training compliance for a department by querying Workday Learning, returning completion rates and overdue assignments."
  tags:
    - quality
    - compliance
    - workday
capability:
  exposes:
    - type: mcp
      namespace: training-compliance
      port: 8080
      tools:
        - name: check-gmp-compliance
          description: "Given a department code, return the GMP training completion rate, number of overdue assignments, and list of non-compliant employees. Use when quality assurance needs training compliance visibility."
          inputParameters:
            - name: department_code
              in: body
              type: string
              description: "Workday department code."
          call: workday.get-training-compliance
          with:
            department: "{{department_code}}"
            training_type: "gmp"
          outputParameters:
            - name: completion_rate
              type: number
              mapping: "$.data.completion_rate"
            - name: overdue_count
              type: integer
              mapping: "$.data.overdue_count"
            - name: total_employees
              type: integer
              mapping: "$.data.total_employees"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/training/compliance?department={{department}}&type={{training_type}}"
          inputParameters:
            - name: department
              in: query
            - name: training_type
              in: query
          operations:
            - name: get-training-compliance
              method: GET

Triggers an Informatica Cloud data integration job and returns the run status and processed record count.

naftiko: "0.5"
info:
  label: "Informatica Data Integration Job Trigger"
  description: "Triggers an Informatica Cloud data integration job and returns the run status and processed record count."
  tags:
    - data
    - integration
    - informatica
capability:
  exposes:
    - type: mcp
      namespace: data-integration
      port: 8080
      tools:
        - name: trigger-integration-job
          description: "Given an Informatica task ID, trigger the data integration job and return the run ID and status. Use when data engineering needs to manually trigger ETL jobs."
          inputParameters:
            - name: task_id
              in: body
              type: string
              description: "Informatica Cloud task identifier."
          call: informatica.start-job
          with:
            taskId: "{{task_id}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.runId"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job"
          operations:
            - name: start-job
              method: POST

Submits a ServiceNow change request for planned IT maintenance, routes it through CAB approval, and notifies affected teams in Microsoft Teams.

naftiko: "0.5"
info:
  label: "IT Change Management Request"
  description: "Submits a ServiceNow change request for planned IT maintenance, routes it through CAB approval, and notifies affected teams in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - approval
    - it-ops
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, affected systems, and maintenance window, create a ServiceNow change request and notify the change advisory board Teams channel. Use when engineering teams plan maintenance affecting production systems."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the change."
            - name: description
              in: body
              type: string
              description: "Full change details including rollback plan."
            - name: planned_start
              in: body
              type: string
              description: "Planned start time in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned end time in ISO 8601 format."
            - name: cab_channel_id
              in: body
              type: string
              description: "CAB Teams channel ID."
          steps:
            - name: create-change
              type: call
              call: servicenow-chg.create-change-request
              with:
                short_description: "{{short_description}}"
                description: "{{description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
                type: "normal"
            - name: notify-cab
              type: call
              call: msteams-cab.post-channel-message
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change Request {{create-change.number}}: {{short_description}} | Window: {{planned_start}} to {{planned_end}} | Status: awaiting CAB approval"
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://abbott.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-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Datadog fires a critical alert on a clinical system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel.

naftiko: "0.5"
info:
  label: "IT P1 Incident Triage and Escalation"
  description: "When Datadog fires a critical alert on a clinical system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: p1-triage
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog critical alert for a clinical or corporate system, create a P1 ServiceNow incident, trigger a PagerDuty page to the on-call engineer, and post an alert to the IT war-room Teams channel. Use when monitoring detects a critical system failure."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog monitor alert ID."
            - name: system_name
              in: body
              type: string
              description: "Name of the affected system."
            - name: alert_message
              in: body
              type: string
              description: "Human-readable alert description."
            - name: warroom_channel_id
              in: body
              type: string
              description: "IT war-room Teams channel ID."
          steps:
            - name: create-p1-incident
              type: call
              call: servicenow-p1.create-incident
              with:
                short_description: "P1 Alert — {{system_name}}"
                description: "Datadog alert {{alert_id}}: {{alert_message}}"
                priority: "1"
                category: "Critical_System"
            - name: page-oncall
              type: call
              call: pagerduty.trigger-incident
              with:
                title: "P1 Critical Alert — {{system_name}}"
                severity: "critical"
                details: "ServiceNow INC: {{create-p1-incident.number}} | Alert: {{alert_id}}"
            - name: post-warroom
              type: call
              call: msteams-p1.post-channel-message
              with:
                channel_id: "{{warroom_channel_id}}"
                text: "P1 INCIDENT: {{system_name}} | INC: {{create-p1-incident.number}} | PagerDuty: {{page-oncall.incident_key}} | Alert: {{alert_message}}"
  consumes:
    - type: http
      namespace: servicenow-p1
      baseUri: "https://abbott.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: pagerduty
      baseUri: "https://events.pagerduty.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: enqueue
          path: "/enqueue"
          operations:
            - name: trigger-incident
              method: POST
    - type: http
      namespace: msteams-p1
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates a new bug report in Jira with specified project, summary, description, and priority fields.

naftiko: "0.5"
info:
  label: "Jira Bug Report Creation"
  description: "Creates a new bug report in Jira with specified project, summary, description, and priority fields."
  tags:
    - devops
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: issue-tracking
      port: 8080
      tools:
        - name: create-bug-report
          description: "Given a project key, summary, description, and priority, create a Jira bug issue and return the issue key. Use when engineering teams need to log a software defect."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key, e.g. 'LIBRE'."
            - name: summary
              in: body
              type: string
              description: "Bug summary."
            - name: description
              in: body
              type: string
              description: "Detailed bug description."
            - name: priority
              in: body
              type: string
              description: "Priority: Critical, High, Medium, Low."
          call: jira.create-issue
          with:
            project: "{{project_key}}"
            issuetype: "Bug"
            summary: "{{summary}}"
            description: "{{description}}"
            priority: "{{priority}}"
          outputParameters:
            - name: issue_key
              type: string
              mapping: "$.key"
            - name: issue_url
              type: string
              mapping: "$.self"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

At sprint start, syncs the Jira backlog prioritization to the Confluence planning page and posts the sprint goal to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Board Sync"
  description: "At sprint start, syncs the Jira backlog prioritization to the Confluence planning page and posts the sprint goal to the engineering Teams channel."
  tags:
    - devops
    - jira
    - confluence
    - agile
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: sprint-planning
      port: 8080
      tools:
        - name: sync-sprint-plan
          description: "Given a Jira sprint ID and Confluence page ID, retrieve the sprint's planned issues and update the Confluence sprint planning page with the current backlog. Post the sprint goal to the engineering Teams channel. Use at sprint kickoff."
          inputParameters:
            - name: sprint_id
              in: body
              type: string
              description: "Jira sprint ID to sync."
            - name: confluence_page_id
              in: body
              type: string
              description: "Confluence page ID for the sprint planning document."
            - name: eng_channel_id
              in: body
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: get-sprint-issues
              type: call
              call: jira-sprint.get-sprint-issues
              with:
                sprint_id: "{{sprint_id}}"
            - name: update-confluence
              type: call
              call: confluence.update-page
              with:
                page_id: "{{confluence_page_id}}"
                content: "Sprint {{sprint_id}} planned issues: {{get-sprint-issues.issue_keys}}"
            - name: post-sprint-goal
              type: call
              call: msteams-sprint.post-channel-message
              with:
                channel_id: "{{eng_channel_id}}"
                text: "Sprint {{sprint_id}} started. {{get-sprint-issues.total_count}} issues planned. Confluence updated: {{update-confluence.url}}"
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://abbott.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprint-issues
          path: "/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://abbott.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT
    - type: http
      namespace: msteams-sprint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates the release pipeline for FreeStyle Libre CGM firmware by running validation tests, creating release notes, updating the artifact repository, and notifying regulatory.

naftiko: "0.5"
info:
  label: "Libre CGM Firmware Release Orchestration"
  description: "Orchestrates the release pipeline for FreeStyle Libre CGM firmware by running validation tests, creating release notes, updating the artifact repository, and notifying regulatory."
  tags:
    - rd
    - devops
    - medical-device
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: firmware-release
      port: 8080
      tools:
        - name: orchestrate-firmware-release
          description: "Given a firmware version and release branch, trigger validation, generate release notes, publish artifacts, and notify regulatory. Use when R&D approves a firmware build for release."
          inputParameters:
            - name: firmware_version
              in: body
              type: string
              description: "Firmware version string, e.g. 'v3.2.1'."
            - name: release_branch
              in: body
              type: string
              description: "Git branch name for the release."
          steps:
            - name: trigger-validation
              type: call
              call: github.create-workflow-dispatch
              with:
                repo: "abbott/libre-firmware"
                workflow: "validation-suite.yml"
                ref: "{{release_branch}}"
            - name: create-release-notes
              type: call
              call: github.create-release
              with:
                repo: "abbott/libre-firmware"
                tag: "{{firmware_version}}"
                name: "FreeStyle Libre Firmware {{firmware_version}}"
            - name: create-regulatory-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Regulatory review: Libre firmware {{firmware_version}}"
                category: "regulatory_review"
                assigned_group: "Regulatory_Affairs"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "libre-engineering"
                text: "Firmware {{firmware_version}} release initiated. Validation running. Regulatory task: {{create-regulatory-task.number}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatch
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: create-workflow-dispatch
              method: POST
        - name: releases
          path: "/repos/{{repo}}/releases"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-release
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves Abbott employer brand metrics from LinkedIn including follower count, engagement rate, and talent pipeline statistics.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Metrics Lookup"
  description: "Retrieves Abbott employer brand metrics from LinkedIn including follower count, engagement rate, and talent pipeline statistics."
  tags:
    - hr
    - marketing
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: employer-brand
      port: 8080
      tools:
        - name: get-employer-metrics
          description: "Return current LinkedIn employer brand metrics including follower count, post engagement rate, and talent pipeline size. Use when HR or employer brand teams need performance data."
          inputParameters:
            - name: time_period
              in: body
              type: string
              description: "Reporting period, e.g. 'last_30_days'."
          call: linkedin.get-organization-stats
          with:
            period: "{{time_period}}"
          outputParameters:
            - name: follower_count
              type: integer
              mapping: "$.data.followerCount"
            - name: engagement_rate
              type: number
              mapping: "$.data.engagementRate"
            - name: talent_pipeline_size
              type: integer
              mapping: "$.data.talentPipelineSize"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-stats
          path: "/organizationPageStatistics"
          operations:
            - name: get-organization-stats
              method: GET

Looks up a manufacturing batch record in SAP to return batch status, yield data, and quality release information.

naftiko: "0.5"
info:
  label: "Manufacturing Batch Record Status Check"
  description: "Looks up a manufacturing batch record in SAP to return batch status, yield data, and quality release information."
  tags:
    - manufacturing
    - quality
    - sap
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-batch
      port: 8080
      tools:
        - name: get-batch-status
          description: "Given a batch number, return the manufacturing batch record status, yield percentage, and quality release status. Use when production teams need batch visibility."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "SAP batch number, e.g. 'BATCH-2026-001234'."
          call: sap-erp.get-batch-record
          with:
            batch_id: "{{batch_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.BatchStatus"
            - name: yield_percentage
              type: number
              mapping: "$.d.YieldPercent"
            - name: quality_release
              type: string
              mapping: "$.d.QualityReleaseStatus"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batch-records
          path: "/A_BatchRecord('{{batch_id}}')"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-batch-record
              method: GET

When a manufacturing line goes down, creates an incident, alerts the maintenance team, logs downtime in SAP, and updates the production schedule.

naftiko: "0.5"
info:
  label: "Manufacturing Line Downtime Response"
  description: "When a manufacturing line goes down, creates an incident, alerts the maintenance team, logs downtime in SAP, and updates the production schedule."
  tags:
    - manufacturing
    - it
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: mfg-downtime
      port: 8080
      tools:
        - name: handle-line-downtime
          description: "Given a production line ID and failure reason, create a maintenance incident, notify the team, log downtime, and adjust production schedule. Use when manufacturing operations detects an unplanned line stoppage."
          inputParameters:
            - name: line_id
              in: body
              type: string
              description: "Production line identifier."
            - name: failure_reason
              in: body
              type: string
              description: "Description of the failure."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Line {{line_id}} down: {{failure_reason}}"
                category: "manufacturing"
                priority: "1"
                assigned_group: "Maintenance_Engineering"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "manufacturing-ops"
                text: "ALERT: Production line {{line_id}} is down. Reason: {{failure_reason}}. Incident: {{create-incident.number}}"
            - name: log-downtime
              type: call
              call: sap-erp.create-downtime-record
              with:
                work_center: "{{line_id}}"
                reason_code: "{{failure_reason}}"
                incident_ref: "{{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_DOWNTIME_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: downtime
          path: "/A_DowntimeRecord"
          operations:
            - name: create-downtime-record
              method: POST

Retrieves marketing campaign performance metrics from Marketo by campaign ID, returning send count, open rate, click rate, and conversions.

naftiko: "0.5"
info:
  label: "Marketo Campaign Performance Lookup"
  description: "Retrieves marketing campaign performance metrics from Marketo by campaign ID, returning send count, open rate, click rate, and conversions."
  tags:
    - marketing
    - analytics
    - marketo
capability:
  exposes:
    - type: mcp
      namespace: campaign-analytics
      port: 8080
      tools:
        - name: get-campaign-performance
          description: "Given a Marketo campaign ID, return send count, open rate, click-through rate, and conversion count. Use when marketing teams need campaign performance data."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Marketo campaign ID."
          call: marketo.get-campaign-stats
          with:
            id: "{{campaign_id}}"
          outputParameters:
            - name: sends
              type: integer
              mapping: "$.result.sends"
            - name: open_rate
              type: number
              mapping: "$.result.openRate"
            - name: click_rate
              type: number
              mapping: "$.result.clickRate"
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://abbott.mktorest.com/rest"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/v1/campaigns/{{id}}/stats.json"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET

Enrolls a Salesforce lead in a Marketo nurture program based on product interest, and syncs engagement data back to Salesforce after 30 days.

naftiko: "0.5"
info:
  label: "Marketo Lead Nurture Enrollment"
  description: "Enrolls a Salesforce lead in a Marketo nurture program based on product interest, and syncs engagement data back to Salesforce after 30 days."
  tags:
    - marketing
    - salesforce
    - marketo
    - lead-nurture
    - crm
capability:
  exposes:
    - type: mcp
      namespace: lead-nurture
      port: 8080
      tools:
        - name: enroll-lead-in-nurture
          description: "Given a Salesforce lead ID and Marketo program ID, retrieve the lead's details from Salesforce and enroll them in the specified Marketo nurture program. Use when marketing qualifies a lead for a product-specific nurture track."
          inputParameters:
            - name: salesforce_lead_id
              in: body
              type: string
              description: "Salesforce lead record ID."
            - name: marketo_program_id
              in: body
              type: string
              description: "Marketo program ID for the nurture campaign."
          steps:
            - name: get-lead
              type: call
              call: salesforce-leads.get-lead
              with:
                lead_id: "{{salesforce_lead_id}}"
            - name: enroll-marketo
              type: call
              call: marketo-nurture.add-to-program
              with:
                email: "{{get-lead.Email}}"
                first_name: "{{get-lead.FirstName}}"
                last_name: "{{get-lead.LastName}}"
                program_id: "{{marketo_program_id}}"
  consumes:
    - type: http
      namespace: salesforce-leads
      baseUri: "https://abbott.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: marketo-nurture
      baseUri: "https://abbott.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: program-members
          path: "/leads/programs/{{program_id}}.json"
          inputParameters:
            - name: program_id
              in: path
          operations:
            - name: add-to-program
              method: POST

When a medical device complaint is logged in Salesforce Service Cloud, creates a ServiceNow regulatory case, assigns a quality engineer, and sends a Teams notification to the vigilance team.

naftiko: "0.5"
info:
  label: "Medical Device Complaint Case Routing"
  description: "When a medical device complaint is logged in Salesforce Service Cloud, creates a ServiceNow regulatory case, assigns a quality engineer, and sends a Teams notification to the vigilance team."
  tags:
    - customer-service
    - regulatory
    - salesforce
    - servicenow
    - medical-devices
capability:
  exposes:
    - type: mcp
      namespace: complaint-ops
      port: 8080
      tools:
        - name: route-device-complaint
          description: "Given a Salesforce case ID for a medical device complaint, create a linked ServiceNow regulatory investigation record, assign it to the quality engineering group, and alert the vigilance Teams channel. Use when a device complaint requiring regulatory review is received."
          inputParameters:
            - name: salesforce_case_id
              in: body
              type: string
              description: "Salesforce case ID for the device complaint."
            - name: device_model
              in: body
              type: string
              description: "Medical device model or product number."
            - name: complaint_type
              in: body
              type: string
              description: "Type of complaint, e.g. 'malfunction', 'injury', 'death'."
            - name: vigilance_channel_id
              in: body
              type: string
              description: "Teams channel ID for the vigilance team."
          steps:
            - name: get-case
              type: call
              call: salesforce-cases.get-case
              with:
                case_id: "{{salesforce_case_id}}"
            - name: create-reg-investigation
              type: call
              call: servicenow-vigilance.create-incident
              with:
                short_description: "Device complaint — {{device_model}} — {{complaint_type}}"
                description: "Salesforce case: {{salesforce_case_id}} | Reporter: {{get-case.ContactName}} | Description: {{get-case.Description}}"
                category: "regulatory_vigilance"
                assigned_group: "Quality_Engineering"
            - name: notify-vigilance
              type: call
              call: msteams-vigilance.post-channel-message
              with:
                channel_id: "{{vigilance_channel_id}}"
                text: "Device Complaint: {{device_model}} — {{complaint_type}} | Salesforce: {{salesforce_case_id}} | ServiceNow INC: {{create-reg-investigation.number}}"
  consumes:
    - type: http
      namespace: salesforce-cases
      baseUri: "https://abbott.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: servicenow-vigilance
      baseUri: "https://abbott.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-vigilance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates UDI registration for a medical device by generating the device identifier, submitting to GUDID, updating SAP material master, and notifying regulatory affairs.

naftiko: "0.5"
info:
  label: "Medical Device UDI Registration Orchestration"
  description: "Orchestrates UDI registration for a medical device by generating the device identifier, submitting to GUDID, updating SAP material master, and notifying regulatory affairs."
  tags:
    - regulatory
    - manufacturing
    - sap
    - veeva-vault
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: udi-registration
      port: 8080
      tools:
        - name: register-device-udi
          description: "Given a product code and device description, generate the UDI, submit to GUDID, update SAP, and notify regulatory. Use when new medical devices need UDI registration."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Abbott product code."
            - name: device_description
              in: body
              type: string
              description: "Device description for GUDID."
          steps:
            - name: create-udi-record
              type: call
              call: veeva-vault.create-udi
              with:
                product_code: "{{product_code}}"
                description: "{{device_description}}"
            - name: update-material-master
              type: call
              call: sap-erp.update-material
              with:
                material: "{{product_code}}"
                udi: "{{create-udi-record.udi_di}}"
            - name: notify-regulatory
              type: call
              call: msteams.send-message
              with:
                channel_id: "regulatory-affairs"
                text: "UDI registered for {{product_code}}: {{create-udi-record.udi_di}}. GUDID submission: {{create-udi-record.gudid_status}}. SAP updated."
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: udi
          path: "/objects/udi__c"
          operations:
            - name: create-udi
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: update-material
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers SAP S/4HANA month-end financial close, validates journal completeness, and notifies the finance team via Teams upon completion.

naftiko: "0.5"
info:
  label: "Monthly Financial Period Close"
  description: "Triggers SAP S/4HANA month-end financial close, validates journal completeness, and notifies the finance team via Teams upon completion."
  tags:
    - finance
    - erp
    - period-close
    - sap
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-period-close
      port: 8080
      tools:
        - name: trigger-period-close
          description: "Given a fiscal period and company code, initiate the SAP S/4HANA period close sequence and post completion status to the finance Teams channel. Use at month end to automate the financial close workflow."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYPP format, e.g. '202603'."
            - name: company_code
              in: body
              type: string
              description: "SAP company code, e.g. 'ABBT'."
            - name: finance_channel_id
              in: body
              type: string
              description: "Finance Teams channel ID."
          steps:
            - name: close-period
              type: call
              call: sap-fi-close.close-period
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: validate-postings
              type: call
              call: sap-fi-journal.check-completeness
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: notify-finance
              type: call
              call: msteams-finsclose.post-channel-message
              with:
                channel_id: "{{finance_channel_id}}"
                text: "Period {{fiscal_period}} closed for company {{company_code}}. Journal status: {{validate-postings.status}} | Open items: {{validate-postings.open_count}}"
  consumes:
    - type: http
      namespace: sap-fi-close
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FAR_PERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close
          path: "/PeriodClose"
          operations:
            - name: close-period
              method: POST
    - type: http
      namespace: sap-fi-journal
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FAR_JOURNAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-validation
          path: "/JournalEntryCompleteness"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: check-completeness
              method: GET
    - type: http
      namespace: msteams-finsclose
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions their Okta account, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestration"
  description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions their Okta account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, create a ServiceNow onboarding task, provision the employee's Okta account, and send a Teams welcome message. Use when HR confirms a new hire in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Onboarding: {{get-employee.first_name}} {{get-employee.last_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-okta
              type: call
              call: okta.create-user
              with:
                firstName: "{{get-employee.first_name}}"
                lastName: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
                login: "{{get-employee.work_email}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Abbott, {{get-employee.first_name}}! Your IT onboarding ticket is {{create-ticket.number}}. Start date: {{start_date}}"
  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://abbott.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: okta
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Assesses new product launch readiness by checking regulatory clearance, supply chain readiness, marketing material approval, and sales team training completion.

naftiko: "0.5"
info:
  label: "New Product Launch Readiness Orchestration"
  description: "Assesses new product launch readiness by checking regulatory clearance, supply chain readiness, marketing material approval, and sales team training completion."
  tags:
    - manufacturing
    - regulatory
    - marketing
    - veeva-vault
    - sap
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: launch-readiness
      port: 8080
      tools:
        - name: assess-launch-readiness
          description: "Given a product code, check regulatory clearance, supply chain status, marketing readiness, and training completion. Use when product management assesses launch readiness."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Abbott product code."
          steps:
            - name: check-regulatory
              type: call
              call: veeva-vault.get-clearance-status
              with:
                product_code: "{{product_code}}"
            - name: check-supply-chain
              type: call
              call: sap-erp.get-material-availability
              with:
                material: "{{product_code}}"
            - name: check-training
              type: call
              call: workday.get-training-status
              with:
                course: "product-launch-{{product_code}}"
            - name: report-readiness
              type: call
              call: msteams.send-message
              with:
                channel_id: "product-launches"
                text: "Launch readiness for {{product_code}}: Regulatory: {{check-regulatory.status}}. Supply: {{check-supply-chain.availability}}. Training: {{check-training.completion_rate}}% complete."
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: clearance
          path: "/objects/clearance__c"
          operations:
            - name: get-clearance-status
              method: GET
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: availability
          path: "/A_MaterialAvailability('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material-availability
              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: training
          path: "/training/compliance"
          operations:
            - name: get-training-status
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Manages a formula change for nutrition products by creating a change control, scheduling impact assessment, updating SAP BOM, and notifying regulatory and quality teams.

naftiko: "0.5"
info:
  label: "Nutrition Formula Change Control Orchestration"
  description: "Manages a formula change for nutrition products by creating a change control, scheduling impact assessment, updating SAP BOM, and notifying regulatory and quality teams."
  tags:
    - manufacturing
    - quality
    - regulatory
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: formula-change
      port: 8080
      tools:
        - name: initiate-formula-change
          description: "Given a product code and change description, create a change control, assess impact, update BOM, and notify stakeholders. Use when R&D or quality initiates a nutrition formula change."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Abbott nutrition product code."
            - name: change_description
              in: body
              type: string
              description: "Description of the formula change."
          steps:
            - name: create-change-control
              type: call
              call: servicenow.create-change
              with:
                short_description: "Formula change: {{product_code}} - {{change_description}}"
                category: "manufacturing"
                assigned_group: "Quality_Change_Control"
            - name: check-bom
              type: call
              call: sap-erp.get-bom
              with:
                material: "{{product_code}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-message
              with:
                channel_id: "nutrition-quality"
                text: "Formula change initiated for {{product_code}}: {{change_description}}. Change control: {{create-change-control.number}}. Current BOM components: {{check-bom.component_count}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_BOM_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bom
          path: "/A_BillOfMaterial('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-bom
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves Okta group membership for privileged groups, generates an access certification report in Power BI, and emails it to the security team for review.

naftiko: "0.5"
info:
  label: "Okta Quarterly Access Certification"
  description: "Retrieves Okta group membership for privileged groups, generates an access certification report in Power BI, and emails it to the security team for review."
  tags:
    - identity
    - security
    - okta
    - compliance
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: access-certification
      port: 8080
      tools:
        - name: run-access-certification
          description: "Given an Okta group ID and Power BI dataset ID, pull current group membership, trigger a Power BI report refresh, and email the access certification report to the security team. Use quarterly for privileged access compliance reviews."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "Okta group ID to certify."
            - name: pbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for access reports."
            - name: security_team_email
              in: body
              type: string
              description: "Security team email for the certification report."
          steps:
            - name: get-group-members
              type: call
              call: okta-cert.get-group-users
              with:
                group_id: "{{okta_group_id}}"
            - name: refresh-access-pbi
              type: call
              call: powerbi-cert.trigger-refresh
              with:
                dataset_id: "{{pbi_dataset_id}}"
            - name: send-cert-email
              type: call
              call: msgraph-cert.send-email
              with:
                to: "{{security_team_email}}"
                subject: "Quarterly Access Certification — Okta Group {{okta_group_id}}"
                body: "Group {{okta_group_id}} has {{get-group-members.total_count}} members. Review in Power BI and certify or revoke access."
  consumes:
    - type: http
      namespace: okta-cert
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: group-users
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-users
              method: GET
    - type: http
      namespace: powerbi-cert
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph-cert
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/users/{{sender}}/sendMail"
          operations:
            - name: send-email
              method: POST

Retrieves an Okta user profile by email, returning account status, last login, MFA enrollment, and assigned applications.

naftiko: "0.5"
info:
  label: "Okta User Status Check"
  description: "Retrieves an Okta user profile by email, returning account status, last login, MFA enrollment, and assigned applications."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity-management
      port: 8080
      tools:
        - name: get-user-status
          description: "Given an employee email address, return the Okta account status, last login timestamp, and MFA enrollment state. Use when IT security needs to verify user access status."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Employee email address."
          call: okta.get-user
          with:
            login: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
            - name: mfa_enrolled
              type: boolean
              mapping: "$.mfa_enrolled"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://abbott.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET

Uses OpenAI to classify a regulatory document by type, region, and product category, returning structured metadata for filing.

naftiko: "0.5"
info:
  label: "OpenAI Regulatory Document Classification"
  description: "Uses OpenAI to classify a regulatory document by type, region, and product category, returning structured metadata for filing."
  tags:
    - regulatory
    - ai
    - openai
capability:
  exposes:
    - type: mcp
      namespace: doc-classification
      port: 8080
      tools:
        - name: classify-regulatory-document
          description: "Given document text, classify the document type, applicable region, and product category using AI. Use when regulatory teams need to categorize incoming documents."
          inputParameters:
            - name: document_text
              in: body
              type: string
              description: "Text content of the regulatory document."
          call: openai.create-completion
          with:
            model: "gpt-4"
            prompt: "Classify this regulatory document: {{document_text}}"
          outputParameters:
            - name: document_type
              type: string
              mapping: "$.choices[0].message.content"
  consumes:
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST

Retrieves the current on-call engineer for a PagerDuty schedule, returning name, contact info, and rotation end time.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty schedule, returning name, contact info, and rotation end time."
  tags:
    - it
    - observability
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: on-call
      port: 8080
      tools:
        - name: get-on-call-engineer
          description: "Given a PagerDuty schedule ID, return the currently on-call engineer name, email, and rotation end time. Use when teams need to identify who is on call."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule identifier."
          call: pagerduty.get-on-call
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: engineer_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: email
              type: string
              mapping: "$.oncalls[0].user.email"
            - name: rotation_end
              type: string
              mapping: "$.oncalls[0].end"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls?schedule_ids[]={{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-on-call
              method: GET

Generates a post-market surveillance report by aggregating complaint data, adverse event reports, and field actions from multiple systems into a consolidated regulatory report.

naftiko: "0.5"
info:
  label: "Post-Market Surveillance Report Orchestration"
  description: "Generates a post-market surveillance report by aggregating complaint data, adverse event reports, and field actions from multiple systems into a consolidated regulatory report."
  tags:
    - regulatory
    - quality
    - safety
    - snowflake
    - salesforce
    - veeva-vault
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pms-reporting
      port: 8080
      tools:
        - name: generate-pms-report
          description: "Given a product code and reporting period, aggregate complaints, adverse events, and field actions into a post-market surveillance report. Use when regulatory affairs prepares periodic safety reports."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Abbott product code."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period, e.g. 'Q1-2026'."
          steps:
            - name: get-complaint-data
              type: call
              call: snowflake.execute-query
              with:
                query_name: "pms_complaint_summary"
                params: "{{product_code}},{{reporting_period}}"
            - name: get-adverse-events
              type: call
              call: snowflake.execute-query
              with:
                query_name: "pms_adverse_event_summary"
                params: "{{product_code}},{{reporting_period}}"
            - name: create-report
              type: call
              call: veeva-vault.create-document
              with:
                doc_type: "pms_report"
                product_code: "{{product_code}}"
                period: "{{reporting_period}}"
            - name: notify-regulatory
              type: call
              call: msteams.send-message
              with:
                channel_id: "regulatory-safety"
                text: "PMS report generated for {{product_code}} ({{reporting_period}}). Complaints: {{get-complaint-data.total}}. Adverse events: {{get-adverse-events.total}}. Document: {{create-report.document_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.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-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: documents
          path: "/objects/documents"
          operations:
            - name: create-document
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a refresh of the diagnostics division revenue dashboard in Power BI and returns the refresh status.

naftiko: "0.5"
info:
  label: "Power BI Diagnostics Revenue Refresh"
  description: "Triggers a refresh of the diagnostics division revenue dashboard in Power BI and returns the refresh status."
  tags:
    - analytics
    - finance
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: refresh-diagnostics-dashboard
          description: "Trigger a dataset refresh for the diagnostics revenue Power BI dashboard and return the refresh status. Use when finance needs updated revenue figures."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset identifier."
          call: powerbi.trigger-refresh
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_id
              type: string
              mapping: "$.id"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Triggers a Power BI dataset refresh for the executive KPI dashboard and posts a confirmation to the leadership Teams channel.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the executive KPI dashboard and posts a confirmation to the leadership Teams channel."
  tags:
    - analytics
    - power-bi
    - reporting
    - executive
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: refresh-executive-dashboard
          description: "Trigger a Power BI dataset refresh for the executive KPI dashboard and notify the leadership Teams channel when complete. Use each morning before leadership stand-ups to ensure dashboards reflect current data."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the executive KPI dashboard."
            - name: leadership_channel_id
              in: body
              type: string
              description: "Leadership Teams channel ID."
          steps:
            - name: refresh-pbi
              type: call
              call: powerbi-exec.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-leadership
              type: call
              call: msteams-exec.post-channel-message
              with:
                channel_id: "{{leadership_channel_id}}"
                text: "Executive KPI dashboard refresh triggered (dataset {{dataset_id}}). Refresh ID: {{refresh-pbi.refreshId}}"
  consumes:
    - type: http
      namespace: powerbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams-exec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Manages a product development phase gate review by collecting deliverable status, scheduling the review meeting, generating the gate package, and notifying the review board.

naftiko: "0.5"
info:
  label: "Product Lifecycle Phase Gate Orchestration"
  description: "Manages a product development phase gate review by collecting deliverable status, scheduling the review meeting, generating the gate package, and notifying the review board."
  tags:
    - rd
    - quality
    - manufacturing
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: phase-gate
      port: 8080
      tools:
        - name: execute-phase-gate-review
          description: "Given a project key and gate number, collect deliverable status, schedule the review, build the gate package, and notify the board. Use when R&D project management prepares for a phase gate review."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: gate_number
              in: body
              type: string
              description: "Phase gate number, e.g. 'Gate-3'."
          steps:
            - name: get-deliverable-status
              type: call
              call: jira.search-issues
              with:
                jql: "project={{project_key}} AND labels={{gate_number}}"
            - name: create-review-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Phase gate review: {{project_key}} {{gate_number}}"
                category: "rd_review"
                assigned_group: "Product_Review_Board"
            - name: notify-board
              type: call
              call: msteams.send-message
              with:
                channel_id: "product-review-board"
                text: "{{gate_number}} review for {{project_key}} scheduled. Deliverables: {{get-deliverable-status.total}} total, {{get-deliverable-status.done}} complete. Review task: {{create-review-task.number}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a manufacturing quality deviation is detected, creates a ServiceNow quality incident, opens a Jira corrective action task, and notifies the quality assurance team in Teams.

naftiko: "0.5"
info:
  label: "Product Quality Deviation Incident"
  description: "When a manufacturing quality deviation is detected, creates a ServiceNow quality incident, opens a Jira corrective action task, and notifies the quality assurance team in Teams."
  tags:
    - quality
    - manufacturing
    - servicenow
    - jira
    - healthcare
capability:
  exposes:
    - type: mcp
      namespace: quality-ops
      port: 8080
      tools:
        - name: handle-quality-deviation
          description: "Given a product lot number, deviation type, and site ID, create a ServiceNow quality incident record, open a Jira CAPA task for the quality engineering team, and alert the QA Teams channel. Use when a manufacturing deviation is identified during production or QC review."
          inputParameters:
            - name: lot_number
              in: body
              type: string
              description: "Product lot number where the deviation was detected."
            - name: deviation_type
              in: body
              type: string
              description: "Type of deviation, e.g. 'out-of-specification', 'process-deviation'."
            - name: site_id
              in: body
              type: string
              description: "Manufacturing site identifier."
            - name: qa_channel_id
              in: body
              type: string
              description: "Quality assurance Teams channel ID."
          steps:
            - name: create-quality-incident
              type: call
              call: servicenow-quality.create-incident
              with:
                short_description: "Quality deviation — Lot {{lot_number}} — {{deviation_type}}"
                category: "quality_deviation"
                site_id: "{{site_id}}"
            - name: create-capa
              type: call
              call: jira-quality.create-issue
              with:
                project_key: "CAPA"
                issuetype: "Task"
                summary: "CAPA for deviation — Lot {{lot_number}} at {{site_id}}"
                description: "Deviation type: {{deviation_type}} | ServiceNow INC: {{create-quality-incident.number}}"
            - name: alert-qa-team
              type: call
              call: msteams-quality.post-channel-message
              with:
                channel_id: "{{qa_channel_id}}"
                text: "Quality Deviation: Lot {{lot_number}} at {{site_id}} — {{deviation_type}} | INC: {{create-quality-incident.number}} | CAPA Jira: {{create-capa.key}}"
  consumes:
    - type: http
      namespace: servicenow-quality
      baseUri: "https://abbott.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: jira-quality
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-quality
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Orchestrates a medical device product registration by assembling documents from Veeva Vault, creating the submission package, filing in the regulatory system, and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Product Registration Submission Orchestration"
  description: "Orchestrates a medical device product registration by assembling documents from Veeva Vault, creating the submission package, filing in the regulatory system, and notifying stakeholders."
  tags:
    - regulatory
    - quality
    - veeva-vault
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-registration
      port: 8080
      tools:
        - name: submit-product-registration
          description: "Given a product code and target market, assemble regulatory documents, create the submission, file it, and notify the team. Use when regulatory affairs initiates a new market registration."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Abbott product code."
            - name: target_market
              in: body
              type: string
              description: "Target market country code, e.g. 'EU', 'JP', 'BR'."
          steps:
            - name: gather-documents
              type: call
              call: veeva-vault.query-documents
              with:
                product_code: "{{product_code}}"
                doc_type: "registration"
            - name: create-submission
              type: call
              call: veeva-vault.create-submission
              with:
                product_code: "{{product_code}}"
                market: "{{target_market}}"
                document_ids: "{{gather-documents.document_ids}}"
            - name: create-tracking-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Product registration: {{product_code}} for {{target_market}}"
                category: "regulatory_submission"
                assigned_group: "Regulatory_Affairs"
                reference: "{{create-submission.submission_id}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "regulatory-submissions"
                text: "Product registration submitted for {{product_code}} in {{target_market}}. Submission: {{create-submission.submission_id}}. Task: {{create-tracking-task.number}}"
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: documents
          path: "/query"
          operations:
            - name: query-documents
              method: POST
        - name: submissions
          path: "/objects/submission__c"
          operations:
            - name: create-submission
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves corrective and preventive action record details from the quality management system by CAPA number.

naftiko: "0.5"
info:
  label: "Quality CAPA Status Lookup"
  description: "Retrieves corrective and preventive action record details from the quality management system by CAPA number."
  tags:
    - quality
    - compliance
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: quality-capa
      port: 8080
      tools:
        - name: get-capa-status
          description: "Given a CAPA number, return the current phase, root cause category, due date, and responsible owner. Use when quality teams need to track CAPA progress."
          inputParameters:
            - name: capa_number
              in: body
              type: string
              description: "CAPA record number."
          call: servicenow.get-capa
          with:
            number: "{{capa_number}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.result.phase"
            - name: root_cause
              type: string
              mapping: "$.result.root_cause_category"
            - name: due_date
              type: string
              mapping: "$.result.due_date"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: capa-records
          path: "/table/u_capa?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-capa
              method: GET

When a quality deviation is created, assigns an investigator, gathers batch data from SAP, creates investigation tasks, and sets review deadlines.

naftiko: "0.5"
info:
  label: "Quality Deviation Investigation Orchestration"
  description: "When a quality deviation is created, assigns an investigator, gathers batch data from SAP, creates investigation tasks, and sets review deadlines."
  tags:
    - quality
    - manufacturing
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: deviation-investigation
      port: 8080
      tools:
        - name: initiate-deviation-investigation
          description: "Given a deviation number, assign an investigator, pull related batch data, create investigation tasks, and notify stakeholders. Use when quality assurance escalates a deviation for investigation."
          inputParameters:
            - name: deviation_number
              in: body
              type: string
              description: "ServiceNow deviation record number."
          steps:
            - name: get-deviation
              type: call
              call: servicenow.get-deviation
              with:
                number: "{{deviation_number}}"
            - name: get-batch-data
              type: call
              call: sap-erp.get-batch-record
              with:
                batch_id: "{{get-deviation.batch_number}}"
            - name: create-investigation-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Investigate deviation {{deviation_number}} - Batch {{get-deviation.batch_number}}"
                category: "quality_investigation"
                assigned_group: "Quality_Investigation"
                priority: "2"
            - name: notify-quality
              type: call
              call: msteams.send-message
              with:
                channel_id: "quality-investigations"
                text: "Investigation initiated for deviation {{deviation_number}}. Batch: {{get-deviation.batch_number}}. Yield: {{get-batch-data.yield_percentage}}%. Task: {{create-investigation-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: deviations
          path: "/table/u_deviation"
          operations:
            - name: get-deviation
              method: GET
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batch-records
          path: "/A_BatchRecord('{{batch_id}}')"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-batch-record
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Assembles QBR data by pulling financial results from SAP, pipeline data from Salesforce, headcount from Workday, and generating a consolidated Snowflake report.

naftiko: "0.5"
info:
  label: "Quarterly Business Review Data Orchestration"
  description: "Assembles QBR data by pulling financial results from SAP, pipeline data from Salesforce, headcount from Workday, and generating a consolidated Snowflake report."
  tags:
    - finance
    - sales
    - hr
    - sap
    - salesforce
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: qbr-data
      port: 8080
      tools:
        - name: assemble-qbr-data
          description: "Given a division code and fiscal quarter, pull financials, pipeline, headcount, and generate a consolidated QBR report. Use when finance prepares quarterly business reviews."
          inputParameters:
            - name: division_code
              in: body
              type: string
              description: "Abbott division code."
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter, e.g. 'Q1-2026'."
          steps:
            - name: get-financials
              type: call
              call: sap-erp.get-pl-summary
              with:
                division: "{{division_code}}"
                quarter: "{{fiscal_quarter}}"
            - name: get-pipeline
              type: call
              call: salesforce.get-pipeline-summary
              with:
                division: "{{division_code}}"
                quarter: "{{fiscal_quarter}}"
            - name: get-headcount
              type: call
              call: workday.get-headcount
              with:
                division: "{{division_code}}"
            - name: generate-report
              type: call
              call: snowflake.execute-query
              with:
                query_name: "qbr_consolidated_report"
                params: "{{division_code}},{{fiscal_quarter}},{{get-financials.revenue}},{{get-pipeline.pipeline_value}},{{get-headcount.total}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FI_PL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pl-summary
          path: "/A_PLSummary"
          operations:
            - name: get-pl-summary
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pipeline
          path: "/analytics/reports/pipeline_summary"
          operations:
            - name: get-pipeline-summary
              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: headcount
          path: "/headcount"
          operations:
            - name: get-headcount
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When an R&D experiment completes, ingests results into Snowflake, triggers quality validation, generates summary statistics, and notifies the research team.

naftiko: "0.5"
info:
  label: "R&D Experiment Data Pipeline Orchestration"
  description: "When an R&D experiment completes, ingests results into Snowflake, triggers quality validation, generates summary statistics, and notifies the research team."
  tags:
    - rd
    - analytics
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rd-data-pipeline
      port: 8080
      tools:
        - name: process-experiment-results
          description: "Given an experiment ID and data file path, ingest results, validate quality, generate statistics, and notify researchers. Use when laboratory automation completes an experiment run."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "R&D experiment identifier."
            - name: data_path
              in: body
              type: string
              description: "S3 path to the experiment results file."
          steps:
            - name: ingest-data
              type: call
              call: snowflake.execute-query
              with:
                query_name: "ingest_experiment_data"
                params: "{{experiment_id}},{{data_path}}"
            - name: validate-quality
              type: call
              call: snowflake.execute-query
              with:
                query_name: "validate_experiment_quality"
                params: "{{experiment_id}}"
            - name: generate-statistics
              type: call
              call: snowflake.execute-query
              with:
                query_name: "experiment_summary_stats"
                params: "{{experiment_id}}"
            - name: notify-researchers
              type: call
              call: msteams.send-message
              with:
                channel_id: "rd-lab-results"
                text: "Experiment {{experiment_id}} processed. Quality: {{validate-quality.pass_rate}}% pass rate. Mean result: {{generate-statistics.mean_value}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a product recall is initiated, creates a ServiceNow high-priority incident, notifies the recall coordinator team in Teams, and opens a Salesforce case for customer communication tracking.

naftiko: "0.5"
info:
  label: "Recall Management Notification Workflow"
  description: "When a product recall is initiated, creates a ServiceNow high-priority incident, notifies the recall coordinator team in Teams, and opens a Salesforce case for customer communication tracking."
  tags:
    - regulatory
    - recall
    - servicenow
    - salesforce
    - healthcare
capability:
  exposes:
    - type: mcp
      namespace: recall-ops
      port: 8080
      tools:
        - name: initiate-recall-workflow
          description: "Given a product lot number, recall class, and affected market, create a P1 ServiceNow recall incident, open a Salesforce case for customer communication tracking, and notify the recall coordinator Teams channel. Use when a product recall decision is made."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "Product name subject to recall."
            - name: lot_numbers
              in: body
              type: string
              description: "Comma-separated list of affected lot numbers."
            - name: recall_class
              in: body
              type: string
              description: "FDA recall classification: I, II, or III."
            - name: affected_markets
              in: body
              type: string
              description: "Comma-separated list of affected markets/countries."
            - name: recall_channel_id
              in: body
              type: string
              description: "Recall coordinator Teams channel ID."
          steps:
            - name: create-recall-incident
              type: call
              call: servicenow-recall.create-incident
              with:
                short_description: "Product Recall — {{product_name}} — Class {{recall_class}}"
                description: "Lots: {{lot_numbers}} | Markets: {{affected_markets}}"
                priority: "1"
                category: "Product_Recall"
            - name: create-cx-case
              type: call
              call: salesforce-recall.create-case
              with:
                subject: "Recall notification — {{product_name}} Class {{recall_class}}"
                description: "Recall initiated. Lots: {{lot_numbers}}. INC: {{create-recall-incident.number}}"
                priority: "High"
            - name: notify-recall-team
              type: call
              call: msteams-recall.post-channel-message
              with:
                channel_id: "{{recall_channel_id}}"
                text: "PRODUCT RECALL: {{product_name}} Class {{recall_class}} | Lots: {{lot_numbers}} | Markets: {{affected_markets}} | INC: {{create-recall-incident.number}} | Case: {{create-cx-case.case_number}}"
  consumes:
    - type: http
      namespace: servicenow-recall
      baseUri: "https://abbott.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: salesforce-recall
      baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams-recall
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Prepares for a regulatory audit by gathering open CAPAs, pending deviations, training compliance status, and generating a consolidated readiness report.

naftiko: "0.5"
info:
  label: "Regulatory Audit Preparation Orchestration"
  description: "Prepares for a regulatory audit by gathering open CAPAs, pending deviations, training compliance status, and generating a consolidated readiness report."
  tags:
    - regulatory
    - quality
    - compliance
    - servicenow
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: audit-preparation
      port: 8080
      tools:
        - name: prepare-audit-package
          description: "Given an audit type and facility code, gather open CAPAs, pending deviations, training compliance metrics, and generate a readiness report. Use when quality assurance prepares for FDA or ISO audits."
          inputParameters:
            - name: audit_type
              in: body
              type: string
              description: "Type of audit: FDA, ISO, internal."
            - name: facility_code
              in: body
              type: string
              description: "Manufacturing facility code."
          steps:
            - name: get-open-capas
              type: call
              call: servicenow.query-capas
              with:
                facility: "{{facility_code}}"
                status: "open"
            - name: get-deviations
              type: call
              call: servicenow.query-deviations
              with:
                facility: "{{facility_code}}"
                status: "pending"
            - name: get-training-compliance
              type: call
              call: workday.get-training-status
              with:
                facility: "{{facility_code}}"
                compliance_type: "gmp"
            - name: generate-report
              type: call
              call: snowflake.execute-query
              with:
                query_name: "audit_readiness_report"
                params: "{{facility_code}},{{audit_type}},{{get-open-capas.count}},{{get-deviations.count}},{{get-training-compliance.compliance_rate}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: capas
          path: "/table/u_capa"
          operations:
            - name: query-capas
              method: GET
        - name: deviations
          path: "/table/u_deviation"
          operations:
            - name: query-deviations
              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: training
          path: "/training/compliance"
          operations:
            - name: get-training-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner details.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves a Salesforce account record by account ID, returning account name, industry, annual revenue, and owner details."
  tags:
    - sales
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-accounts
      port: 8080
      tools:
        - name: get-account
          description: "Given a Salesforce account ID, return the account name, industry, annual revenue, and account owner. Use when sales teams need quick account details."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
          call: salesforce.get-account
          with:
            id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: annual_revenue
              type: number
              mapping: "$.AnnualRevenue"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-account
              method: GET

Enriches a Salesforce healthcare customer account with ZoomInfo firmographic data and syncs the updated record to SAP for billing alignment.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Enrichment"
  description: "Enriches a Salesforce healthcare customer account with ZoomInfo firmographic data and syncs the updated record to SAP for billing alignment."
  tags:
    - crm
    - sales
    - salesforce
    - data-enrichment
    - healthcare
capability:
  exposes:
    - type: mcp
      namespace: crm-enrichment
      port: 8080
      tools:
        - name: enrich-customer-account
          description: "Given a Salesforce account ID and ZoomInfo company match key, fetch firmographic data from ZoomInfo, update the Salesforce account, and sync key fields to the SAP customer master. Use when account records need to be refreshed with current company data."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce Account record ID."
            - name: zoominfo_company_id
              in: body
              type: string
              description: "ZoomInfo company ID for firmographic lookup."
          steps:
            - name: get-firmographics
              type: call
              call: zoominfo.get-company
              with:
                company_id: "{{zoominfo_company_id}}"
            - name: update-sf-account
              type: call
              call: salesforce-acct.update-account
              with:
                account_id: "{{salesforce_account_id}}"
                employees: "{{get-firmographics.employee_count}}"
                annual_revenue: "{{get-firmographics.revenue}}"
                industry: "{{get-firmographics.industry}}"
            - name: sync-sap-customer
              type: call
              call: sap-erp-crm.update-customer
              with:
                account_id: "{{salesforce_account_id}}"
                company_name: "{{get-firmographics.company_name}}"
                industry: "{{get-firmographics.industry}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company/{{company_id}}"
          inputParameters:
            - name: company_id
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: salesforce-acct
      baseUri: "https://abbott.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: sap-erp-crm
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/BUSINESS_PARTNER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_BusinessPartner/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-customer
              method: PATCH

When a Salesforce opportunity is closed-won, creates an SAP sales order, updates the CRM record, and notifies the fulfillment team.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to Order Orchestration"
  description: "When a Salesforce opportunity is closed-won, creates an SAP sales order, updates the CRM record, and notifies the fulfillment team."
  tags:
    - sales
    - erp
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: opportunity-to-order
      port: 8080
      tools:
        - name: convert-opportunity-to-order
          description: "Given a Salesforce opportunity ID, create a sales order in SAP, update the opportunity with the order number, and notify fulfillment. Use when sales closes a deal."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: sap-erp.create-order
              with:
                customer: "{{get-opportunity.account_sap_id}}"
                material: "{{get-opportunity.product_code}}"
                quantity: "{{get-opportunity.quantity}}"
                amount: "{{get-opportunity.amount}}"
            - name: update-opportunity
              type: call
              call: salesforce.update-opportunity
              with:
                opp_id: "{{opportunity_id}}"
                sap_order_number: "{{create-sales-order.order_number}}"
            - name: notify-fulfillment
              type: call
              call: msteams.send-message
              with:
                channel_id: "order-fulfillment"
                text: "New SAP order {{create-sales-order.order_number}} from opportunity {{opportunity_id}}. Customer: {{get-opportunity.account_name}}. Amount: {{get-opportunity.amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abbott.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_SalesOrder"
          operations:
            - name: create-order
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners via Microsoft 365.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Alerts"
  description: "Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners via Microsoft 365."
  tags:
    - procurement
    - contract-management
    - sap-ariba
    - jira
    - finance
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: alert-expiring-contracts
          description: "Given a look-ahead window, fetch expiring contracts from SAP Ariba, create a Jira renewal task for each contract, and email the contract owner. Use monthly to proactively manage supplier contract renewals."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to scan for expiring contracts."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for procurement renewal tasks."
          steps:
            - name: get-expiring
              type: call
              call: ariba-renewal.get-expiring-contracts
              with:
                days_ahead: "{{days_ahead}}"
            - name: create-jira-task
              type: call
              call: jira-contracts.create-issue
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Contract renewals due within {{days_ahead}} days"
                description: "Expiring contracts: {{get-expiring.contract_ids}}"
  consumes:
    - type: http
      namespace: ariba-renewal
      baseUri: "https://openapi.ariba.com/api/contract/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          inputParameters:
            - name: days_ahead
              in: query
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: jira-contracts
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Creates a new sourcing event in SAP Ariba for competitive bidding, returning the event ID and supplier invitation status.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Creation"
  description: "Creates a new sourcing event in SAP Ariba for competitive bidding, returning the event ID and supplier invitation status."
  tags:
    - procurement
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: strategic-sourcing
      port: 8080
      tools:
        - name: create-sourcing-event
          description: "Given a sourcing category and description, create an SAP Ariba sourcing event and return the event ID. Use when procurement initiates a competitive bidding process."
          inputParameters:
            - name: category
              in: body
              type: string
              description: "Sourcing category."
            - name: description
              in: body
              type: string
              description: "Sourcing event description."
            - name: budget_amount
              in: body
              type: number
              description: "Budget amount for the sourcing event."
          call: ariba.create-event
          with:
            category: "{{category}}"
            description: "{{description}}"
            budget: "{{budget_amount}}"
          outputParameters:
            - name: event_id
              type: string
              mapping: "$.data.eventId"
            - name: status
              type: string
              mapping: "$.data.status"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing-projects/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Retrieves a travel request from SAP Concur by request ID, returning trip details, estimated cost, and approval status.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Request Lookup"
  description: "Retrieves a travel request from SAP Concur by request ID, returning trip details, estimated cost, and approval status."
  tags:
    - finance
    - travel
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: travel-management
      port: 8080
      tools:
        - name: get-travel-request
          description: "Given a Concur travel request ID, return the trip destination, dates, estimated cost, and approval status. Use when employees need travel request visibility."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "SAP Concur travel request ID."
          call: concur.get-request
          with:
            id: "{{request_id}}"
          outputParameters:
            - name: destination
              type: string
              mapping: "$.MainDestination"
            - name: start_date
              type: string
              mapping: "$.StartDate"
            - name: total_estimated_amount
              type: number
              mapping: "$.TotalEstimatedAmount"
            - name: approval_status
              type: string
              mapping: "$.ApprovalStatusName"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: requests
          path: "/travelrequest/requests/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-request
              method: GET

Retrieves budget vs actual figures for an SAP cost center, returning planned budget, actual spend, and variance.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Lookup"
  description: "Retrieves budget vs actual figures for an SAP cost center, returning planned budget, actual spend, and variance."
  tags:
    - finance
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: cost-center-budget
      port: 8080
      tools:
        - name: get-cost-center-budget
          description: "Given a cost center code and fiscal period, return the planned budget, actual spend, and variance. Use when finance needs budget performance data."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "SAP cost center code."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period, e.g. '2026-03'."
          call: sap-erp.get-budget
          with:
            cost_center: "{{cost_center}}"
            period: "{{fiscal_period}}"
          outputParameters:
            - name: planned_budget
              type: number
              mapping: "$.d.PlannedAmount"
            - name: actual_spend
              type: number
              mapping: "$.d.ActualAmount"
            - name: variance
              type: number
              mapping: "$.d.Variance"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FI_CO_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',Period='{{period}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: period
              in: path
          operations:
            - name: get-budget
              method: GET

Posts a goods receipt in SAP for an inbound delivery, updating inventory and triggering quality inspection if required.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts a goods receipt in SAP for an inbound delivery, updating inventory and triggering quality inspection if required."
  tags:
    - supply-chain
    - manufacturing
    - sap
capability:
  exposes:
    - type: mcp
      namespace: goods-receipt
      port: 8080
      tools:
        - name: post-goods-receipt
          description: "Given a delivery number, post the goods receipt in SAP and return the material document number. Use when warehouse teams confirm receipt of materials."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP inbound delivery number."
          call: sap-erp.post-gr
          with:
            delivery: "{{delivery_number}}"
          outputParameters:
            - name: material_document
              type: string
              mapping: "$.d.MaterialDocument"
            - name: posting_date
              type: string
              mapping: "$.d.PostingDate"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_GR_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: goods-receipts
          path: "/A_GoodsReceipt"
          operations:
            - name: post-gr
              method: POST

Queries SAP for current inventory levels of a material at a specified plant, returning available stock, reserved quantity, and reorder status.

naftiko: "0.5"
info:
  label: "SAP Inventory Level Check"
  description: "Queries SAP for current inventory levels of a material at a specified plant, returning available stock, reserved quantity, and reorder status."
  tags:
    - supply-chain
    - manufacturing
    - sap
capability:
  exposes:
    - type: mcp
      namespace: inventory-management
      port: 8080
      tools:
        - name: get-inventory-level
          description: "Given a material number and plant code, return the unrestricted stock, reserved quantity, and reorder point status. Use when supply chain needs to check stock availability."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code, e.g. '1000'."
          call: sap-erp.get-material-stock
          with:
            material: "{{material_number}}"
            plant: "{{plant_code}}"
          outputParameters:
            - name: unrestricted_stock
              type: number
              mapping: "$.d.UnrestrictedStock"
            - name: reserved_quantity
              type: number
              mapping: "$.d.ReservedQuantity"
            - name: reorder_point
              type: number
              mapping: "$.d.ReorderPoint"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MaterialStock(Material='{{material}}',Plant='{{plant}}')"
          inputParameters:
            - name: material
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET

Creates a preventive maintenance order in SAP Plant Maintenance for manufacturing equipment.

naftiko: "0.5"
info:
  label: "SAP Maintenance Order Creation"
  description: "Creates a preventive maintenance order in SAP Plant Maintenance for manufacturing equipment."
  tags:
    - manufacturing
    - maintenance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: create-maintenance-order
          description: "Given equipment ID and maintenance type, create a PM order in SAP and return the order number. Use when maintenance schedules trigger planned equipment servicing."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "SAP equipment ID."
            - name: maintenance_type
              in: body
              type: string
              description: "Maintenance type: preventive, corrective, calibration."
          call: sap-erp.create-pm-order
          with:
            equipment: "{{equipment_id}}"
            order_type: "{{maintenance_type}}"
          outputParameters:
            - name: order_number
              type: string
              mapping: "$.d.MaintenanceOrder"
            - name: planned_date
              type: string
              mapping: "$.d.PlannedStartDate"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PM_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-order
              method: POST

Retrieves material master data from SAP by material number, returning description, unit of measure, material group, and plant assignments.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP by material number, returning description, unit of measure, material group, and plant assignments."
  tags:
    - supply-chain
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: material-master
      port: 8080
      tools:
        - name: get-material-master
          description: "Given a SAP material number, return the material description, base unit of measure, material group, and assigned plants. Use when supply chain needs material details."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: sap-erp.get-material
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnitOfMeasure"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material
              method: GET

Retrieves a production order from SAP by order number, returning status, planned quantity, actual output, and scheduled completion date.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Lookup"
  description: "Retrieves a production order from SAP by order number, returning status, planned quantity, actual output, and scheduled completion date."
  tags:
    - manufacturing
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: production-orders
      port: 8080
      tools:
        - name: get-production-order
          description: "Given a SAP production order number, return the order status, planned vs actual quantity, and scheduled dates. Use when manufacturing planners need production order visibility."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "SAP production order number."
          call: sap-erp.get-prod-order
          with:
            order: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: planned_quantity
              type: number
              mapping: "$.d.PlannedQuantity"
            - name: actual_output
              type: number
              mapping: "$.d.ActualQuantity"
            - name: scheduled_end
              type: string
              mapping: "$.d.ScheduledEndDate"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order}}')"
          inputParameters:
            - name: order
              in: path
          operations:
            - name: get-prod-order
              method: GET

Looks up an SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status Lookup"
  description: "Looks up an SAP S/4HANA purchase order by number and returns header status, vendor, total value, and open line items."
  tags:
    - finance
    - procurement
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO header status, vendor name, total amount, and open line items. Use when procurement teams need to check the status of an outstanding PO."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number, e.g. '4500012345'."
          call: sap-erp.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves quality inspection lot details from SAP by inspection lot number, returning inspection results, usage decision, and defect counts.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Lookup"
  description: "Retrieves quality inspection lot details from SAP by inspection lot number, returning inspection results, usage decision, and defect counts."
  tags:
    - quality
    - manufacturing
    - sap
capability:
  exposes:
    - type: mcp
      namespace: quality-inspection
      port: 8080
      tools:
        - name: get-inspection-lot
          description: "Given an SAP inspection lot number, return the inspection status, usage decision, and defect counts. Use when quality teams need to review inspection results."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "SAP inspection lot number."
          call: sap-erp.get-inspection
          with:
            lot: "{{inspection_lot}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.InspectionLotStatus"
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
            - name: defect_count
              type: integer
              mapping: "$.d.DefectCount"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{lot}}')"
          inputParameters:
            - name: lot
              in: path
          operations:
            - name: get-inspection
              method: GET

Queries SAP for vendor payment status by invoice number, returning payment date, amount, and clearing document.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Status Lookup"
  description: "Queries SAP for vendor payment status by invoice number, returning payment date, amount, and clearing document."
  tags:
    - finance
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: vendor-payments
      port: 8080
      tools:
        - name: get-payment-status
          description: "Given an SAP invoice number, return the payment status, payment date, amount paid, and clearing document number. Use when accounts payable needs to verify vendor payment status."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice document number."
          call: sap-erp.get-invoice-payment
          with:
            invoice: "{{invoice_number}}"
          outputParameters:
            - name: payment_status
              type: string
              mapping: "$.d.PaymentStatus"
            - name: payment_date
              type: string
              mapping: "$.d.PaymentDate"
            - name: amount_paid
              type: number
              mapping: "$.d.AmountPaid"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/FI_AP_INVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_Invoice('{{invoice}}')/payments"
          inputParameters:
            - name: invoice
              in: path
          operations:
            - name: get-invoice-payment
              method: GET

When a critical security alert fires, creates a security incident, isolates the affected endpoint, notifies the SOC team, and logs the event for compliance.

naftiko: "0.5"
info:
  label: "Security Incident Response Orchestration"
  description: "When a critical security alert fires, creates a security incident, isolates the affected endpoint, notifies the SOC team, and logs the event for compliance."
  tags:
    - security
    - it
    - crowdstrike
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-incident-response
      port: 8080
      tools:
        - name: respond-to-security-incident
          description: "Given a CrowdStrike detection ID and hostname, create a security incident, isolate the endpoint, notify the SOC, and log for compliance. Use when SOC analysts confirm a real threat."
          inputParameters:
            - name: detection_id
              in: body
              type: string
              description: "CrowdStrike detection ID."
            - name: hostname
              in: body
              type: string
              description: "Affected endpoint hostname."
          steps:
            - name: create-sec-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Security incident: threat on {{hostname}}"
                category: "security"
                priority: "1"
                assigned_group: "SOC"
            - name: isolate-endpoint
              type: call
              call: crowdstrike.contain-host
              with:
                hostname: "{{hostname}}"
            - name: notify-soc
              type: call
              call: msteams.send-message
              with:
                channel_id: "security-ops-center"
                text: "CRITICAL: Security incident {{create-sec-incident.number}} - Host {{hostname}} isolated. Detection: {{detection_id}}. Containment status: {{isolate-endpoint.status}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: hosts
          path: "/devices/entities/host-actions/v2"
          operations:
            - name: contain-host
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current status, priority, and assignment details for a ServiceNow incident by ticket number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status, priority, and assignment details for a ServiceNow incident by ticket number."
  tags:
    - it
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-incidents
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, return the current state, priority, assigned group, and short description. Use when IT support needs to check ticket status."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number, e.g. 'INC0012345'."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Searches Abbott SharePoint document libraries by keyword, returning matching document titles, authors, and URLs.

naftiko: "0.5"
info:
  label: "SharePoint Document Library Search"
  description: "Searches Abbott SharePoint document libraries by keyword, returning matching document titles, authors, and URLs."
  tags:
    - documentation
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-search
      port: 8080
      tools:
        - name: search-sharepoint-docs
          description: "Given a search query and optional site name, return matching documents with titles, authors, and links. Use when employees need to find documents across SharePoint."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keywords."
            - name: site_name
              in: body
              type: string
              description: "Optional SharePoint site name to scope the search."
          call: sharepoint.search
          with:
            querytext: "{{query}}"
            site: "{{site_name}}"
          outputParameters:
            - name: result_count
              type: integer
              mapping: "$.PrimaryQueryResult.RelevantResults.TotalRows"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://abbott.sharepoint.com/_api"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: search
          path: "/search/query?querytext='{{querytext}}'"
          inputParameters:
            - name: querytext
              in: query
          operations:
            - name: search
              method: GET

Executes a predefined clinical analytics query in Snowflake, returning aggregated patient outcome metrics for a given study.

naftiko: "0.5"
info:
  label: "Snowflake Clinical Data Query"
  description: "Executes a predefined clinical analytics query in Snowflake, returning aggregated patient outcome metrics for a given study."
  tags:
    - clinical
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clinical-analytics
      port: 8080
      tools:
        - name: query-clinical-metrics
          description: "Given a study ID, return aggregated patient outcome metrics from the clinical data warehouse. Use when clinical data scientists need study-level analytics."
          inputParameters:
            - name: study_id
              in: body
              type: string
              description: "Clinical study identifier."
          call: snowflake.execute-query
          with:
            query_name: "clinical_outcomes_summary"
            params: "{{study_id}}"
          outputParameters:
            - name: total_patients
              type: integer
              mapping: "$.data[0].total_patients"
            - name: primary_endpoint_met
              type: boolean
              mapping: "$.data[0].primary_endpoint_met"
            - name: adverse_event_rate
              type: number
              mapping: "$.data[0].ae_rate"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Monitors Snowflake data pipeline task failures for the clinical and commercial data warehouse, logs anomalies to Datadog, and creates Jira tickets for the data engineering team.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Monitoring"
  description: "Monitors Snowflake data pipeline task failures for the clinical and commercial data warehouse, logs anomalies to Datadog, and creates Jira tickets for the data engineering team."
  tags:
    - data
    - snowflake
    - datadog
    - analytics
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: check-data-pipeline-health
          description: "Query Snowflake task execution history for failures, log each failure as a Datadog error event, and open a Jira data engineering ticket for any pipeline that has failed consecutively. Use daily to verify Abbott's clinical and commercial data pipelines are healthy."
          inputParameters:
            - name: lookback_hours
              in: body
              type: integer
              description: "Hours of pipeline history to scan for failures."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for data engineering tickets."
          steps:
            - name: get-failed-tasks
              type: call
              call: snowflake.get-task-history
              with:
                lookback_hours: "{{lookback_hours}}"
                state: "FAILED"
            - name: log-to-datadog
              type: call
              call: datadog-dq.create-event
              with:
                title: "Snowflake pipeline failures"
                text: "Failed tasks: {{get-failed-tasks.task_names}}"
                alert_type: "error"
            - name: create-jira-ticket
              type: call
              call: jira-data.create-issue
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Pipeline failures — {{get-failed-tasks.task_count}} Snowflake tasks"
                description: "Tasks: {{get-failed-tasks.task_names}} | Datadog: {{log-to-datadog.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/CLINICAL_DW/schemas/PUBLIC/tasks/history"
          inputParameters:
            - name: lookback_hours
              in: query
            - name: state
              in: query
          operations:
            - name: get-task-history
              method: GET
    - type: http
      namespace: datadog-dq
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira-data
      baseUri: "https://abbott.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Validates incoming SAP Ariba invoices against open purchase orders and routes exceptions to the accounts payable team for resolution.

naftiko: "0.5"
info:
  label: "Supplier Ariba Invoice Validation and Approval"
  description: "Validates incoming SAP Ariba invoices against open purchase orders and routes exceptions to the accounts payable team for resolution."
  tags:
    - finance
    - procurement
    - sap-ariba
    - accounts-payable
    - erp
capability:
  exposes:
    - type: mcp
      namespace: ap-procurement
      port: 8080
      tools:
        - name: validate-supplier-invoice
          description: "Given an SAP Ariba invoice ID and corresponding PO number, retrieve both documents, compare totals, and create a ServiceNow approval task if a mismatch is detected. Use when processing incoming supplier invoices requiring three-way match validation."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "SAP Ariba invoice ID."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number for three-way match."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap-po.get-purchase-order
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: servicenow-ap.create-task
              with:
                short_description: "Invoice validation: {{invoice_id}} vs PO {{po_number}}"
                description: "Invoice total: {{get-invoice.total_amount}} | PO total: {{get-po.total_amount}} | Vendor: {{get-invoice.vendor_name}}"
                assigned_group: "AP_Approvals"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-po
      baseUri: "https://abbott-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-purchase-order
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://abbott.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

Generates a supplier quality scorecard by pulling rejection rates from SAP, audit findings from ServiceNow, and delivery performance from the procurement system.

naftiko: "0.5"
info:
  label: "Supplier Quality Scorecard Generation"
  description: "Generates a supplier quality scorecard by pulling rejection rates from SAP, audit findings from ServiceNow, and delivery performance from the procurement system."
  tags:
    - quality
    - procurement
    - sap
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: supplier-quality
      port: 8080
      tools:
        - name: generate-supplier-scorecard
          description: "Given a supplier ID, gather rejection rates, audit findings, and delivery metrics to produce a quality scorecard. Use when procurement or quality teams evaluate supplier performance."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "SAP supplier/vendor number."
          steps:
            - name: get-rejection-data
              type: call
              call: sap-erp.get-supplier-rejections
              with:
                vendor_id: "{{supplier_id}}"
            - name: get-audit-findings
              type: call
              call: servicenow.query-supplier-audits
              with:
                supplier_id: "{{supplier_id}}"
            - name: get-delivery-performance
              type: call
              call: sap-erp.get-delivery-metrics
              with:
                vendor_id: "{{supplier_id}}"
            - name: calculate-scorecard
              type: call
              call: snowflake.execute-query
              with:
                query_name: "supplier_scorecard"
                params: "{{supplier_id}},{{get-rejection-data.rejection_rate}},{{get-audit-findings.findings_count}},{{get-delivery-performance.on_time_rate}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: rejections
          path: "/A_VendorRejection(Vendor='{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-supplier-rejections
              method: GET
        - name: delivery
          path: "/A_VendorDelivery(Vendor='{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-delivery-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audits
          path: "/table/u_supplier_audit"
          operations:
            - name: query-supplier-audits
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a supply chain disruption is detected, identifies impacted purchase orders, notifies procurement, creates alternative sourcing tasks, and updates production schedules.

naftiko: "0.5"
info:
  label: "Supply Chain Disruption Response Orchestration"
  description: "When a supply chain disruption is detected, identifies impacted purchase orders, notifies procurement, creates alternative sourcing tasks, and updates production schedules."
  tags:
    - supply-chain
    - procurement
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-disruption
      port: 8080
      tools:
        - name: respond-to-disruption
          description: "Given a supplier ID and disruption type, identify impacted POs, alert procurement, create sourcing tasks, and adjust production. Use when supply chain detects a material disruption."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "SAP supplier/vendor number."
            - name: disruption_type
              in: body
              type: string
              description: "Type of disruption: delay, quality_issue, force_majeure."
          steps:
            - name: get-impacted-pos
              type: call
              call: sap-erp.query-open-pos
              with:
                vendor_id: "{{supplier_id}}"
                status: "open"
            - name: create-sourcing-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Alternative sourcing needed: {{disruption_type}} from vendor {{supplier_id}}"
                category: "procurement"
                priority: "1"
                assigned_group: "Strategic_Sourcing"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain-ops"
                text: "SUPPLY DISRUPTION: Vendor {{supplier_id}} - {{disruption_type}}. Impacted POs: {{get-impacted-pos.count}}. Sourcing task: {{create-sourcing-task.number}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-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"
          operations:
            - name: query-open-pos
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a refresh of the quality metrics Tableau dashboard and returns the extraction completion status.

naftiko: "0.5"
info:
  label: "Tableau Quality Dashboard Refresh"
  description: "Triggers a refresh of the quality metrics Tableau dashboard and returns the extraction completion status."
  tags:
    - quality
    - analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: quality-analytics
      port: 8080
      tools:
        - name: refresh-quality-dashboard
          description: "Given a Tableau workbook name, trigger a data extract refresh and return the job status. Use when quality teams need updated dashboard metrics."
          inputParameters:
            - name: workbook_name
              in: body
              type: string
              description: "Tableau workbook name."
          call: tableau.trigger-refresh
          with:
            workbook: "{{workbook_name}}"
          outputParameters:
            - name: job_id
              type: string
              mapping: "$.job.id"
            - name: status
              type: string
              mapping: "$.job.status"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://abbott.online.tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbook}}/refresh"
          inputParameters:
            - name: workbook
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Provisions a new cloud environment by triggering a Terraform run, configuring Datadog monitoring, creating a ServiceNow CMDB record, and notifying the DevOps team.

naftiko: "0.5"
info:
  label: "Terraform Environment Provisioning Orchestration"
  description: "Provisions a new cloud environment by triggering a Terraform run, configuring Datadog monitoring, creating a ServiceNow CMDB record, and notifying the DevOps team."
  tags:
    - devops
    - cloud
    - terraform
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: env-provisioning
      port: 8080
      tools:
        - name: provision-environment
          description: "Given an environment name and Terraform workspace, run the infrastructure plan, configure monitoring, register in CMDB, and notify DevOps. Use when engineering needs a new cloud environment."
          inputParameters:
            - name: environment_name
              in: body
              type: string
              description: "Name for the new environment."
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID."
          steps:
            - name: trigger-terraform
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "Provisioning {{environment_name}}"
            - name: configure-monitoring
              type: call
              call: datadog.create-monitor
              with:
                name: "{{environment_name}} health"
                type: "service check"
                query: "service:{{environment_name}}"
            - name: create-cmdb-record
              type: call
              call: servicenow.create-ci
              with:
                name: "{{environment_name}}"
                category: "cloud_environment"
                terraform_run: "{{trigger-terraform.run_id}}"
            - name: notify-devops
              type: call
              call: msteams.send-message
              with:
                channel_id: "devops-infra"
                text: "Environment {{environment_name}} provisioning started. Terraform run: {{trigger-terraform.run_id}}. CMDB: {{create-cmdb-record.sys_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace_id}}/runs"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          operations:
            - name: create-monitor
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: create-ci
              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/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Terraform Cloud workspace run to provision new environment infrastructure, notifies the DevOps team via Teams upon completion.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision new environment infrastructure, notifies the DevOps team via Teams upon completion."
  tags:
    - devops
    - terraform
    - cloud
    - infrastructure
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: tf-provisioning
      port: 8080
      tools:
        - name: provision-environment
          description: "Given a Terraform Cloud workspace ID and environment label, trigger a plan-and-apply run to provision cloud infrastructure. Notify the DevOps Teams channel with run status. Use when standing up new environments for product development or clinical systems."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID."
            - name: environment_label
              in: body
              type: string
              description: "Human-readable environment label, e.g. 'freestyle-libre-staging'."
            - name: devops_channel_id
              in: body
              type: string
              description: "DevOps Teams channel ID."
          steps:
            - name: trigger-tf-run
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "Provisioning {{environment_label}}"
                auto_apply: "true"
            - name: notify-devops
              type: call
              call: msteams-tf.post-channel-message
              with:
                channel_id: "{{devops_channel_id}}"
                text: "Terraform run triggered for {{environment_label}} (workspace {{workspace_id}}). Run ID: {{trigger-tf-run.data.id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams-tf
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a regulatory or quality document from Veeva Vault by document number, returning metadata, version, and approval status.

naftiko: "0.5"
info:
  label: "Veeva Vault Document Retrieval"
  description: "Retrieves a regulatory or quality document from Veeva Vault by document number, returning metadata, version, and approval status."
  tags:
    - regulatory
    - quality
    - veeva-vault
capability:
  exposes:
    - type: mcp
      namespace: vault-documents
      port: 8080
      tools:
        - name: get-vault-document
          description: "Given a Veeva Vault document number, return the document metadata, current version, lifecycle state, and approval status. Use when teams need to locate regulated documents."
          inputParameters:
            - name: document_number
              in: body
              type: string
              description: "Veeva Vault document number."
          call: veeva-vault.get-document
          with:
            doc_number: "{{document_number}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.data.name__v"
            - name: version
              type: string
              mapping: "$.data.major_version_number__v"
            - name: lifecycle_state
              type: string
              mapping: "$.data.status__v"
  consumes:
    - type: http
      namespace: veeva-vault
      baseUri: "https://abbott-regulatory.veevavault.com/api/v24.1"
      authentication:
        type: bearer
        token: "$secrets.veeva_vault_token"
      resources:
        - name: documents
          path: "/objects/documents/{{doc_number}}"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-document
              method: GET

Performs a vendor risk assessment by querying SAP for financial data, checking compliance records in ServiceNow, scoring the vendor, and creating an assessment report.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Orchestration"
  description: "Performs a vendor risk assessment by querying SAP for financial data, checking compliance records in ServiceNow, scoring the vendor, and creating an assessment report."
  tags:
    - procurement
    - compliance
    - sap
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Given a vendor ID, collect financial data, compliance records, and calculate a risk score. Use when procurement needs to evaluate vendor risk before contract renewal."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor number."
          steps:
            - name: get-vendor-financials
              type: call
              call: sap-erp.get-vendor-master
              with:
                vendor_id: "{{vendor_id}}"
            - name: get-compliance-records
              type: call
              call: servicenow.query-vendor-compliance
              with:
                vendor_id: "{{vendor_id}}"
            - name: calculate-risk-score
              type: call
              call: snowflake.execute-query
              with:
                query_name: "vendor_risk_score"
                params: "{{vendor_id}},{{get-vendor-financials.payment_terms}},{{get-compliance-records.open_findings}}"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://abbott-s4.sap.com/sap/opu/odata/sap/MM_VENDOR_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Vendor('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor-master
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance
          path: "/table/u_vendor_compliance"
          operations:
            - name: query-vendor-compliance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abbott.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Retrieves an employee's benefits enrollment status from Workday, returning current plan selections, coverage levels, and enrollment deadlines.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Status"
  description: "Retrieves an employee's benefits enrollment status from Workday, returning current plan selections, coverage levels, and enrollment deadlines."
  tags:
    - hr
    - benefits
    - workday
capability:
  exposes:
    - type: mcp
      namespace: benefits-enrollment
      port: 8080
      tools:
        - name: get-benefits-status
          description: "Given a Workday worker ID, return the employee's current benefits elections, coverage levels, and open enrollment deadline. Use when HR or employees need benefits information."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-benefits
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: medical_plan
              type: string
              mapping: "$.data.medical_plan"
            - name: dental_plan
              type: string
              mapping: "$.data.dental_plan"
            - name: enrollment_deadline
              type: string
              mapping: "$.data.enrollment_deadline"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/workers/{{worker_id}}/benefits"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-benefits
              method: GET

Launches a compensation review cycle by pulling performance ratings from Workday, generating recommendations, notifying managers, and creating approval tasks.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Orchestration"
  description: "Launches a compensation review cycle by pulling performance ratings from Workday, generating recommendations, notifying managers, and creating approval tasks."
  tags:
    - hr
    - finance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: comp-review
      port: 8080
      tools:
        - name: launch-comp-review
          description: "Given a department code and review cycle name, pull performance data, generate comp recommendations, notify managers, and create approval workflows. Use when HR launches annual compensation reviews."
          inputParameters:
            - name: department_code
              in: body
              type: string
              description: "Workday department code."
            - name: cycle_name
              in: body
              type: string
              description: "Compensation review cycle name."
          steps:
            - name: get-performance-data
              type: call
              call: workday.get-performance-ratings
              with:
                department: "{{department_code}}"
            - name: generate-recommendations
              type: call
              call: workday.create-comp-recommendations
              with:
                department: "{{department_code}}"
                cycle: "{{cycle_name}}"
                performance_data: "{{get-performance-data.ratings}}"
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Compensation review approval: {{department_code}} - {{cycle_name}}"
                assigned_group: "HR_Compensation"
                category: "hr_compensation"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-compensation"
                text: "Compensation review cycle '{{cycle_name}}' launched for department {{department_code}}. {{generate-recommendations.count}} recommendations generated. Approval task: {{create-approval-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: performance
          path: "/performance/ratings"
          operations:
            - name: get-performance-ratings
              method: GET
        - name: compensation
          path: "/compensation/recommendations"
          operations:
            - name: create-comp-recommendations
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abbott.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an employee profile from Workday by worker ID, returning name, department, job title, manager, and location.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, manager, and location."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday worker ID, return the employee name, department, title, manager, and work location. Use when HR or managers need employee information."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.data.full_name"
            - name: department
              type: string
              mapping: "$.data.department"
            - name: job_title
              type: string
              mapping: "$.data.job_title"
            - name: manager
              type: string
              mapping: "$.data.manager_name"
  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

Retrieves current headcount and payroll cost totals from Workday by business unit and cost center for finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount and Payroll Snapshot"
  description: "Retrieves current headcount and payroll cost totals from Workday by business unit and cost center for finance reporting."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns headcount and payroll cost data grouped by business unit and cost center from Workday. Use for monthly finance reviews and headcount planning."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "Snapshot date in YYYY-MM-DD format."
          call: workday-hcm.get-headcount-report
          with:
            effective_date: "{{as_of_date}}"
          outputParameters:
            - name: total_headcount
              type: string
              mapping: "$.Report_Entry[0].Total_Headcount"
            - name: total_payroll_cost
              type: string
              mapping: "$.Report_Entry[0].Total_Payroll_Cost"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount-report
          path: "/reports/headcount_by_cost_center"
          inputParameters:
            - name: effective_date
              in: query
          operations:
            - name: get-headcount-report
              method: GET

Retrieves a summary of open job requisitions from Workday by department, returning requisition count, average days open, and hiring manager details.

naftiko: "0.5"
info:
  label: "Workday Open Requisition Report"
  description: "Retrieves a summary of open job requisitions from Workday by department, returning requisition count, average days open, and hiring manager details."
  tags:
    - hr
    - recruiting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: get-open-requisitions
          description: "Given a department code, return the count of open requisitions, average days open, and breakdown by hiring manager. Use when HR or leadership needs recruiting pipeline visibility."
          inputParameters:
            - name: department_code
              in: body
              type: string
              description: "Workday department code."
          call: workday.get-requisitions
          with:
            department: "{{department_code}}"
            status: "open"
          outputParameters:
            - name: open_count
              type: integer
              mapping: "$.data.total"
            - name: avg_days_open
              type: number
              mapping: "$.data.avg_days_open"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/recruiting/requisitions"
          operations:
            - name: get-requisitions
              method: GET