enabledPlugins: true silently fails to start MCP server for local symlink marketplace plugins

Resolved 💬 2 comments Opened Apr 4, 2026 by ghost Closed May 14, 2026

Description

When a plugin from a local (symlink-based) marketplace is registered in settings.json under enabledPlugins with value true, Claude Code correctly suppresses the user confirmation dialog but silently fails to start the MCP server process. The plugin appears enabled but provides no tools at runtime. This does not affect plugins from GitHub-sourced marketplaces (e.g. claude-plugins-official).

Reproduction Steps

  1. Create a local plugin marketplace at a path (e.g. /home/user/my-plugins/) with a valid .claude-plugin/marketplace.json
  2. Create a plugin inside it with a .claude-plugin/plugin.json and .mcp.json
  3. Symlink the marketplace into ~/.claude/plugins/marketplaces/my-marketplace -> /home/user/my-plugins/
  4. Install the plugin via /plugins CLI. This creates an entry in installed_plugins.json with a cache path
  5. Add "my-plugin@my-marketplace": true to enabledPlugins in settings.json
  6. Start Claude Code
  7. Observe: no confirmation dialog (good), but MCP server is not running and no tools from the plugin are available (bad)

Expected Behaviour

The MCP server should be started, either by resolving through the marketplace symlink to the actual plugin source, or by properly populating the cache directory for local marketplaces the same way it does for GitHub-sourced ones.

Actual Behaviour

Silent failure. The plugin appears "enabled" but the MCP server process is never spawned. No error message, no log entry, no user-visible indication of failure.

Root Cause Evidence

Investigating the plugin state files reveals the failure chain:

  • installed_plugins.json records an installPath pointing to a cache directory (e.g. ~/.claude/plugins/cache/my-marketplace/my-plugin/<hash>)
  • This cache directory does not exist for local/symlink marketplaces — it is never populated
  • known_marketplaces.json does not include the local marketplace despite the symlink being valid
  • When enabledPlugins is checked at startup, Claude Code finds the flag (skips confirmation) but fails to resolve the plugin to an actual MCP server — and does so silently

For comparison, GitHub-sourced marketplace plugins (e.g. telegram@claude-plugins-official) have their cache directories properly populated and their marketplace registered in known_marketplaces.json.

Workaround

Load the plugin's MCP server via --mcp-config instead of the plugin system.

Environment

  • Claude Code dev channel
  • Ubuntu 24 / Linux 6.17
  • Plugin uses Bun MCP server with standard .mcp.json format

View original on GitHub ↗

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