What happened?
Claude-style plugins with a root .mcp.json are recognized and installed by Step, but their MCP servers are not discovered after restart.
The plugin loader normalizes a Claude plugin with .mcp.json to mcpServers: ".mcp.json", and the diagnostics path accepts that file-backed declaration. The runtime path in discoverStepMcpServers() currently skips string declarations entirely:
if (!declared || typeof declared === "string") continue;
So the plugin appears under /plugin as installed, but its MCP server never starts. An otherwise equivalent plugin with inline mcpServers starts normally.
Steps to reproduce
- Create a Claude-style plugin with
.claude-plugin/plugin.json.
- Add a root
.mcp.json containing a stdio MCP server, for example a tiny Node process that writes a marker file when it starts.
- Add the plugin through a local marketplace and install it with
/plugin install.
- Restart Step.
- The plugin is still listed as installed, but the marker from the
.mcp.json server is never created.
As a control, moving the same server declaration inline into plugin.json -> mcpServers creates the marker after the same restart.
I have a local fix that resolves inline and file-backed declarations through one parser and added regression coverage for runtime discovery and plugin diagnostics. The focused tests pass, pnpm run check passes, and pnpm run build:offline passes. Happy to submit the fix if this direction looks good.
Expected behavior
A Claude-style plugin's root .mcp.json should be discovered and started after restart the same way as inline mcpServers.
Version
StepCode 0.1.0, main @ cb5fc1456d49d49c62e072bfed2926220083214e
AI-assisted wording; the repro, code path, fix, and tests were verified locally.
What happened?
Claude-style plugins with a root
.mcp.jsonare recognized and installed by Step, but their MCP servers are not discovered after restart.The plugin loader normalizes a Claude plugin with
.mcp.jsontomcpServers: ".mcp.json", and the diagnostics path accepts that file-backed declaration. The runtime path indiscoverStepMcpServers()currently skips string declarations entirely:So the plugin appears under
/pluginas installed, but its MCP server never starts. An otherwise equivalent plugin with inlinemcpServersstarts normally.Steps to reproduce
.claude-plugin/plugin.json..mcp.jsoncontaining a stdio MCP server, for example a tiny Node process that writes a marker file when it starts./plugin install..mcp.jsonserver is never created.As a control, moving the same server declaration inline into
plugin.json -> mcpServerscreates the marker after the same restart.I have a local fix that resolves inline and file-backed declarations through one parser and added regression coverage for runtime discovery and plugin diagnostics. The focused tests pass,
pnpm run checkpasses, andpnpm run build:offlinepasses. Happy to submit the fix if this direction looks good.Expected behavior
A Claude-style plugin's root
.mcp.jsonshould be discovered and started after restart the same way as inlinemcpServers.Version
StepCode 0.1.0, main @
cb5fc1456d49d49c62e072bfed2926220083214eAI-assisted wording; the repro, code path, fix, and tests were verified locally.