feat: support disabling bundled mcp servers

This commit is contained in:
Affaan Mustafa
2026-04-05 14:37:28 -07:00
parent 1346f83b08
commit 786f46dad5
7 changed files with 283 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ const fs = require('fs');
const path = require('path');
const { writeInstallState } = require('../install-state');
const { filterMcpConfig, parseDisabledMcpServers } = require('../mcp-config');
function readJsonObject(filePath, label) {
let parsed;
@@ -124,6 +125,49 @@ function findHooksSourcePath(plan, hooksDestinationPath) {
return operation ? operation.sourcePath : null;
}
function isMcpConfigPath(filePath) {
const basename = path.basename(String(filePath || ''));
return basename === '.mcp.json' || basename === 'mcp.json';
}
function buildFilteredMcpWrites(plan) {
const disabledServers = parseDisabledMcpServers(process.env.ECC_DISABLED_MCPS);
if (disabledServers.length === 0) {
return [];
}
const writes = [];
for (const operation of plan.operations) {
if (!isMcpConfigPath(operation.destinationPath) || !operation.sourcePath || !fs.existsSync(operation.sourcePath)) {
continue;
}
let sourceConfig;
try {
sourceConfig = readJsonObject(operation.sourcePath, 'MCP config');
} catch {
continue;
}
if (!sourceConfig.mcpServers || typeof sourceConfig.mcpServers !== 'object' || Array.isArray(sourceConfig.mcpServers)) {
continue;
}
const filtered = filterMcpConfig(sourceConfig, disabledServers);
if (filtered.removed.length === 0) {
continue;
}
writes.push({
destinationPath: operation.destinationPath,
filteredConfig: filtered.config,
});
}
return writes;
}
function buildMergedSettings(plan) {
if (!plan.adapter || plan.adapter.target !== 'claude') {
return null;
@@ -177,6 +221,7 @@ function buildMergedSettings(plan) {
function applyInstallPlan(plan) {
const mergedSettingsPlan = buildMergedSettings(plan);
const filteredMcpWrites = buildFilteredMcpWrites(plan);
for (const operation of plan.operations) {
fs.mkdirSync(path.dirname(operation.destinationPath), { recursive: true });
@@ -198,6 +243,15 @@ function applyInstallPlan(plan) {
);
}
for (const writePlan of filteredMcpWrites) {
fs.mkdirSync(path.dirname(writePlan.destinationPath), { recursive: true });
fs.writeFileSync(
writePlan.destinationPath,
JSON.stringify(writePlan.filteredConfig, null, 2) + '\n',
'utf8'
);
}
writeInstallState(plan.installStatePath, plan.statePreview);
return {