enabledPlugins: true silently fails to start MCP server for local symlink marketplace plugins
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
- Create a local plugin marketplace at a path (e.g.
/home/user/my-plugins/) with a valid.claude-plugin/marketplace.json - Create a plugin inside it with a
.claude-plugin/plugin.jsonand.mcp.json - Symlink the marketplace into
~/.claude/plugins/marketplaces/my-marketplace -> /home/user/my-plugins/ - Install the plugin via
/pluginsCLI. This creates an entry ininstalled_plugins.jsonwith a cache path - Add
"my-plugin@my-marketplace": truetoenabledPluginsinsettings.json - Start Claude Code
- 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.jsonrecords aninstallPathpointing 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.jsondoes not include the local marketplace despite the symlink being valid- When
enabledPluginsis 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.jsonformat
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗