{"record":{"id":"42b4eb82eab88881","repo":"OpenBB-finance/OpenBB","slug":"target-provider-target-has-no-configured-root","errorCode":null,"errorMessage":"Target provider '{target}' has no configured root directories.","messagePattern":"Target provider '(.+?)' has no configured root directories\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py","lineNumber":819,"sourceCode":"            else:\n                vendor_cls = _VENDOR_SKILLS_PROVIDERS.get(target_key)\n                if vendor_cls and isinstance(provider, vendor_cls):\n                    target_provider = provider\n                    break\n\n        if target_provider is None:\n            available = [\"bundled\"]\n            for p in mcp.providers:\n                for vendor_name, vendor_cls in _VENDOR_SKILLS_PROVIDERS.items():\n                    if isinstance(p, vendor_cls):\n                        available.append(vendor_name)\n            raise ValueError(\n                f\"Target provider '{target}' not found or not loaded. \"\n                f\"Available targets: {', '.join(available)}\"\n            )\n\n        if not target_provider._roots:  # noqa: SLF001\n            raise ValueError(\n                f\"Target provider '{target}' has no configured root directories.\"\n            )\n\n        # Use the first root directory for writing\n        root_dir = target_provider._roots[0]  # noqa: SLF001\n        skill_dir = root_dir / skill_name\n\n        # Create the directory and write all files\n        skill_dir.mkdir(parents=True, exist_ok=True)\n        written_files: list[str] = []\n        for filename, content in files.items():\n            file_path = skill_dir / filename\n            # Create subdirectories if the filename contains path separators\n            file_path.parent.mkdir(parents=True, exist_ok=True)\n            file_path.write_text(content, encoding=\"utf-8\")\n            written_files.append(filename)\n\n        # Register the new skill with the provider","sourceCodeStart":801,"sourceCodeEnd":837,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py#L801-L837","documentation":"Raised by install_skill when the resolved target provider exists but has no configured root directories (_roots is empty), so there is nowhere on disk to write the skill. A SkillsDirectoryProvider without roots is effectively disabled — it can serve nothing and cannot accept installs. This is a server-side configuration problem, not a bad argument.","triggerScenarios":"Calling install_skill against a provider whose root directory env var or config option was never set; running the MCP server with a vendor skills provider enabled but its data path unconfigured; containerized deployments where the expected skills directory was not mounted.","commonSituations":"Docker images missing the vendor skills volume; fresh installs where the provider is auto-registered but its directory option is blank; CI environments with no writable skills path.","solutions":["Configure the target provider's root directory (its env var / config option) and restart the MCP server.","Mount or create the skills directory in the container/host and point the provider at it.","Alternatively install to a target that has roots configured (e.g. 'bundled').","Check the server's provider initialization logs to see which roots were discovered."],"exampleFix":"# before (server started with vendor provider but no roots)\nawait install_skill(skill_name=\"s\", target=\"vendor\", files={\"SKILL.md\": \"...\"})\n\n# after: configure the provider root, e.g.\n# export OPENBB_MCP_VENDOR_SKILLS_DIR=/data/skills  (name per provider docs)\n# restart server, then\nawait install_skill(skill_name=\"s\", target=\"vendor\", files={\"SKILL.md\": \"...\"})","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    await install_skill(skill_name=n, target=\"vendor\", files=files)\nexcept ValueError as e:\n    if \"no configured root directories\" in str(e):\n        # server-side misconfiguration: report to operator, fall back to bundled\n        log.warning(\"vendor skills dir unconfigured; installing to bundled\")\n        await install_skill(skill_name=n, target=\"bundled\", files=files)\n    else:\n        raise","preventionTips":["Configure every skills provider's root directory at deployment time and smoke-test an install_skill call.","In containers, mount the skills volume and set the provider's directory env var.","Health-check the server's providers after startup before accepting skill installs."],"tags":["openbb","mcp","skills","configuration"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}