claude-code - 💡(How to fix) Fix [Bug] Cowork: ghost plugin from hidden marketplace can't be uninstalled, triggers OAuth popup on every launch [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
anthropics/claude-code#56032Fetched 2026-05-05 05:59:55
View on GitHub
Comments
0
Participants
1
Timeline
5
Reactions
0
Participants
Timeline (top)
labeled ×4cross-referenced ×1

A Cowork plugin (nimble) installed from a marketplace that is no longer surfaced in any management UI persists as a "ghost" install — Cowork launches its bundled MCP server on every startup, which triggers a browser OAuth popup to mcp.nimbleway.com. The plugin cannot be removed through any user-accessible path:

  • Not listed in Claude Desktop → Settings → Plugins
  • Not listed in claude.ai web UI plugin/connector management
  • Not listed in Cowork's own cowork-plugin-management plugin (its agent-facing tools are read-only — list_plugins, search_plugins, suggest_plugin_install only)
  • Not searchable as an installable plugin from any of the above (so it's not just "uninstall hidden" — the entire marketplace appears delisted from the user's account view)

The claude-code CLI layer is exonerated — claude mcp list, ~/.claude/plugins/installed_plugins.json, ~/.claude/settings.json, and ~/.claude/plugins/known_marketplaces.json are all clean. The plugin lives entirely in Cowork's local-agent-mode-sessions/.../rpm/ cache.

Root Cause

I can't fully repro from a clean account because the marketplace is no longer accessible to me. The historical install path was likely:

Fix Action

Fix / Workaround

Workarounds attempted

Last-resort interim mitigation (not yet applied): 127.0.0.1 mcp.nimbleway.com in /etc/hosts to blackhole the OAuth endpoint without modifying any Anthropic state.

  • #42315 — plugin-bundled MCP servers should be opt-in (related class of issue)
  • #40175 — Cowork stale-write race (different bug, tangentially relevant since file edits to rpm/ are not a safe workaround on this code path)

Code Example

$ pgrep -lf mcp-remote
36043 npm exec mcp-remote@latest https://mcp.nimbleway.com/mcp --header Authorization:Bearer ${NIMBLE_API_KEY}
36129 node /Users/<user>/.npm/_npx/.../mcp-remote https://mcp.nimbleway.com/mcp --header Authorization:Bearer ${NIMBLE_API_KEY}

---

{
  "mcpServers": {
    "nimble-mcp-server": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "https://mcp.nimbleway.com/mcp",
               "--header", "Authorization:Bearer ${NIMBLE_API_KEY}"]
    }
  }
}

---

{
  "id": "plugin_01BB1HUyHKrddLdPpkTMBUvE",
  "name": "nimble",
  "marketplaceId": "marketplace_01QRn9XAjzzeAokB5nPWVMxP",
  "marketplaceName": "knowledge-work-plugins",
  "installedBy": "user",
  "installationPreference": "available"
}
RAW_BUFFERClick to expand / collapse

Summary

A Cowork plugin (nimble) installed from a marketplace that is no longer surfaced in any management UI persists as a "ghost" install — Cowork launches its bundled MCP server on every startup, which triggers a browser OAuth popup to mcp.nimbleway.com. The plugin cannot be removed through any user-accessible path:

  • Not listed in Claude Desktop → Settings → Plugins
  • Not listed in claude.ai web UI plugin/connector management
  • Not listed in Cowork's own cowork-plugin-management plugin (its agent-facing tools are read-only — list_plugins, search_plugins, suggest_plugin_install only)
  • Not searchable as an installable plugin from any of the above (so it's not just "uninstall hidden" — the entire marketplace appears delisted from the user's account view)

The claude-code CLI layer is exonerated — claude mcp list, ~/.claude/plugins/installed_plugins.json, ~/.claude/settings.json, and ~/.claude/plugins/known_marketplaces.json are all clean. The plugin lives entirely in Cowork's local-agent-mode-sessions/.../rpm/ cache.

Reproduction (limited)

I can't fully repro from a clean account because the marketplace is no longer accessible to me. The historical install path was likely:

  1. Some time ago, the knowledge-work-plugins marketplace (ID marketplace_01QRn9XAjzzeAokB5nPWVMxP) was visible in Cowork's plugin browser under a feature flag.
  2. I clicked install on the nimble plugin (ID plugin_01BB1HUyHKrddLdPpkTMBUvE), among ~12 from that marketplace (data, finance, brand-voice, prisma, productivity, design, pdf-viewer, legal, enterprise-search, bio-research, cowork-plugin-management).
  3. The marketplace was later hidden / feature-flagged off / deprecated for my account.
  4. The installs persist on disk and at the account level, but no UI surfaces them anymore.

Expected behavior

If a plugin is installed and active enough to spawn an MCP subprocess on every startup, there must be a UI path to uninstall it — even if the source marketplace is no longer surfaced.

Actual behavior

On every Cowork (and apparently Codex too) startup:

$ pgrep -lf mcp-remote
36043 npm exec mcp-remote@latest https://mcp.nimbleway.com/mcp --header Authorization:Bearer ${NIMBLE_API_KEY}
36129 node /Users/<user>/.npm/_npx/.../mcp-remote https://mcp.nimbleway.com/mcp --header Authorization:Bearer ${NIMBLE_API_KEY}

The literal ${NIMBLE_API_KEY} in argv (env var was never exported) fires a browser OAuth popup to nimble's auth flow. Process cwd is the Cowork session directory, confirming Cowork is the parent.

Diagnostic info

Launcher config (<org-dir>/rpm/plugin_01BB1HUyHKrddLdPpkTMBUvE/mcp.json):

{
  "mcpServers": {
    "nimble-mcp-server": {
      "command": "npx",
      "args": ["-y", "mcp-remote@latest", "https://mcp.nimbleway.com/mcp",
               "--header", "Authorization:Bearer ${NIMBLE_API_KEY}"]
    }
  }
}

Manifest entry (<org-dir>/rpm/manifest.json, before quit-handler purge):

{
  "id": "plugin_01BB1HUyHKrddLdPpkTMBUvE",
  "name": "nimble",
  "marketplaceId": "marketplace_01QRn9XAjzzeAokB5nPWVMxP",
  "marketplaceName": "knowledge-work-plugins",
  "installedBy": "user",
  "installationPreference": "available"
}

Behavior of Cowork's quit handler: purges rpm/<plugin-id>/ directories on quit and rewrites manifest.json from 12 entries to either 2 or 0 (observed both [bio-research, pdf-viewer] and [] in successive writes). However, on next launch the cache appears to be re-populated from server-side state, restoring the OAuth-triggering plugin.

Workarounds attempted

  • Searching all on-disk Claude/Codex configs (~/.claude.json, ~/Library/Application Support/Claude/claude_desktop_config.json, ~/.codex/config.toml, all .mcp.jsons, marketplaces, installed_plugins.json, mcp-needs-auth-cache.json, etc.) → all clean. The plugin is only in the Cowork rpm/ cache.
  • Killing the orphaned process → it respawns on next Cowork startup.
  • Quitting Claude Desktop fully → the rpm/ cache is purged but the plugin is presumably re-fetched server-side on next launch.

Last-resort interim mitigation (not yet applied): 127.0.0.1 mcp.nimbleway.com in /etc/hosts to blackhole the OAuth endpoint without modifying any Anthropic state.

Asks

  1. A UI path to remove plugins from delisted/hidden marketplaces — most directly, surface installed plugins in the plugin manager regardless of whether their source marketplace is currently visible.
  2. As an immediate fix for affected users: an account-side cleanup tool or support process to remove ghost installs.
  3. Consider whether plugin installs from feature-flagged or experimental marketplaces should auto-uninstall when the marketplace is no longer surfaced to the account, to avoid this class of orphan.

Environment

  • Cowork inside Claude Desktop (Claude.app v1.5354.0)
  • macOS 26 (Tahoe), Darwin 25.4.0
  • Also affects codex CLI startup on the same machine (suggesting the OAuth flow is shared at the OS level, or the same plugin layer is read by both)

Related

  • #42315 — plugin-bundled MCP servers should be opt-in (related class of issue)
  • #40175 — Cowork stale-write race (different bug, tangentially relevant since file edits to rpm/ are not a safe workaround on this code path)

extent analysis

TL;DR

The most likely fix is to remove the "ghost" plugin by manually deleting its directory from the Cowork rpm/ cache and preventing it from being re-populated from server-side state.

Guidance

  1. Manually remove the plugin directory: Delete the plugin_01BB1HUyHKrddLdPpkTMBUvE directory from the Cowork rpm/ cache to prevent the OAuth-triggering plugin from spawning.
  2. Prevent re-population: Investigate how the rpm/ cache is re-populated from server-side state and find a way to prevent this for the removed plugin.
  3. Verify removal: After deleting the plugin directory, restart Cowork and verify that the OAuth popup no longer appears and the mcp-remote process is not spawned.
  4. Long-term solution: Implement a UI path to remove plugins from delisted/hidden marketplaces, as requested in the issue, to prevent similar issues in the future.

Example

No code snippet is provided as the issue does not require a code change, but rather a manual removal of the plugin directory and investigation into the cache re-population mechanism.

Notes

The provided workaround of adding 127.0.0.1 mcp.nimbleway.com to /etc/hosts may not be a suitable long-term solution, as it only blackholes the OAuth endpoint without removing the underlying issue.

Recommendation

Apply the manual removal workaround and investigate the cache re-population mechanism to prevent the plugin from being re-installed. This is a temporary solution until a UI path to remove plugins from delisted/hidden marketplaces is implemented.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

If a plugin is installed and active enough to spawn an MCP subprocess on every startup, there must be a UI path to uninstall it — even if the source marketplace is no longer surfaced.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

claude-code - 💡(How to fix) Fix [Bug] Cowork: ghost plugin from hidden marketplace can't be uninstalled, triggers OAuth popup on every launch [1 participants]