fix(mcp): user config overrides Claude Code .mcp.json with collision warning
Previously, Claude Code's .mcp.json would silently override OpenCode user config when MCP server names collided. This was unexpected behavior since users expect their explicit OpenCode configuration to take precedence. Changes: 1. Swapped merge order: Claude Code .mcp.json is now merged BEFORE user config, so user config wins on collision 2. Added warning log when user config overrides a Claude Code MCP server: 'warning: MCP server X from user config overrides Claude Code .mcp.json' 3. Added comprehensive tests for collision scenarios Fixes #2946
This commit is contained in:
@@ -2,6 +2,7 @@ import type { OhMyOpenCodeConfig } from "../config";
|
||||
import { loadMcpConfigs } from "../features/claude-code-mcp-loader";
|
||||
import { createBuiltinMcps } from "../mcp";
|
||||
import type { PluginComponents } from "./plugin-components-loader";
|
||||
import { log } from "../shared";
|
||||
|
||||
type McpEntry = Record<string, unknown>;
|
||||
|
||||
@@ -38,10 +39,18 @@ export async function applyMcpConfig(params: {
|
||||
? await loadMcpConfigs(disabledMcps)
|
||||
: { servers: {} };
|
||||
|
||||
if (userMcp) {
|
||||
for (const name of Object.keys(userMcp)) {
|
||||
if (name in mcpResult.servers) {
|
||||
log(`warning: MCP server "${name}" from user config overrides Claude Code .mcp.json`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const merged = {
|
||||
...createBuiltinMcps(disabledMcps, params.pluginConfig),
|
||||
...(userMcp ?? {}),
|
||||
...mcpResult.servers,
|
||||
...(userMcp ?? {}),
|
||||
...params.pluginComponents.mcpServers,
|
||||
} as Record<string, McpEntry>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user