[BUG] claude.ai plugin ingester silently hides plugins whose hooks.json has an unknown top-level key (tolerated by Claude Code CLI)
Summary
The claude.ai plugin-directory ingester (the pipeline behind the desktop app's marketplace plugin browser) silently hides any plugin whose hooks/hooks.json contains an unknown top-level key. The plugin simply doesn't appear in the plugin browser — no validation error, no warning, nothing in the UI or anywhere else. The same file loads fine in Claude Code CLI, which documents/ignores unknown top-level keys.
Environment
- Claude Desktop 1.20186.0, macOS 26.5.1
- Personal git marketplace with 14 plugins
Steps to reproduce
- Publish a marketplace where some plugins'
hooks/hooks.jsoncarry a top-level string key alongside"hooks"— ours was a codegen banner:
``json``
{
"_generated": "scripts/regen_plugin_hooks.py - do not hand-edit; ...",
"hooks": { "SessionStart": [ ... ] }
}
- Add the marketplace in the desktop plugin browser.
Observed
- Exactly the plugins carrying the extra key were missing from the plugin browser (10 of our 14); the 4 without it (or without hooks.json at all) appeared.
- Controlled experiment isolating the variable: removing
_generatedfrom one plugin's hooks.json made that plugin appear on the next sync; for another plugin we kept_generatedand only changed the hooktimeout(600 → 300) — it stayed hidden. So the unknown top-level key is the trigger; timeout values are fine. - The same
"_generated"convention in each plugin's.claude/settings.jsonis tolerated — only hooks.json is validated this strictly. - Claude Code CLI loads these plugins (and their hooks) without complaint.
Expected
Either ignore unknown top-level keys (matching Claude Code CLI's behavior — and note even OpenAI Codex relaxed its hooks.json parser to allow top-level metadata, see the resolution of #71943), or fail loudly: show the plugin with a validation error, or report it in the marketplace sync status. Silently dropping plugins from the listing is extremely hard to debug — from the publisher's side it looks like the marketplace ingested fine but most of the catalog vanished.
Related
- #71943 — same key pattern; closed because Claude Code (and now Codex) tolerate top-level metadata in hooks.json. The claude.ai ingester is the remaining strict parser, and it fails silently.