{"record":{"id":"217dc611237e3f28","repo":"can1357/oh-my-pi","slug":"mcp-error-mcpresponse-error-message","errorCode":null,"errorMessage":"MCP error: ${mcpResponse.error.message}","messagePattern":"MCP error: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/web/search/providers/exa.ts","lineNumber":408,"sourceCode":"\t\t\t`Exa MCP request failed (${response.status}): ${errorText}`,\n\t\t\tresponse.status,\n\t\t);\n\t}\n\tconst mcpResponse = parseSSE(await response.text()) as {\n\t\tresult?: {\n\t\t\tcontent?: Array<{ type: string; text?: string }>;\n\t\t\tisError?: boolean;\n\t\t};\n\t\terror?: {\n\t\t\tcode: number;\n\t\t\tmessage: string;\n\t\t};\n\t} | null;\n\tif (!mcpResponse) {\n\t\tthrow new Error(\"Failed to parse MCP response\");\n\t}\n\tif (mcpResponse.error) {\n\t\tthrow new Error(`MCP error: ${mcpResponse.error.message}`);\n\t}\n\tif (mcpResponse.result?.isError) {\n\t\tconst message = mcpResponse.result.content\n\t\t\t?.find(item => item.type === \"text\" && typeof item.text === \"string\")\n\t\t\t?.text?.trim();\n\t\tthrow new SearchProviderError(\"exa\", message || \"Exa MCP returned an error\");\n\t}\n\tconst responsePayload = normalizeExaMcpPayload(mcpResponse.result);\n\tif (isSearchResponse(responsePayload)) {\n\t\treturn responsePayload as ExaSearchResponse;\n\t}\n\n\tconst parsed = parseExaMcpTextPayload(responsePayload);\n\tif (parsed) {\n\t\treturn parsed;\n\t}\n\n\tthrow new Error(\"Exa MCP search returned unexpected response shape.\");","sourceCodeStart":390,"sourceCodeEnd":426,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/web/search/providers/exa.ts#L390-L426","documentation":"The MCP JSON-RPC response contained a top-level error object. The provider surfaces the server's error message as 'MCP error: <message>'. This is the MCP protocol's way of reporting request-level failures (auth, invalid params, server-side rejection).","triggerScenarios":"The Exa MCP server returned { error: { code, message } } in its JSON-RPC response — e.g. invalid request parameters, authentication rejection at the protocol level, or server-side handling failure.","commonSituations":"Malformed or unsupported search parameters forwarded to MCP; keyless quota violations surfaced as protocol errors; Exa MCP server bugs.","solutions":["Read the embedded <message> for the server's exact complaint.","Validate/adjust the search parameters being sent (query, numResults).","Retry if the message suggests a transient server issue.","Switch to the REST API with an API key, which returns more standard HTTP errors."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const res = await searchExa({ query });\n} catch (e) {\n  if (e instanceof Error && e.message.startsWith(\"MCP error:\")) {\n    // server-side protocol error; inspect message, adjust params or retry\n  } else throw e;\n}","preventionTips":["Send only documented search parameters to the MCP tool","Read the embedded server message before retrying","Keep request payloads minimal to avoid parameter rejection","Fall back to REST if MCP protocol errors persist"],"tags":["mcp","json-rpc","exa","search-provider","protocol-error"],"backgroundTag":"mcp-protocol-error","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}