diff options
Diffstat (limited to 'packages/cli/src')
| -rw-r--r-- | packages/cli/src/config/config.test.ts | 60 | ||||
| -rw-r--r-- | packages/cli/src/config/config.ts | 20 | ||||
| -rw-r--r-- | packages/cli/src/config/settings.test.ts | 3 | ||||
| -rw-r--r-- | packages/cli/src/config/settings.ts | 2 |
4 files changed, 85 insertions, 0 deletions
diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index 5043fd59..4042bf93 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -725,6 +725,66 @@ describe('loadCliConfig with allowed-mcp-server-names', () => { const config = await loadCliConfig(baseSettings, [], 'test-session', argv); expect(config.getMcpServers()).toEqual({}); }); + + it('should read allowMCPServers from settings', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = { + ...baseSettings, + allowMCPServers: ['server1', 'server2'], + }; + const config = await loadCliConfig(settings, [], 'test-session', argv); + expect(config.getMcpServers()).toEqual({ + server1: { url: 'http://localhost:8080' }, + server2: { url: 'http://localhost:8081' }, + }); + }); + + it('should read excludeMCPServers from settings', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = { + ...baseSettings, + excludeMCPServers: ['server1', 'server2'], + }; + const config = await loadCliConfig(settings, [], 'test-session', argv); + expect(config.getMcpServers()).toEqual({ + server3: { url: 'http://localhost:8082' }, + }); + }); + + it('should override allowMCPServers with excludeMCPServers if overlapping ', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = { + ...baseSettings, + excludeMCPServers: ['server1'], + allowMCPServers: ['server1', 'server2'], + }; + const config = await loadCliConfig(settings, [], 'test-session', argv); + expect(config.getMcpServers()).toEqual({ + server2: { url: 'http://localhost:8081' }, + }); + }); + + it('should prioritize mcp server flag if set ', async () => { + process.argv = [ + 'node', + 'script.js', + '--allowed-mcp-server-names', + 'server1', + ]; + const argv = await parseArguments(); + const settings: Settings = { + ...baseSettings, + excludeMCPServers: ['server1'], + allowMCPServers: ['server2'], + }; + const config = await loadCliConfig(settings, [], 'test-session', argv); + expect(config.getMcpServers()).toEqual({ + server1: { url: 'http://localhost:8080' }, + }); + }); }); describe('loadCliConfig extensions', () => { diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index d116bc67..bf76fa4c 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -274,6 +274,26 @@ export async function loadCliConfig( let mcpServers = mergeMcpServers(settings, activeExtensions); const excludeTools = mergeExcludeTools(settings, activeExtensions); + if (!argv.allowedMcpServerNames) { + if (settings.allowMCPServers) { + const allowedNames = new Set(settings.allowMCPServers.filter(Boolean)); + if (allowedNames.size > 0) { + mcpServers = Object.fromEntries( + Object.entries(mcpServers).filter(([key]) => allowedNames.has(key)), + ); + } + } + + if (settings.excludeMCPServers) { + const excludedNames = new Set(settings.excludeMCPServers.filter(Boolean)); + if (excludedNames.size > 0) { + mcpServers = Object.fromEntries( + Object.entries(mcpServers).filter(([key]) => !excludedNames.has(key)), + ); + } + } + } + if (argv.allowedMcpServerNames) { const allowedNames = new Set(argv.allowedMcpServerNames.filter(Boolean)); if (allowedNames.size > 0) { diff --git a/packages/cli/src/config/settings.test.ts b/packages/cli/src/config/settings.test.ts index 44de24fe..698ba745 100644 --- a/packages/cli/src/config/settings.test.ts +++ b/packages/cli/src/config/settings.test.ts @@ -223,6 +223,7 @@ describe('Settings Loading and Merging', () => { const systemSettingsContent = { theme: 'system-theme', sandbox: false, + allowMCPServers: ['server1', 'server2'], telemetry: { enabled: false }, }; const userSettingsContent = { @@ -234,6 +235,7 @@ describe('Settings Loading and Merging', () => { sandbox: false, coreTools: ['tool1'], contextFileName: 'WORKSPACE_CONTEXT.md', + allowMCPServers: ['server1', 'server2', 'server3'], }; (fs.readFileSync as Mock).mockImplementation( @@ -259,6 +261,7 @@ describe('Settings Loading and Merging', () => { telemetry: { enabled: false }, coreTools: ['tool1'], contextFileName: 'WORKSPACE_CONTEXT.md', + allowMCPServers: ['server1', 'server2'], }); }); diff --git a/packages/cli/src/config/settings.ts b/packages/cli/src/config/settings.ts index f0258db3..604e89dc 100644 --- a/packages/cli/src/config/settings.ts +++ b/packages/cli/src/config/settings.ts @@ -64,6 +64,8 @@ export interface Settings { toolCallCommand?: string; mcpServerCommand?: string; mcpServers?: Record<string, MCPServerConfig>; + allowMCPServers?: string[]; + excludeMCPServers?: string[]; showMemoryUsage?: boolean; contextFileName?: string | string[]; accessibility?: AccessibilitySettings; |
