{"record":{"id":"f262ffb0416f2b0f","repo":"BerriAI/litellm","slug":"plugin-plugin-name-not-found","errorCode":null,"errorMessage":"Plugin '{plugin_name}' not found","messagePattern":"Plugin '(.+?)' not found","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"warning","filePath":"litellm/proxy/anthropic_endpoints/claude_code_endpoints/claude_code_marketplace.py","lineNumber":429,"sourceCode":"):\n    \"\"\"\n    Get details of a specific plugin.\n\n    Parameters:\n        - plugin_name: The name of the plugin\n\n    Returns:\n        Plugin details including source and metadata.\n    \"\"\"\n    try:\n        prisma_client: Final = await _get_prisma_client()\n\n        plugin: Final[_PluginRecord | None] = await ClaudeCodePluginRepository(prisma_client).table.find_unique(\n            where={\"name\": plugin_name}\n        )\n\n        if not plugin:\n            raise HTTPException(\n                status_code=404,\n                detail={\"error\": f\"Plugin '{plugin_name}' not found\"},\n            )\n\n        manifest: Final[Mapping[str, object]] = json.loads(plugin.manifest_json or \"{}\") if plugin.manifest_json else {}\n\n        return {\n            \"id\": plugin.id,\n            \"name\": plugin.name,\n            \"version\": plugin.version,\n            \"description\": plugin.description,\n            \"source\": manifest.get(\"source\"),\n            \"author\": manifest.get(\"author\"),\n            \"homepage\": manifest.get(\"homepage\"),\n            \"keywords\": manifest.get(\"keywords\"),\n            \"category\": manifest.get(\"category\"),\n            \"enabled\": plugin.enabled,\n            \"created_at\": plugin.created_at.isoformat() if plugin.created_at else None,","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/anthropic_endpoints/claude_code_endpoints/claude_code_marketplace.py#L411-L447","documentation":"404 from get_plugin (GET /claude-code/plugins/{plugin_name}) when find_unique on the name returns no row. Lookup is by exact, case-sensitive name match against the kebab-case primary key; trailing slashes, spaces, URL-encoding artifacts, or wrong casing all miss. Disabled plugins are still returned — only a truly absent name 404s.","triggerScenarios":"GET /claude-code/plugins/Data_Cleaner when the plugin was registered as \"data-cleaner\"; GET /claude-code/plugins/my-plugin%2F when a slash got encoded into the path; requesting a plugin that was deleted via DELETE /claude-code/plugins/{name} earlier.","commonSituations":"Casing/underscore mismatches between what a user typed and the registered slug; referencing a plugin deleted by another admin; copy-pasting a name with a trailing newline/space from a doc; assuming enable/disable hides the plugin from GET.","solutions":["List the exact registered names first: GET /claude-code/plugins returns all plugins with their exact slugs — use that name verbatim.","Check casing (names are lowercase kebab-case), trailing whitespace, and URL-encoding of the path segment.","If the plugin was deleted by mistake, re-register it with POST /claude-code/plugins."],"exampleFix":"# before\ncurl http://localhost:4000/claude-code/plugins/Data_Cleaner\n# -> 404 Plugin 'Data_Cleaner' not found\n\n# after\ncurl http://localhost:4000/claude-code/plugins   # list exact names\ncurl http://localhost:4000/claude-code/plugins/data-cleaner","handlingStrategy":"validation","validationCode":"plugins = client.get(f\"{base}/claude-code/plugins\", headers=hdr).json()[\"plugins\"]\nnames = {p[\"name\"] for p in plugins}\nif plugin_name not in names:\n    raise KeyError(f\"{plugin_name!r} not registered; available: {sorted(names)}\")","typeGuard":null,"tryCatchPattern":"resp = client.get(f\"{base}/claude-code/plugins/{plugin_name}\", headers=hdr)\nif resp.status_code == 404:\n    # not an error in discovery flows - plugin simply absent\n    return None\nresp.raise_for_status()\nreturn resp.json()","preventionTips":["Resolve names through the list endpoint instead of constructing them from titles.","Normalize to the exact registered kebab-case slug everywhere (config, scripts, docs)."],"tags":["litellm-proxy","claude-code-marketplace","http-404","not-found","plugins"],"backgroundTag":"resource-not-found","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}