summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/config/config.test.ts60
-rw-r--r--packages/cli/src/config/config.ts20
-rw-r--r--packages/cli/src/config/settings.test.ts3
-rw-r--r--packages/cli/src/config/settings.ts2
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;