{"record":{"id":"63fa596ff28d99a5","repo":"gildas-lormeau/SingleFile","slug":"data-error-message","errorCode":null,"errorMessage":"data.error.message","messagePattern":"data\\.error\\.message","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/lib/mcp/mcp.js","lineNumber":190,"sourceCode":"    const headers = {\n        [CONTENT_TYPE_HEADER]: JSON_CONTENT_TYPE,\n        \"Accept\": \"application/json, text/event-stream\"\n    };\n    if (authToken) {\n        headers.Authorization = `Bearer ${authToken}`;\n    }\n    const response = await fetch(serverUrl, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(requestBody),\n        signal\n    });\n    if (!response.ok) {\n        throw new Error(`MCP server error: ${response.status} ${response.statusText}`);\n    }\n    const data = await response.json();\n    if (data.error) {\n        throw new Error(data.error.message);\n    }\n    return { success: true };\n}\n\nfunction splitFilename(filename) {\n    let filenameWithoutExtension = filename;\n    let extension = EMPTY_STRING;\n    const indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);\n    if (indexExtensionSeparator > -1) {\n        filenameWithoutExtension = filename.substring(0, indexExtensionSeparator);\n        extension = filename.substring(indexExtensionSeparator + 1);\n    }\n    let indexFilename;\n    ({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));\n    return { filenameWithoutExtension, extension, indexFilename };\n}\n\nfunction extractIndexFilename(filenameWithoutExtension) {","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/gildas-lormeau/SingleFile/blob/517fb7c5cf2096d89933b747e862d8ecf616a9f9/src/lib/mcp/mcp.js#L172-L208","documentation":"After a successful HTTP response, writeFile() parses the JSON body and throws this error if the MCP server responded with a JSON-RPC error object (data.error). Unlike error 50, the transport succeeded but the server rejected the request at the protocol level; the message comes straight from data.error.message.","triggerScenarios":"The MCP server returns HTTP 200 with a body like {\"error\":{\"message\":\"...\"}}: invalid JSON-RPC method name, malformed params, permission denied for the write operation, or the target file/resource is not writable by the server.","commonSituations":"Calling a tool/resource name the MCP server does not expose; sending params that fail server-side schema validation; the server account lacking write permissions on the target path; MCP server version mismatch where the method was renamed.","solutions":["Inspect data.error.message (and data.error.code/data) — it contains the server's actual rejection reason","Validate the JSON-RPC payload (method name and params) against the MCP server's advertised capabilities/tools list","Confirm the authenticated server identity has permission to write the target resource","Upgrade/downgrade client or server so method names and params match the negotiated protocol version"],"exampleFix":"// before\nif (data.error) {\n  throw new Error(data.error.message);\n}\n// after\nif (data.error) {\n  const err = new Error(`MCP ${data.error.code ?? \"\"}: ${data.error.message}`);\n  err.data = data.error.data;\n  throw err;\n}","handlingStrategy":"type-guard","validationCode":"const spec = await fetch(`${mcpServerUrl}/capabilities`).then(r => r.json());\nif (!spec.tools?.includes(requestedMethod)) throw new Error(`Method ${requestedMethod} not supported by MCP server`);","typeGuard":"function hasRpcError(data) {\n  return data !== null && typeof data === \"object\" && \"error\" in data &&\n    data.error !== null && typeof data.error === \"object\" && typeof data.error.message === \"string\";\n}","tryCatchPattern":"try {\n  await writeFile(path, content);\n} catch (e) {\n  // error message came from data.error.message; log server-side detail\n  console.error(\"MCP request rejected:\", e.message);\n  if (/permission|forbidden/i.test(e.message)) throw new Error(`No write access for ${path}`);\n  throw e;\n}","preventionTips":["Validate request params against the MCP server's advertised schema before sending","Negotiate/verify protocol version with the server","Check server-side permissions for the authenticated identity","Include data.error.code/data when rethrowing for better diagnostics"],"tags":["json-rpc","mcp","api-error"],"backgroundTag":"json-rpc-error-response","analyzedSha":"517fb7c5cf2096d89933b747e862d8ecf616a9f9","analyzedAt":"2026-09-01T10:05:25.770Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}