“Resource not found: ui://”

A tool links a view by _meta.ui.resourceUri, the host asked for exactly that URI with resources/read, and the server has no resource registered under it. The three common causes: (1) The URI in the tool and the URI the resource is registered at differ: a typo, a version suffix (ui://board/v2.html), a trailing slash, or a scheme other than ui://. To tell: The doctor fails at resource-read and names the URI the tool links; compare it with the registered one character by character. (2) The resource is registered only for some sessions: behind a capability check the host did not pass, or on a per-request server that registers tools but not resources. To tell: The doctor (which declares MCP Apps support) reads it, but the failing host does not; or it fails only after the first request in a stateless deploy. (3) A deploy renamed the view while a host still holds the old tool definition: ChatGPT keeps a published tool's previous definition until the update passes review, and may cache resource contents for up to an hour. To tell: The doctor passes against the new deploy; the failing URI is the old one. OpenAI asks you to keep each published UI resource URI working. One command shows which: npx --allow-git=root github:agentwares/mcp-apps-doctor https://your-server.example/mcp.

Check your server now

npx --allow-git=root github:agentwares/mcp-apps-doctor https://your-server.example/mcp

Discovery only: no credential, no tool called. It prints the first broken step, whose it is, and the fix with its source, and shows the view in a sandboxed preview.

Who prints it

The server's MCP SDK, in its answer to the host's resources/read (`Resource not found: ui://…` in the TypeScript SDK, `Resource ui://… not found` in its 1.x line), shown in a host's logs or MCP Inspector.

The three causes, and how to tell them apart

  1. Cause 1. The URI in the tool and the URI the resource is registered at differ: a typo, a version suffix (ui://board/v2.html), a trailing slash, or a scheme other than ui://.
    The check flags it at resource-read. The doctor fails at resource-read and names the URI the tool links; compare it with the registered one character by character.
  2. Cause 2. The resource is registered only for some sessions: behind a capability check the host did not pass, or on a per-request server that registers tools but not resources.
    The check cannot see this one from outside: it happens inside the host or the portal. The doctor (which declares MCP Apps support) reads it, but the failing host does not; or it fails only after the first request in a stateless deploy.
  3. Cause 3. A deploy renamed the view while a host still holds the old tool definition: ChatGPT keeps a published tool's previous definition until the update passes review, and may cache resource contents for up to an hour.
    The check cannot see this one from outside: it happens inside the host or the portal. The doctor passes against the new deploy; the failing URI is the old one. OpenAI asks you to keep each published UI resource URI working.

Sources and public reports

Keep checking

agentcheck's free watch checks this server every hour and emails when it stops answering or its tool list changes; no account. It does not re-read the ui:// views.

mcpcheck Server Pro diffs the server's tool catalog every night — removed tools, tightened schemas, changed descriptions — with the client-compat matrix, OAuth conformance and 90 days of history; $49 a server a month, first run free. It does not re-run these MCP Apps checks.

Other messages

Written 8 October 2026 from the sources above. The MCP Apps check · MCP Liveness · Terms · Privacy