diff --git a/.changeset/fix-mcp-network-list-validation.md b/.changeset/fix-mcp-network-list-validation.md new file mode 100644 index 00000000..467ea2d9 --- /dev/null +++ b/.changeset/fix-mcp-network-list-validation.md @@ -0,0 +1,5 @@ +--- +'@sei-js/mcp-server': patch +--- + +Return MCP validation errors for unsupported `compare_networks` entries instead of throwing an internal error. diff --git a/packages/mcp-server/src/core/prompts.ts b/packages/mcp-server/src/core/prompts.ts index 2d6a4a4e..607c264d 100644 --- a/packages/mcp-server/src/core/prompts.ts +++ b/packages/mcp-server/src/core/prompts.ts @@ -5,26 +5,24 @@ import { isWalletEnabled } from './config.js'; const networkListSchema = z .string() - .superRefine((value, context) => { + .transform((value, context) => { const networks = value.split(',').map((network) => network.trim()); if (networks.length === 0 || networks.some((network) => network.length === 0)) { context.addIssue({ code: z.ZodIssueCode.custom, message: 'At least one supported network is required.' }); - return; + return z.NEVER; } + + const normalizedNetworks: string[] = []; for (const network of networks) { try { - normalizeNetwork(network); + normalizedNetworks.push(normalizeNetwork(network)); } catch { context.addIssue({ code: z.ZodIssueCode.custom, message: `Unsupported network: ${network}` }); } } + + return normalizedNetworks.length === networks.length ? normalizedNetworks.join(',') : z.NEVER; }) - .transform((value) => - value - .split(',') - .map((network) => normalizeNetwork(network.trim())) - .join(',') - ) .describe("Comma-separated supported networks (for example, 'sei,1328' or '0x531,sei-testnet')."); /**