Skip to main content
Common Skybridge errors, grouped by symptom, each with its cause and fix.

Typed hooks report “Property does not exist on type”

The hooks came from skybridge/web instead of the generated helpers.ts. The bare hooks aren’t typed against your server; only the generated ones carry your tool names, inputs, and outputs.
import { useCallTool } from "skybridge/web"; 
import { useCallTool } from "../helpers.js"; 

Tool names don’t autocomplete

Type inference needs the server to export its type and helpers.ts to consume it, with every tool registered by method chaining so it lands in AppType.
import { McpServer } from "skybridge/server";

const server = new McpServer({ name: "shop", version: "0.0.1" })
  .registerTool(/* search-products */)
  .registerTool(/* create-checkout */); // chained, so AppType captures both

export type AppType = typeof server;
A tool registered on its own statement is invisible to inference. See generateHelpers for the full setup.

A hook throws or returns isError

Some hooks only work on one host. Skybridge picks the runtime at load, and calling a host-specific hook on the other one fails, either throwing or returning { isError: true }. Check that each hook runs on the host your view targets .

A hook has no effect

useDownload, useRequestModal, and setDisplayMode must be user-initiated. Hosts reject calls fired from an effect on mount, with no visible result. Trigger them from a click or menu action instead.

The view loads in DevTools but breaks in a real host

DevTools runs a loose CSP, so violations don’t surface locally. Production enforces the policy and blocks any origin the view didn’t declare. List every domain the view reaches in the tool’s CSP config, then confirm through the tunnel or the Audit. See Configure CSP for the field reference.

DevTools fails to authenticate with invalid_client

DevTools cached an OAuth registration that the server no longer recognizes, after you switched servers or rotated credentials. Click Sign out in the DevTools header to clear it and force a fresh registration on the next connect.

Go Further

Configure CSP

Let your views reach the domains they need

Audit

Validate before submission