---
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.
