Skip to content

[secops-soar] Dynamic marketplace tool import fails with ModuleNotFoundError when running installed package #293

Description

@dandye

Description

When secops-soar-mcp is installed as a Python package (or launched via uvx secops_soar_mcp --integrations <name>), dynamic marketplace tool registration fails with ModuleNotFoundError.

Root Cause

In server/secops-soar/secops_soar_mcp/server.py (line 102):

module_stem = py_file.stem  # The filename without .py (e.g., "csv")
if module_stem not in enabled_integrations_set:
    continue
module_import_path = f"marketplace.{module_stem}"  # The import path (e.g., "marketplace.csv")

try:
    logger.debug("  Attempting to import module: %s", module_import_path)
    module = importlib.import_module(module_import_path)

Because marketplace is a subpackage inside secops_soar_mcp (secops_soar_mcp.marketplace), importlib.import_module("marketplace.csv") looks for a top-level package named marketplace. When the package is installed in site-packages and executed from any arbitrary working directory, sys.path does not contain the inner secops_soar_mcp/ directory as root, resulting in:

ERROR:secops-soar:* Failed to import module marketplace.csv. Error: No module named 'marketplace'

Steps to Reproduce

  1. Install secops-soar-mcp in a clean environment:
    pip install .
  2. Run the server enabling any marketplace integration:
    secops-soar-mcp --integrations CSV,OKTA
  3. Observe that no marketplace tools are registered and ModuleNotFoundError is logged for each enabled integration.

Proposed Fix

Update server/secops-soar/secops_soar_mcp/server.py to import using the qualified package path secops_soar_mcp.marketplace.{module_stem}, with a fallback to marketplace.{module_stem} for local directory execution:

module_import_path = f"secops_soar_mcp.marketplace.{module_stem}"
fallback_import_path = f"marketplace.{module_stem}"

try:
    logger.debug("  Attempting to import module: %s", module_import_path)
    try:
        module = importlib.import_module(module_import_path)
    except ImportError:
        module = importlib.import_module(fallback_import_path)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions