{"record":{"id":"57d7a54d31a345d0","repo":"Hmbown/CodeWhale","slug":"unsupported-on-backend","errorCode":"unsupported_on_backend","errorMessage":"\"${name}\" is not implemented on the ${computer.platform ?? computer.transport} backend","messagePattern":"\"(.+?)\" is not implemented on the (.+?) backend","errorType":"error_code","errorClass":"ServerError","httpStatus":null,"severity":"error","filePath":"crates/tui/plugins/computer-use/mcp/server.mjs","lineNumber":997,"sourceCode":"        }\n      }\n      if (backendMethod === \"zoom\") bindZoomRaster(computer, zoomParent, args.region, ex.filesLocal ? data?.file ?? data?.path : null);\n      if (name === \"get_app_state\") {\n        data = observeState(computer, wireArgs.app_ref, data, args);\n      }\n      if (backendMethod === \"probe\") Object.assign(data, { via: ex.kind, app: ex.app ?? null });\n      if (backendMethod === \"probe\" && data?.app?.version && data.app.version !== APP_VERSION) {\n        // The helper owns the modules it loaded at start, so a plugin update\n        // without a helper restart serves the previous build's behavior. Say\n        // so instead of letting the agent debug a build that is not running.\n        data.app.bundled_version = APP_VERSION;\n        data.app.stale = true;\n        data.note = [data.note, `The running helper reports ${data.app.version} but this plugin is ${APP_VERSION} — restart the Codewhale Computer Use app to load the current build.`].filter(Boolean).join(\" \");\n      }\n    } else {\n      const backend = await getBackend(computer, binding);\n      if (typeof backend[backendMethod] !== \"function\") {\n        throw new ServerError(\"unsupported_on_backend\", `\"${name}\" is not implemented on the ${computer.platform ?? computer.transport} backend`);\n      }\n      const resolve = typeof backend.resolve_element === \"function\" ? (req) => backend.resolve_element(req) : null;\n      const prepared = await prepareArgs(computer, name, args, resolve, sink);\n      throwIfAborted();\n      await assertCurrentRoute(computer, binding);\n      if (controlStopped && !READ_ONLY_TOOLS.has(name)) throw new ServerError(\"control_stopped\", \"stop_computer_control is active; no further actions are permitted this session\");\n      inFlight++;\n      try {\n        dispatched = true;\n        data = name === \"type\"\n          ? await invokeType((tool, a) => backend[BACKEND_METHOD[tool] ?? tool](a), prepared)\n          : await backend[backendMethod](prepared);\n      } finally {\n        inFlight--;\n      }\n      await assertCurrentRoute(computer, binding, true);\n      if (Array.isArray(data)) data = { items: data }; // keep receipts objects\n      if (name === \"screenshot\") bindRaster(computer, data);","sourceCodeStart":979,"sourceCodeEnd":1015,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/plugins/computer-use/mcp/server.mjs#L979-L1015","documentation":"The Codewhale Computer Use MCP server resolves each tool call to a platform-specific backend (macOS/Windows/accessibility/remote via computer.transport). If the resolved backend object does not expose the method that implements the requested tool, the server refuses the call with code 'unsupported_on_backend' instead of dispatching it and failing opaquely. It means the tool exists in the catalog but is genuinely not implemented on the backend currently bound to the computer.","triggerScenarios":"Calling a tool whose BACKEND_METHOD is missing on the active backend — e.g. calling an accessibility-only tool on a computer whose transport is a remote agent, or calling a platform-specific action on a backend stub without that method. computer.platform ?? computer.transport is used to name the backend in the message.","commonSituations":"1) Targeting a remote/ssh computer with a tool the remote agent allow-list does not cover. 2) A stub/mock or partial backend used in development or tests lacking that tool's method. 3) Version skew where an older helper app does not yet implement a newly added tool. 4) Wrong computer selected (platform mismatch) in a multi-computer session.","solutions":["Check which computer/binding the tool call targets and switch to a computer whose platform/transport implements the tool (call computer_list to see available computers).","Consult the tool catalog to confirm the tool is supported for the current transport (REMOTE_TOOLS allow-list for remote agents); pick a supported equivalent tool.","Update/restart the Computer Use helper app so the backend build matches the plugin (see the stale-version note the server emits) — a missing method often means an old build.","If this is your own backend contribution, implement the missing backend[BACKEND_METHOD[tool]] method for that platform."],"exampleFix":"// before\ncall({ name: 'set_value', arguments: { computer_id: 'remote-agent-1', target: { type: 'element', index: 4 } } })\n// after — use a computer whose platform implements the tool\ncall({ name: 'set_value', arguments: { computer_id: 'local-mac-1', target: { type: 'element', index: 4 } } })","handlingStrategy":"try-catch","validationCode":"// Check the tool is dispatched to a backend that implements it (client-side knowledge)\nconst remote = computer.transport === 'ssh';\nif (remote && !REMOTE_TOOLS.has(toolName)) throw new Error(`${toolName} is not available on remote computers`);","typeGuard":"function backendSupports(backend, tool, methodMap) { return typeof backend?.[methodMap[tool] ?? tool] === 'function'; }","tryCatchPattern":"try {\n  const res = await callTool({ name: tool, arguments: args });\n} catch (e) {\n  if (e?.code === 'unsupported_on_backend') {\n    // switch computer or fall back to a supported tool\n    const computers = await callTool({ name: 'computer_list', arguments: {} });\n    console.error(`${e.message}; available: ${JSON.stringify(computers)}`);\n  } else throw e;\n}","preventionTips":["Call computer_list first and pick a computer whose platform/transport supports the tool","Keep the Computer Use helper app current — restart the app after plugin updates so backend methods exist","Maintain a per-transport capability list in your agent planner and filter tool choices by it","Handle code 'unsupported_on_backend' by retrying on a different computer rather than repeating the call"],"tags":["mcp","computer-use","backend","tool-dispatch"],"backgroundTag":"method-not-implemented","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}