gildas-lormeau/SingleFile · error · Error

data.error.message

Error message

data.error.message

What it means

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.

Source

Thrown at src/lib/mcp/mcp.js:190

    const headers = {
        [CONTENT_TYPE_HEADER]: JSON_CONTENT_TYPE,
        "Accept": "application/json, text/event-stream"
    };
    if (authToken) {
        headers.Authorization = `Bearer ${authToken}`;
    }
    const response = await fetch(serverUrl, {
        method: "POST",
        headers,
        body: JSON.stringify(requestBody),
        signal
    });
    if (!response.ok) {
        throw new Error(`MCP server error: ${response.status} ${response.statusText}`);
    }
    const data = await response.json();
    if (data.error) {
        throw new Error(data.error.message);
    }
    return { success: true };
}

function splitFilename(filename) {
    let filenameWithoutExtension = filename;
    let extension = EMPTY_STRING;
    const indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);
    if (indexExtensionSeparator > -1) {
        filenameWithoutExtension = filename.substring(0, indexExtensionSeparator);
        extension = filename.substring(indexExtensionSeparator + 1);
    }
    let indexFilename;
    ({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));
    return { filenameWithoutExtension, extension, indexFilename };
}

function extractIndexFilename(filenameWithoutExtension) {

View on GitHub (pinned to 517fb7c5cf)

Solutions

  1. Inspect data.error.message (and data.error.code/data) — it contains the server's actual rejection reason
  2. Validate the JSON-RPC payload (method name and params) against the MCP server's advertised capabilities/tools list
  3. Confirm the authenticated server identity has permission to write the target resource
  4. Upgrade/downgrade client or server so method names and params match the negotiated protocol version

Example fix

// before
if (data.error) {
  throw new Error(data.error.message);
}
// after
if (data.error) {
  const err = new Error(`MCP ${data.error.code ?? ""}: ${data.error.message}`);
  err.data = data.error.data;
  throw err;
}
Defensive patterns

Strategy: type-guard

Validate before calling

const spec = await fetch(`${mcpServerUrl}/capabilities`).then(r => r.json());
if (!spec.tools?.includes(requestedMethod)) throw new Error(`Method ${requestedMethod} not supported by MCP server`);

Type guard

function hasRpcError(data) {
  return data !== null && typeof data === "object" && "error" in data &&
    data.error !== null && typeof data.error === "object" && typeof data.error.message === "string";
}

Try / catch

try {
  await writeFile(path, content);
} catch (e) {
  // error message came from data.error.message; log server-side detail
  console.error("MCP request rejected:", e.message);
  if (/permission|forbidden/i.test(e.message)) throw new Error(`No write access for ${path}`);
  throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of gildas-lormeau/SingleFile@517fb7c5cf (2026-09-01). Data as JSON: /api/errors/63fa596ff28d99a5. Report an issue: GitHub.