[BUG] claude.ai plugin ingester silently hides plugins whose hooks.json has an unknown top-level key (tolerated by Claude Code CLI)

Open 💬 0 comments Opened Jul 10, 2026 by nikhilsitaram

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

  1. Publish a marketplace where some plugins' hooks/hooks.json carry 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": [ ... ] }
}
``

  1. 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 _generated from one plugin's hooks.json made that plugin appear on the next sync; for another plugin we kept _generated and only changed the hook timeout (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.json is 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.

View original on GitHub ↗