Host matrix
Run mountly-mcp dev while you iterate. Ship the same dist/ artifacts to a
real host over the transport you choose.
Local preview
Section titled “Local preview”pnpm dev # scaffold: mountly-mcp dev --server ./server.mjsYou exercise handshake, CSP, tool results, and View-initiated tool calls. Open the App once in Claude or VS Code before you call it done.
Host status
Section titled “Host status”| Host | Status | Connect |
|---|---|---|
mountly-mcp dev |
Supported | Built-in AppBridge + sandbox proxy |
| Claude Desktop | Supported (stdio) | claude_desktop_config.json → node + serve-stdio.mjs |
| VS Code MCP | Supported (stdio) | .vscode/mcp.json → same stdio entry |
| ChatGPT | Supported (HTTP) | Developer mode connector → HTTPS /mcp; OpenAI extensions via @openai/mcp-extensions |
| Other SEP-1865 hosts | Untested here | Same manifest if the host implements ui:// |
“Untested” means this repo has no CI against that host. Do not assume coverage.
Stdio entry
Section titled “Stdio entry”Scaffolds ship serve-stdio.mjs:
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";import createServer from "./server.mjs";
const server = await createServer();await server.connect(new StdioServerTransport());Log to stderr. stdout is the JSON-RPC channel.
Claude Desktop
Section titled “Claude Desktop”~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{ "mcpServers": { "my-app": { "command": "node", "args": ["/absolute/path/to/serve-stdio.mjs"] } }}VS Code
Section titled “VS Code”.vscode/mcp.json:
{ "servers": { "my-app": { "type": "stdio", "command": "node", "args": ["${workspaceFolder}/serve-stdio.mjs"] } }}ChatGPT
Section titled “ChatGPT”Serve Streamable HTTP (typically /mcp) over HTTPS. Tunnel locally or deploy.
pnpm add @openai/mcp-extensions- Pass
openaiUion the View andopenaiUiToolMeta({ entrypoints: [...] })on tools viamountly-mcp/openai/server - In the View,
import { useOpenAIExtensions } from "mountly-mcp/react/openai" - ChatGPT → Settings → Security and login → Developer mode
- Plugins → + → paste
https://…/mcp→ Create - New chat, enable the connector, prompt a tool, or open a
globalentrypoint from Desktop sidebar
Mountly leaves OAuth and hosting to you. Refresh the connector after metadata changes.
ChatGPT-only surfaces
Section titled “ChatGPT-only surfaces”Plugin Extensions place the same View on extra ChatGPT surfaces via tool
openai/ui entrypoints. Every other host ignores them and renders the View inline.
Entrypoint type |
Surface |
|---|---|
global |
Sidebar panel (+ quickAction) |
thread |
Conversation panel |
file |
File viewer/editor by extensions |
settings |
Plugin settings |
MCP Events let your server notify ChatGPT through webhooks. They need an MCP 2.0
server (2026-07-28). mountly-mcp/events implements the draft spec; the package
README shows the wiring.
Before host smoke
Section titled “Before host smoke”npx mountly-mcp buildnpx mountly-mcp verify --strict --render--render fails blank Views in Chromium. Host screenshots stay manual until
each vendor exposes stable automation.
Text-only hosts
Section titled “Text-only hosts”Hosts without MCP Apps still get tool text: Mountly adds a JSON text block when
your handler returns only structuredContent. How it works.