fix(config): validate MCP server fields only when active

This commit is contained in:
Gabrielsv01 2026-05-09 09:37:47 -03:00
parent c1442a9b42
commit 1cff4f8d5a

View file

@ -307,6 +307,8 @@ export function ConfigPage() {
enabled: form.execEnabled, enabled: form.execEnabled,
} }
let mcpServersPatch: Record<string, Record<string, unknown> | null> = {}
if (form.mcpEnabled) {
const baselineServerNames = new Set( const baselineServerNames = new Set(
baseline.mcpServers baseline.mcpServers
.map((server) => server.name.trim()) .map((server) => server.name.trim())
@ -363,12 +365,14 @@ export function ConfigPage() {
const upsertServerEntries = normalizedServers.map((server) => { const upsertServerEntries = normalizedServers.map((server) => {
const deferredPatch = { deferred: server.deferredOverride } const deferredPatch = { deferred: server.deferredOverride }
const baselineServer = baselineServersByName.get(server.name) const baselineServer = baselineServersByName.get(server.name)
const shouldValidateServer = server.enabled
if (server.type !== "stdio") { if (server.type !== "stdio") {
if (server.url === "") { if (shouldValidateServer && server.url === "") {
throw new Error(`MCP server ${server.name} requires a URL.`) throw new Error(`MCP server ${server.name} requires a URL.`)
} }
if (shouldValidateServer) {
try { try {
const parsedURL = new URL(server.url) const parsedURL = new URL(server.url)
if ( if (
@ -382,6 +386,14 @@ export function ConfigPage() {
`MCP server ${server.name} requires a valid HTTP(S) URL.`, `MCP server ${server.name} requires a valid HTTP(S) URL.`,
) )
} }
}
const baselineHeaders = baselineServer
? parseJSONObjectField(
baselineServer.headersText,
`Saved MCP server ${server.name} headers`,
)
: {}
return [ return [
server.name, server.name,
@ -391,16 +403,13 @@ export function ConfigPage() {
type: server.type, type: server.type,
url: server.url, url: server.url,
headers: buildStringMapMergePatch( headers: buildStringMapMergePatch(
parseJSONObjectField( shouldValidateServer
? parseJSONObjectField(
server.headersText, server.headersText,
`MCP server ${server.name} headers`, `MCP server ${server.name} headers`,
),
baselineServer
? parseJSONObjectField(
baselineServer.headersText,
`Saved MCP server ${server.name} headers`,
) )
: {}, : baselineHeaders,
baselineHeaders,
), ),
command: null, command: null,
args: null, args: null,
@ -410,10 +419,17 @@ export function ConfigPage() {
] as const ] as const
} }
if (server.command === "") { if (shouldValidateServer && server.command === "") {
throw new Error(`MCP server ${server.name} requires a command.`) throw new Error(`MCP server ${server.name} requires a command.`)
} }
const baselineEnv = baselineServer
? parseJSONObjectField(
baselineServer.envText,
`Saved MCP server ${server.name} env`,
)
: {}
return [ return [
server.name, server.name,
{ {
@ -423,16 +439,13 @@ export function ConfigPage() {
command: server.command, command: server.command,
args: parseMultilineList(server.argsText), args: parseMultilineList(server.argsText),
env: buildStringMapMergePatch( env: buildStringMapMergePatch(
parseJSONObjectField( shouldValidateServer
? parseJSONObjectField(
server.envText, server.envText,
`MCP server ${server.name} env`, `MCP server ${server.name} env`,
),
baselineServer
? parseJSONObjectField(
baselineServer.envText,
`Saved MCP server ${server.name} env`,
) )
: {}, : baselineEnv,
baselineEnv,
), ),
env_file: server.envFile === "" ? null : server.envFile, env_file: server.envFile === "" ? null : server.envFile,
url: null, url: null,
@ -441,10 +454,11 @@ export function ConfigPage() {
] as const ] as const
}) })
const mcpServersPatch = Object.fromEntries([ mcpServersPatch = Object.fromEntries([
...upsertServerEntries, ...upsertServerEntries,
...removedServerEntries, ...removedServerEntries,
]) ])
}
if (form.execEnabled) { if (form.execEnabled) {
execConfigPatch.allow_remote = form.allowRemote execConfigPatch.allow_remote = form.allowRemote