{"record":{"id":"4be30b7a992c6cfe","repo":"OpenBB-finance/OpenBB","slug":"target-provider-target-not-found-or-not-loaded","errorCode":null,"errorMessage":"Target provider '{target}' not found or not loaded. Available targets: {', '.join(available)}","messagePattern":"Target provider '(.+?)' not found or not loaded\\. Available targets: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py","lineNumber":813,"sourceCode":"            if target_key == \"bundled\":\n                if settings.default_skills_dir:\n                    bundled_root = Path(settings.default_skills_dir).resolve()\n                    if bundled_root in provider._roots:  # noqa: SLF001\n                        target_provider = provider\n                        break\n            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","sourceCodeStart":795,"sourceCodeEnd":831,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py#L795-L831","documentation":"Raised by install_skill when the target skills provider cannot be found among the loaded MCP providers. Targets are matched by name ('bundled' plus any registered vendor skills providers); if none matches, the server enumerates the actually-available targets in the error. Typically caused by a typo or by a vendor extension not being installed/loaded.","triggerScenarios":"Calling install_skill(target='my-vendor') when no provider with that name is registered; a vendor skills provider class existing but never instantiated because its extension is missing; trailing whitespace/casing differences in the target string (it is lower().strip()'d, so casing is fine but the name must match).","commonSituations":"Installing skills to a vendor directory whose extension isn't installed; mismatch between documentation target names and the running server's registered providers; stale examples referencing removed vendors.","solutions":["Pick a target from the 'Available targets' list in the error message.","Install/enable the vendor extension that registers the skills provider and restart the MCP server.","Use the default 'bundled' target if you just want the skill available locally.","Check server startup logs to confirm which SkillsDirectoryProviders actually loaded."],"exampleFix":"# before\nawait install_skill(skill_name=\"s\", target=\"acme\", files={\"SKILL.md\": \"...\"})\n\n# after\nawait install_skill(skill_name=\"s\", target=\"bundled\", files={\"SKILL.md\": \"...\"})  # or a name from the error's Available targets","handlingStrategy":"validation","validationCode":"async def available_skill_targets(mcp_client) -> set[str]:\n    # 'bundled' is always present; vendors appear per loaded providers\n    res = await mcp_client.call_tool(\"list_resources\", {})\n    return {\"bundled\", *(r.get(\"provider\", \"\") for r in res.result)}\n\nassert target in available_skill_targets(client)","typeGuard":"def is_valid_target(target: str, available: list[str]) -> bool:\n    return isinstance(target, str) and target.strip().lower() in {a.lower() for a in available}","tryCatchPattern":"try:\n    await install_skill(skill_name=n, target=target, files=files)\nexcept ValueError as e:\n    if \"Available targets:\" in str(e):\n        target = \"bundled\"  # safe default from the error's own list\n        await install_skill(skill_name=n, target=target, files=files)\n    else:\n        raise","preventionTips":["Default to target='bundled' unless a vendor provider is confirmed loaded.","Parse the 'Available targets' list from the error to self-correct.","Verify vendor extensions are installed and initialized before targeting them."],"tags":["openbb","mcp","skills","provider-registration"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}