diff --git a/docs/docs.json b/docs/docs.json
index 8b9c18701..3586cf6af 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -34,7 +34,8 @@
"pages": [
"fundamentals",
"fundamentals/apps-sdk",
- "fundamentals/mcp-apps"
+ "fundamentals/mcp-apps",
+ "fundamentals/client-support"
]
},
"quickstart/create-new-app",
diff --git a/docs/fundamentals/client-support.mdx b/docs/fundamentals/client-support.mdx
new file mode 100644
index 000000000..dbf436a08
--- /dev/null
+++ b/docs/fundamentals/client-support.mdx
@@ -0,0 +1,111 @@
+---
+title: Client Support
+sidebarTitle: Client Support
+description: "Support status and feature availability for Skybridge apps across ChatGPT, Claude, Goose, VSCode, and other MCP clients."
+---
+
+Skybridge apps run on two runtimes — **Apps SDK** (ChatGPT) and **MCP Apps** (open spec). This page maps each AI client to its runtime, shows which Skybridge features are available per client, and documents known client-specific behavior.
+
+## Client Overview
+
+| Client | Type | Runtime | Connection |
+|--------|------|---------|------------|
+| **ChatGPT** | General-purpose AI | Apps SDK (`window.openai`) | Public URL required |
+| **Claude** | General-purpose AI | MCP Apps (ext-apps) | Public URL required |
+| **Goose** | Desktop agent | MCP Apps (ext-apps) | Localhost OK |
+| **VSCode** | IDE | MCP Apps (ext-apps) | Localhost OK |
+| **Postman** | API tool | MCP Apps (ext-apps) | Localhost OK |
+| **MCPJam** | MCP inspector | MCP Apps (ext-apps) | Localhost OK |
+
+
+Coding agents (Claude Code, Codex CLI, Gemini CLI, Cursor, Amp) implement MCP for tool calling but are headless — they do not render iframes and cannot display views.
+
+
+All MCP Apps clients (Claude, Goose, VSCode, and others) share the same feature set because they all implement the same [ext-apps specification](https://github.com/modelcontextprotocol/ext-apps).
+
+## Feature Availability by Client
+
+| Hook / Feature | ChatGPT | Claude | Goose | VSCode |
+|----------------|:-------:|:------:|:-----:|:------:|
+| [useToolInfo](/api-reference/use-tool-info) | ✅ | ✅ | ✅ | ✅ |
+| [useCallTool](/api-reference/use-call-tool) | ✅ | ✅ | ✅ | ✅ |
+| [useSendFollowUpMessage](/api-reference/use-send-follow-up-message) | ✅ | ✅ | ✅ | ✅ |
+| [useOpenExternal](/api-reference/use-open-external) | ✅ | ✅ | ✅ | ✅ |
+| [useLayout](/api-reference/use-layout) | ✅ | ✅ | ✅ | ✅ |
+| [useUser](/api-reference/use-user) | ✅ | ✅ | ✅ | ✅ |
+| [useDisplayMode](/api-reference/use-display-mode) | ✅ | ✅ | ✅ | ✅ |
+| [useViewState](/api-reference/use-view-state) | ✅ | ⚠️ | ⚠️ | ⚠️ |
+| [data-llm](/api-reference/data-llm) | ✅ | ⚠️ | ⚠️ | ⚠️ |
+| [useRequestModal](/api-reference/use-request-modal) | ✅ | ⚠️ | ⚠️ | ⚠️ |
+| [useFiles](/api-reference/use-files) | ✅ | ❌ | ❌ | ❌ |
+| [useSetOpenInAppUrl](/api-reference/use-set-open-in-app-url) | ✅ | ❌ | ❌ | ❌ |
+| [useAppsSdkContext](/api-reference/use-apps-sdk-context) | ✅ | ❌ | ❌ | ❌ |
+| [useMcpAppContext](/api-reference/use-mcp-app-context) | ❌ | ✅ | ✅ | ✅ |
+
+## Client-Specific Notes
+
+### ChatGPT
+
+- **Runtime**: Apps SDK (`window.openai`) with MCP Apps compatibility layer
+- **Exclusive features**: `useFiles`, `useSetOpenInAppUrl`, and raw `window.openai` APIs not yet wrapped by Skybridge (`requestCheckout`, `requestClose`, `notifyIntrinsicHeight`)
+- **Tool accessibility**: Tools invoked from a view must set `_meta["openai/widgetAccessible"]: true`
+- **Caching**: ChatGPT aggressively caches views — use [DevTools](/devtools) for iteration and test in ChatGPT only for final validation
+- **Connection**: Requires a public URL. Run `npm run dev --tunnel` during development
+
+
+ChatGPT: tools must declare `_meta["openai/widgetAccessible"]: true`; MCP Apps: all tools accessible by default
+
+
+### Claude
+
+- **Runtime**: MCP Apps (ext-apps spec)
+- **Connection**: Requires a public URL. Run `npm run dev --tunnel` during development
+- **Setup**: **Settings → Connectors → Add Custom Connector**, then enter your `/mcp` URL
+
+
+`useViewState` and `data-llm` are polyfilled — state does not persist across view renders. `useRequestModal` is polyfilled — renders in-iframe instead of a host modal. All tools are accessible via `useCallTool` by default.
+
+
+### Goose
+
+- **Runtime**: MCP Apps (ext-apps spec)
+- **Connection**: Connects directly to `localhost` — no tunnel or public URL needed
+- **Setup**: Point Goose to `http://localhost:3000/mcp`
+- **Note**: Preferred for validating MCP Apps views during development because DevTools only mocks the Apps SDK (ChatGPT) runtime
+
+
+`useViewState` and `data-llm` are polyfilled — state does not persist across view renders. `useRequestModal` is polyfilled — renders in-iframe instead of a host modal. All tools are accessible via `useCallTool` by default.
+
+
+### VSCode
+
+- **Runtime**: MCP Apps (ext-apps spec)
+- **Connection**: Connects directly to `localhost` — no tunnel or public URL needed
+- **Setup**: Point your VSCode MCP config to `http://localhost:3000/mcp`
+
+
+`useViewState` and `data-llm` are polyfilled — state does not persist across view renders. `useRequestModal` is polyfilled — renders in-iframe instead of a host modal. All tools are accessible via `useCallTool` by default.
+
+
+## DevTools Runtime Coverage
+
+DevTools mocks the **Apps SDK runtime only** (mocked `window.openai`). MCP Apps view rendering is not supported in DevTools.
+
+| Environment | Runtime |
+|-------------|---------|
+| DevTools (localhost) | Apps SDK (ChatGPT) — mocked |
+| ChatGPT | Apps SDK |
+| Claude | MCP Apps |
+| Goose | MCP Apps |
+| VSCode | MCP Apps |
+
+
+Always validate MCP Apps-specific behavior in a real client such as Goose or Claude before shipping. See [Fast Iteration](/concepts/fast-iteration) for the recommended development workflow.
+
+
+## Related
+
+- [Apps SDK (ChatGPT)](/fundamentals/apps-sdk) — ChatGPT runtime deep dive
+- [MCP Apps](/fundamentals/mcp-apps) — MCP Apps specification, protocol, and limitations
+- [Test Your App](/quickstart/test-your-app) — Step-by-step setup for each client
+- [API Reference](/api-reference#runtime-compatibility) — Complete hook compatibility matrix