[BUG] Cowork: "getPlugins" in interface "LocalPlugins" fails schema validation continuously, breaking all local plugin uploads

Resolved 💬 2 comments Opened Feb 9, 2026 by trivikramsb-coder Closed Mar 9, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

The LocalPlugins interface in Claude Cowork continuously throws schema validation errors, making it impossible to use any custom/uploaded plugins. The error occurs on a polling loop (every ~7-10 seconds) even when no custom plugins are installed, suggesting the getPlugins method itself is broken — not a specific plugin's format.
Custom plugins upload successfully and are correctly registered in installed_plugins.json, but Cowork crashes when attempting to activate/load them (brief loading animation → returns to main Cowork page, no error shown in UI).
The same plugin passes validation via Claude Code CLI:
$ claude plugin validate .
Validating plugin manifest: .../eb1a-case-builder/.claude-plugin/plugin.json
✔ Validation passed
And installs + works correctly in Claude Code CLI:
$ claude plugin install eb1a-case-builder@visagenius-plugins
✔ Successfully installed plugin: eb1a-case-builder@visagenius-plugins (scope: user)
Environment Info

Claude Desktop version: 1.1.2321 (495628) — released 2026-02-06
Claude Code CLI version: 2.1.37
Platform: macOS (Apple Silicon)
Node.js: v24.11.0

What Should Happen?

What's Expected?
Custom plugins that pass claude plugin validate should load in Cowork
The getPlugins method should not throw schema validation errors
If a plugin fails to load, Cowork should show a meaningful error message instead of silently crashing

Error Messages/Logs

Error Logs
Three distinct errors appear continuously in ~/Library/Logs/Claude/claude.ai-web.log:
Error 1: getPlugins validation failure (repeats every ~7-10 seconds)
2026-02-08 20:30:05 [error] [REACT_QUERY_CLIENT] QueryClient error: Error: Error invoking remote method
'$eipc_message$_03ff402f-f622-4aea-b2a4-b95efb475088_$_claude.web.$_LocalPlugins.$.getPlugins':
Error: Result from method "getPlugins" in interface "LocalPlugins" failed to pass validation
Error 2: AJV schema compilation error (appears periodically, paired with getPlugins failure)
2026-02-08 20:20:53 [error] Error compiling schema, function code: var refVal1 = refVal[1];
var validate = function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict';
var vErrors = null; var errors = 0;
if ((typeof data !== "number" || (data % 1) || data !== data))
{ validate.errors = [{ keyword: 'type', dataPath: (dataPath || '') + "",
schemaPath: '#/definitions/nonNegativeInteger/type', params: { type: 'integer' },
message: 'should be integer' }]; return false; }
Error 3: UUID validation error (related — documented in #18644, #20016)
2026-02-08 19:25:44 [error] [REACT_QUERY_CLIENT] QueryClient error: Error:
path.conversation_uuid: Input should be a valid UUID, invalid character:
expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `l` at 1
Error 4: MaxListenersExceededWarning (memory leak, likely caused by retry loop)
2026-02-08 20:20:52 [warn] MaxListenersExceededWarning: Possible EventEmitter memory leak detected.
11 $eipc_message$_03ff402f-f622-4aea-b2a4-b95efb475088_$_claude.web.$_AutoUpdater.$_update
rState_$store$_update listeners added. Use emitter.setMaxListeners() to increase limit

Steps to Reproduce

Open Claude Desktop → Cowork tab
Click the plugin upload button (+ icon)
Upload any .zip file containing a valid plugin (even a minimal one with just plugin.json and one SKILL.md)
Plugin appears to upload successfully
installed_plugins.json correctly registers the plugin with installPath, version, timestamps
Cowork shows brief loading animation → crashes back to main page
Check claude.ai-web.log → continuous getPlugins validation errors

Critical finding: The getPlugins errors persist even AFTER:

Removing all custom plugin files from local-desktop-app-uploads/
Cleaning installed_plugins.json to remove all local upload entries
Quitting and reopening Claude Desktop

This suggests the error is in the LocalPlugins interface itself, not in any specific plugin data.

Claude Model

None

Is this a regression?

I don't know

Last Working Version

_No response_

Claude Code Version

2.1.37 (Claude Code)

Platform

Other

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Additional Context
Plugin structure tested (matches official plugins exactly)
eb1a-case-builder/
├── .claude-plugin/
│ └── plugin.json # author as {name: "..."} object, not string
├── .mcp.json # Notion MCP connector
├── commands/ # 14 slash commands
│ ├── assess-case.md
│ └── ... (frontmatter: description only, no name field, no quotes)
└── skills/ # 5 domain skills
├── eb1a-criteria/
│ └── SKILL.md # frontmatter: name + description, no quotes
└── ...
Verified format matches working official plugins
The plugin format was compared field-by-field against the working legal@knowledge-work-plugins plugin:

plugin.json: Identical structure (name, version, description, author as object)
Command frontmatter: Identical (description only, no quotes, no name: field)
Skill frontmatter: Identical (name + description, no quotes)

Ultra-minimal test plugin also fails
A bare-bones plugin with only plugin.json + one SKILL.md also crashes Cowork identically, confirming this is not a content/format issue.
Official marketplace plugins work fine
All official plugins (Legal, Sales, Productivity, etc.) installed via the marketplace UI continue to work correctly. Only the local-desktop-app-uploads path is broken.
Related issues

#18644 — local_ prefixed session IDs rejected by API UUID validation (same UUID error appears in our logs)
#20016 — Cowork tab stuck on "Sending request" with UUID validation error
#20409 — Silent skill loading failure in plugins (similar silent failure pattern)
#22715 — Cowork VM heartbeat failures with multiple plugins

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗