--- title: Interaction Types description: "The five view → host interaction types in enpilink — tool, prompt, link, intent, and notify — and exactly how each behaves per runtime." --- mcp-ui defines **five** ways a view can talk *back* to its host — `tool`, `prompt`, `link`, `intent`, and `notify`. enpilink supports **all five**. Views never call `postMessage` directly — every interaction routes through the framework's `Adaptor`, which has one implementation per runtime (MCP Apps and the ChatGPT Apps SDK). | Interaction | Hook | What it does | |---|---|---| | `tool` | [`useCallTool`](/api-reference/use-call-tool) | Call one of your MCP tools from the view and render the result. | | `prompt` | [`useSendFollowUpMessage`](/api-reference/use-send-follow-up-message) | Send a text/follow-up message to the model. | | `link` | [`useOpenExternal`](/api-reference/use-open-external) | Open an external URL via the host. | | `intent` | [`useIntent`](/api-reference/use-intent) | Express a high-level intent for the host to route. | | `notify` | [`useNotify`](/api-reference/use-notify) | Surface a status/notification to the host. | ## Per-runtime support (be honest about this) `tool`, `prompt`, and `link` are real, first-class interactions on both runtimes. `notify` and `intent` are **best-effort**: a host that doesn't implement them degrades to a no-op (or a log line) — they never throw and never send anything a compliant host would reject. | Interaction | MCP Apps (Claude, Goose, VSCode…) | ChatGPT Apps SDK | Console / local playground | |---|---|---|---| | `tool` | ✅ real (`tools/call`) | ✅ real | ✅ executes for real | | `prompt` | ✅ real (`app.sendMessage`) | ✅ real | logged only (no local model turn) | | `link` | ✅ real (`ui/open-link`) | ✅ real | ✅ opens in a new tab | | `notify` | ✅ **real** MCP `notifications/message` (via `app.sendLog`) | ⚠️ enpilink extension (`window.openai.notify` hook, else `postMessage`) | shown in the Logs drawer | | `intent` | ⚠️ enpilink extension (best-effort over `notifications/message`, `logger: "enpilink/intent"`) | ⚠️ enpilink extension (`window.openai.sendIntent` hook, else `postMessage`) | shown in the Logs drawer | Notes: - **`notify` on MCP Apps is the real protocol.** It emits the standard MCP `notifications/message` notification, so a spec-compliant host actually receives it. The syslog level set has no `"success"`, so `level: "success"` is coerced to `"info"` (the original level is preserved in the payload). - **`intent` has no equivalent in either spec.** It is an enpilink extension on both runtimes — useful for your own host integrations, but treat it as optional, not guaranteed. ## MCP Apps compliance enpilink is a compliant **MCP Apps** framework. The `mcp-app` adaptor is built on the official [`@modelcontextprotocol/ext-apps`](https://github.com/modelcontextprotocol/ext-apps) extension (stable spec `2026-01-26`) — the `App` class and `ui://` UI resources. enpilink serves both `ui://views/ext-apps/*` (MCP Apps) and `ui://views/apps-sdk/*` (ChatGPT Apps SDK) so the same view runs in both runtimes. The two new interaction types were designed to stay within the spec: `notify` uses a real protocol notification, and `intent` is delivered over the same legitimate channel so a compliant host never rejects it.