mountly-mcp 4.0.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/GLOSSARY.md +37 -0
  2. package/README.md +103 -190
  3. package/dist/add-DAFMA4F3.js +263 -0
  4. package/dist/add-DAFMA4F3.js.map +1 -0
  5. package/dist/add.d.ts +13 -0
  6. package/dist/chunk-EOWAWZH2.js +34 -0
  7. package/dist/chunk-EOWAWZH2.js.map +1 -0
  8. package/dist/{chunk-KWVGW5Q7.js → chunk-GN2IQYV3.js} +1 -1
  9. package/dist/chunk-GN2IQYV3.js.map +1 -0
  10. package/dist/{chunk-UECZA34Q.js → chunk-OWAXBNZA.js} +10 -5
  11. package/dist/chunk-OWAXBNZA.js.map +1 -0
  12. package/dist/cli.js +97 -25
  13. package/dist/cli.js.map +1 -1
  14. package/dist/compose/index.d.ts +48 -0
  15. package/dist/compose/index.js +141 -0
  16. package/dist/compose/index.js.map +1 -0
  17. package/dist/connect-server-P2UZ62YC.js +7 -0
  18. package/dist/create.js +43 -15
  19. package/dist/create.js.map +1 -1
  20. package/dist/dev/host-entry.js +7 -0
  21. package/dist/dev/index.js +2 -2
  22. package/dist/doctor-B54H6CRN.js +122 -0
  23. package/dist/doctor-B54H6CRN.js.map +1 -0
  24. package/dist/doctor.d.ts +16 -0
  25. package/dist/errors-4ERW7HZB.js +11 -0
  26. package/dist/errors-4ERW7HZB.js.map +1 -0
  27. package/dist/errors.d.ts +25 -0
  28. package/dist/json-render/index.js +4 -4
  29. package/package.json +17 -5
  30. package/templates/react/README.md.tmpl +83 -6
  31. package/templates/react/package.json.tmpl +2 -0
  32. package/templates/react/serve-stdio.mjs.tmpl +9 -0
  33. package/templates/react/server.mjs.tmpl +6 -1
  34. package/templates/react/src/view.tsx.tmpl +1 -1
  35. package/templates/svelte/README.md.tmpl +27 -4
  36. package/templates/svelte/package.json.tmpl +2 -0
  37. package/templates/svelte/serve-stdio.mjs.tmpl +5 -0
  38. package/templates/svelte/server.mjs.tmpl +6 -1
  39. package/templates/svelte/src/Dashboard.svelte.tmpl +1 -1
  40. package/templates/vanilla/README.md.tmpl +27 -11
  41. package/templates/vanilla/package.json.tmpl +2 -0
  42. package/templates/vanilla/serve-stdio.mjs.tmpl +5 -0
  43. package/templates/vanilla/server.mjs.tmpl +6 -1
  44. package/templates/vanilla/src/view.ts.tmpl +1 -1
  45. package/templates/vue/README.md.tmpl +27 -4
  46. package/templates/vue/package.json.tmpl +2 -0
  47. package/templates/vue/serve-stdio.mjs.tmpl +5 -0
  48. package/templates/vue/server.mjs.tmpl +6 -1
  49. package/templates/vue/src/Dashboard.vue.tmpl +1 -1
  50. package/dist/chunk-KWVGW5Q7.js.map +0 -1
  51. package/dist/chunk-UECZA34Q.js.map +0 -1
  52. package/dist/connect-server-7L4HGKKL.js +0 -7
  53. /package/dist/{connect-server-7L4HGKKL.js.map → connect-server-P2UZ62YC.js.map} +0 -0
package/GLOSSARY.md ADDED
@@ -0,0 +1,37 @@
1
+ # Mountly MCP glossary
2
+
3
+ Public vocabulary for `mountly-mcp`. Skills, templates, CLI help, README, and
4
+ docs must use these names.
5
+
6
+ | Term | Meaning |
7
+ | ------------------------ | -------------------------------------------------------------------------------------------- |
8
+ | **App** | MCP server plus its Views (SEP-1865 product). |
9
+ | **View** | Iframe UI for a tool result (`ui://` resource). |
10
+ | **`ui://`** | Required scheme for View resource URIs. |
11
+ | **`createMcpView`** | Wrap a React / Vue / Svelte component (`mountly-mcp/react` etc.). Vanilla: `publishMcpView`. |
12
+ | **`mountlyMcpViews`** | Vite plugin. Emits View HTML and `dist/mountly-mcp.manifest.json`. |
13
+ | **`registerMcpApps`** | Install Views and UI-linked tools on an unconnected `McpServer`. |
14
+ | **`readMcpAppManifest`** | Load `dist/mountly-mcp.manifest.json` from `mountly-mcp/artifact`. |
15
+ | **`mcp.fixtures.json`** | Named samples for `mountly-mcp dev` (tool args with `--server`, else `structuredContent`). |
16
+ | **`create`** | `mountly-mcp create`: scaffold a greenfield App. |
17
+ | **`add`** | `mountly-mcp add`: add a second View to an existing Mountly Vite project. |
18
+ | **`build`** | `mountly-mcp build`: build Views via Vite. |
19
+ | **`dev`** | `mountly-mcp dev`: local sandboxed AppBridge host with live reload. |
20
+ | **`verify`** | `mountly-mcp verify`: conformance (`--strict`, `--render`). |
21
+ | **`doctor`** | `mountly-mcp doctor`: check Node, Vite plugin, Playwright, peer floors. |
22
+
23
+ ## Do not put in MCP docs / skills / templates
24
+
25
+ - Islands vocabulary, HTML island attributes, microfrontends
26
+ - Cloning `jagreehal/mountly` or `modelcontextprotocol/ext-apps` for greenfield Views
27
+ - Hand-writing View HTML or postMessage for Views
28
+ - Calling Mountly the "default view layer" until hosts recommend it
29
+
30
+ ## Happy path
31
+
32
+ ```bash
33
+ npx mountly-mcp create my-app --framework react # react | vue | svelte | vanilla
34
+ cd my-app && pnpm install && pnpm dev
35
+ pnpm verify
36
+ pnpm verify --strict --render # CI
37
+ ```
package/README.md CHANGED
@@ -1,12 +1,16 @@
1
1
  # mountly-mcp
2
2
 
3
- **Build MCP Apps from React, Vue, or Svelte components — new or existing.**
3
+ Build MCP Apps Views from React, Vue, or Svelte. New apps or components you
4
+ already ship.
4
5
 
5
- [MCP Apps](https://github.com/modelcontextprotocol/ext-apps) (SEP-1865) lets an
6
- MCP server render interactive UI inside Claude, ChatGPT and other hosts. The
7
- official SDK gives you the protocol. `mountly-mcp` is the view layer on top:
8
- write a component, get a `ui://` resource, a local host, and server registration
9
- without hand-writing the handshake HTML.
6
+ [MCP Apps](https://github.com/modelcontextprotocol/ext-apps) (SEP-1865) is the
7
+ protocol. Official packages speak the wire. `mountly-mcp` is the View kit:
8
+ component → `ui://` resource → local host → `registerMcpApps` on your server.
9
+
10
+ ```bash
11
+ npx mountly-mcp create my-app --framework react
12
+ cd my-app && pnpm install && pnpm dev
13
+ ```
10
14
 
11
15
  ```ts
12
16
  import { createMcpView } from "mountly-mcp/react";
@@ -15,81 +19,69 @@ import Dashboard from "./Dashboard";
15
19
  createMcpView(Dashboard);
16
20
  ```
17
21
 
18
- That path is the default whether the dashboard is three metric cards for one
19
- host or a multi-View production server. Prefer the scaffolder for greenfield:
22
+ `--framework`: `react` | `vue` | `svelte` | `vanilla`. Vanilla calls
23
+ `publishMcpView` with `mount` / `update` / `unmount`. No framework runtime.
20
24
 
21
- ```bash
22
- npx mountly-mcp create my-app --framework react
23
- cd my-app && pnpm install && pnpm dev
24
- ```
25
+ ## vs ext-apps
25
26
 
26
- `--framework` takes `react`, `vue`, `svelte`, or `vanilla`. Vanilla pulls in no
27
- framework and no adapter: a View is just `mount` / `update` / `unmount`, so
28
- `publishMcpView` takes the object directly and the bridge drives it the same
29
- way it drives the others.
27
+ | Need | Package |
28
+ | ------------------------------------------------------- | -------------------------------- |
29
+ | Host / bridge protocol | `@modelcontextprotocol/ext-apps` |
30
+ | Component → View → `dev` → `verify` → `registerMcpApps` | `mountly-mcp` |
30
31
 
31
- ## Build with Agent Skills
32
+ Details: [Mountly vs ext-apps](https://mountly.dev/mcp-apps/vs-ext-apps/).
32
33
 
33
- | Skill | Try it |
34
- | ---------------------------------------------------------------------------------- | ------------------------------------- |
35
- | [`create-mcp-app`](../../plugins/mountly-mcp/skills/create-mcp-app/SKILL.md) | _"Create an MCP App"_ |
36
- | [`add-app-to-server`](../../plugins/mountly-mcp/skills/add-app-to-server/SKILL.md) | _"Add UI to my MCP server"_ |
37
- | [`convert-web-app`](../../plugins/mountly-mcp/skills/convert-web-app/SKILL.md) | _"Turn my component into an MCP App"_ |
38
- | [`migrate-ext-apps`](../../plugins/mountly-mcp/skills/migrate-ext-apps/SKILL.md) | _"Migrate from ext-apps"_ |
34
+ ## Agent Skills
35
+
36
+ | Skill | Ask for |
37
+ | ---------------------------------------------------------------------------------- | ----------------------------------- |
38
+ | [`create-mcp-app`](../../plugins/mountly-mcp/skills/create-mcp-app/SKILL.md) | "Create an MCP App" |
39
+ | [`add-app-to-server`](../../plugins/mountly-mcp/skills/add-app-to-server/SKILL.md) | "Add UI to my MCP server" |
40
+ | [`convert-web-app`](../../plugins/mountly-mcp/skills/convert-web-app/SKILL.md) | "Turn my component into an MCP App" |
41
+ | [`migrate-ext-apps`](../../plugins/mountly-mcp/skills/migrate-ext-apps/SKILL.md) | "Migrate from ext-apps" |
39
42
 
40
43
  ```
41
44
  /plugin marketplace add jagreehal/mountly
42
45
  /plugin install mountly-mcp@mountly
43
46
  ```
44
47
 
45
- Docs: [Agent Skills](https://mountly.dev/mcp-apps/agent-skills/).
46
- `mountly-mcp build` emits a versioned App manifest; `registerMcpApps` installs
47
- the Views into the MCP server you already own. Existing website components stay
48
- reusable as-is.
49
-
50
- The wire protocol is delegated to the official `@modelcontextprotocol/sdk` and
51
- `@modelcontextprotocol/ext-apps` packages in full, so server transports,
52
- handshakes, capabilities and message types track the spec rather than a
53
- reimplementation of it. Both are runtime dependencies of `mountly-mcp`.
48
+ Or `npx skills add jagreehal/mountly`. Docs: [Agent Skills](https://mountly.dev/mcp-apps/agent-skills/).
54
49
 
55
50
  ## Install
56
51
 
57
52
  ```bash
58
- # React (default) — mountly + mountly-react included
53
+ # React (default). mountly + mountly-react are included.
59
54
  npm install mountly-mcp react react-dom
60
55
 
61
56
  # Vue / Svelte
62
57
  npm install mountly-mcp mountly-vue vue # or mountly-svelte + svelte
63
58
  ```
64
59
 
65
- Install `@modelcontextprotocol/sdk` directly only when your application imports
66
- its APIs itself, for example to configure a custom HTTP transport. Mountly's
67
- server entry point does not require a separate SDK install.
60
+ Add `@modelcontextprotocol/sdk` when you import `McpServer`.
68
61
 
69
- ## One build, one command
62
+ Peers: Node 20+ (22 preferred), React 18 or 19. Scaffolds pin Vite 8.
63
+ `npx mountly-mcp doctor` checks a project.
64
+
65
+ ## Build
70
66
 
71
67
  ```ts
72
68
  // vite.config.ts
73
- import vue from "@vitejs/plugin-vue";
69
+ import { defineConfig } from "vite";
70
+ import react from "@vitejs/plugin-react";
74
71
  import { mountlyMcpViews } from "mountly-mcp/vite";
75
72
 
76
73
  export default defineConfig({
77
74
  plugins: [
78
- vue(),
75
+ react(),
79
76
  mountlyMcpViews({
80
77
  apps: [
81
78
  {
82
- entry: "src/dashboard.ts",
79
+ entry: "src/view.tsx",
83
80
  uri: "ui://weather-server/dashboard",
84
81
  name: "weather_dashboard",
85
82
  displayModes: ["inline", "fullscreen"],
86
83
  csp: { connectDomains: ["https://api.weather.com"] },
87
84
  },
88
- {
89
- entry: "src/settings.ts",
90
- uri: "ui://weather-server/settings",
91
- name: "weather_settings",
92
- },
93
85
  ],
94
86
  }),
95
87
  ],
@@ -100,38 +92,19 @@ export default defineConfig({
100
92
  npx mountly-mcp build
101
93
  ```
102
94
 
103
- Each View is built in an isolated Vite environment and emitted as self-contained
104
- HTML with a transitional `.meta.json` file. The canonical
105
- `dist/mountly-mcp.manifest.json` gives build, dev, registration, and CI one
106
- versioned artifact contract. The original single-View plugin shape and
107
- `vite build` remain supported.
95
+ Writes HTML and `dist/mountly-mcp.manifest.json`.
108
96
 
109
- ## One command to develop it
97
+ ## Develop
110
98
 
111
99
  ```bash
112
- npx mountly-mcp dev
113
- # multi-View project
114
- npx mountly-mcp dev --app weather_dashboard
100
+ npx mountly-mcp dev --server ./server.mjs
101
+ npx mountly-mcp dev --app weather_dashboard --server ./server.mjs
115
102
  ```
116
103
 
117
- Builds the View, serves it in a local MCP Apps host, and rebuilds on save.
118
- Config comes from the plugin already in your vite config.
119
-
120
- It's a real host, not a preview: the published official `AppBridge` drives the
121
- handshake and host behavior, while Mountly supplies two origins and a sandbox
122
- proxy enforcing the CSP and permissions the App artifact declares. Sample tool
123
- results come from `mcp.fixtures.json`,
124
- one button each, so clicking between them exercises the update path:
125
-
126
- ```json
127
- { "annual": { "total": 99 }, "monthly": { "total": 12 } }
128
- ```
104
+ Real AppBridge host plus sandbox CSP. Tool arguments come from
105
+ `mcp.fixtures.json`.
129
106
 
130
- Add `--server ./server.js` (a module default-exporting your server) and the
131
- fixtures become tool _arguments_ instead: the view renders what your handler
132
- really returns, and the tool calls the view makes itself are routed there too.
133
-
134
- ## Install into your production server
107
+ ## Production server
135
108
 
136
109
  ```ts
137
110
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -153,152 +126,92 @@ await registerMcpApps(server, {
153
126
  config: {
154
127
  inputSchema: { type: "object", properties: { location: { type: "string" } } },
155
128
  },
156
- handler: async ({ location }) => ({ structuredContent: { location, temperature: 72 } }),
129
+ handler: async ({ location }) => ({
130
+ structuredContent: { location, temperature: 72 },
131
+ }),
157
132
  },
158
133
  ],
159
134
  });
135
+ // connect with YOUR transport after this
160
136
  ```
161
137
 
162
- Call `registerMcpApps` before connecting the server. Your application retains
163
- ownership of authentication, transport, prompts, non-UI tools, lifecycle, and
164
- deployment. Views and tools are independent, so several tools can link to one
165
- View and app-only tools use `visibility: "app"`. Mountly negotiates the UI
166
- extension and degrades to text-only model tools for hosts without MCP Apps.
167
-
168
- `createMcpAppServer` and `serveStdio` remain as convenience adapters for small
169
- servers and existing projects.
138
+ Call `registerMcpApps` before `connect`. You keep auth, transport, and deploy.
170
139
 
171
- ## Verify in CI
140
+ ## Verify
172
141
 
173
142
  ```bash
143
+ npx mountly-mcp doctor
174
144
  npx mountly-mcp verify
175
- npx mountly-mcp verify --strict
176
- npx mountly-mcp verify --render --strict
145
+ npx mountly-mcp verify --strict --render
177
146
  ```
178
147
 
179
- Static verification is deterministic and offline. `--render` additionally
180
- launches Chromium, waits for the explicit bridge mount state, and rejects Views
181
- that time out, throw, or mount without content. Errors always fail; advisory
182
- warnings fail only under `--strict`. The same engine is exported as
183
- `verifyMcpApps()` from `mountly-mcp/testing` for custom test runners. Install
184
- Playwright and Chromium for the browser tier.
185
-
186
- ## Reading tool data in a view
187
-
188
- The bridge exposes `mcp`, `toolInput`, `toolResult`, and `hostContext`. React
189
- and Vue consume those bridge props in their wrapper and expose them through
190
- hooks/composables, leaving the existing component's props unchanged. Svelte
191
- receives them directly as component props:
192
-
193
- ```tsx
194
- // React
195
- const result = useToolResult<{ structuredContent?: Quote }>();
196
- const quote = result?.structuredContent;
197
- useHostStyles(); // adopt the host's theme variables and fonts
198
- ```
148
+ ## Second View
199
149
 
200
- ```ts
201
- // Vue
202
- const result = useToolResult<{ structuredContent?: Quote }>(); // a ref
203
- const quote = computed(() => result.value?.structuredContent);
150
+ ```bash
151
+ npx mountly-mcp add settings --framework react
204
152
  ```
205
153
 
206
- Svelte reads the props directly via `$props()` — see `mountly-mcp/svelte`.
154
+ ## Glossary
207
155
 
208
- ## json-render MCP Apps integration
156
+ [GLOSSARY.md](./GLOSSARY.md). Protocol: [`@modelcontextprotocol/ext-apps`](https://www.npmjs.com/package/@modelcontextprotocol/ext-apps).
209
157
 
210
- Mountly now exposes a first-class json-render MCP facade so catalog-driven UIs
211
- can be shipped as MCP Apps with minimal protocol code:
158
+ ## Compose from teams' elements
159
+
160
+ `mountly-mcp/compose` lets the agent build a page from many teams' custom
161
+ elements, using a [`mountly-compose`](../mountly-compose/README.md) catalog read
162
+ from their `custom-elements.json`:
212
163
 
213
164
  ```ts
214
- import { createJsonRenderMcpApp } from "mountly-mcp/json-render/mcp";
215
- import { catalog } from "./catalog.js";
216
- import { html } from "./dist/app-html.js";
217
-
218
- const app = createJsonRenderMcpApp({
219
- name: "json-render-dashboard",
220
- version: "1.0.0",
221
- catalog,
222
- html,
223
- tool: {
224
- name: "render_ui",
225
- title: "Render UI",
226
- description: "Render an interactive dashboard from a json-render spec.",
227
- resourceUri: "ui://json-render-dashboard/view.html",
165
+ import { loadCatalog } from "mountly-compose";
166
+ import { registerComposeApp } from "mountly-mcp/compose";
167
+
168
+ registerComposeApp(server, {
169
+ catalog: await loadCatalog("https://cdn.acme.com/registry.json", { actions }),
170
+ imports: {
171
+ "mountly-compose": "https://cdn.acme.com/mountly-compose.js",
172
+ "@modelcontextprotocol/ext-apps": "https://cdn.acme.com/ext-apps/app-with-deps.js",
173
+ react: "…",
174
+ "react/jsx-runtime": "…",
175
+ "react-dom/client": "…",
176
+ "mountly-react": "…",
177
+ "mountly/embed": "…",
228
178
  },
229
179
  });
230
180
  ```
231
181
 
232
- For iframe-side React hosts, use `mountly-mcp/json-render/app`:
233
-
234
- ```tsx
235
- import { useJsonRenderApp } from "mountly-mcp/json-render/app";
182
+ The catalog becomes `show_page`'s description, and the agent composes the page.
183
+ The handler validates the page and repairs small mistakes. When a page needs
184
+ more than a repair, the handler returns the reasons as a tool error for the
185
+ agent to fix. The `ui://` view renders with `mountly-compose` and loads each
186
+ team's embed on first use. Its CSP allows the origins in `imports` and the
187
+ teams' embed origins. The view runs at a `null` origin, so the servers behind
188
+ those URLs send `Access-Control-Allow-Origin`. When the user acts in a widget,
189
+ the view sends the agent its next turn with the current page. The
190
+ [`ai-compose`](../../docs/examples/ai-compose) example runs this in `mcp/`.
236
191
 
237
- function View() {
238
- const { spec, loading, connected, error } = useJsonRenderApp({
239
- name: "json-render-dashboard",
240
- version: "1.0.0",
241
- });
242
-
243
- if (error) return <div>{error.message}</div>;
244
- if (!connected || loading || !spec) return <div>Waiting…</div>;
245
- return <pre>{JSON.stringify(spec, null, 2)}</pre>;
246
- }
247
- ```
192
+ ## Advanced: json-render
248
193
 
249
- `buildAppHtml({ title, js, css })` is also exported from
250
- `mountly-mcp/json-render/app` to generate a self-contained HTML resource.
251
-
252
- ### Interoperability with `@json-render/mcp`
253
-
254
- Mountly's facade is wire-compatible with [`@json-render/mcp`](https://www.npmjs.com/package/@json-render/mcp) in both
255
- directions, so you can mix the two without a bridge:
256
-
257
- - **Tool input** is `{ spec }`, typed from `catalog.zodSchema()`, and the tool
258
- description carries `catalog.prompt()` — the model sees the full component
259
- vocabulary.
260
- - **Tool output** carries the spec twice: as JSON in `content[0].text` (the
261
- shape `@json-render/mcp`'s iframe hook reads) and as `structuredContent.spec`
262
- (what Mountly's own hosts read).
263
- - **`useJsonRenderApp`** reads either shape, so an iframe built with Mountly
264
- renders a `@json-render/mcp` server unchanged, and vice versa.
265
-
266
- One deliberate difference: `@json-render/core` 0.19 generates a _strict_ catalog
267
- schema that requires `visible` and `children` on every element, which rejects
268
- most first-attempt model output at the SDK's input gate. Mountly accepts the
269
- catalog schema **or** a looser spec shape, then validates in the handler and
270
- renders what it can. Drop the loose branch once core relaxes those fields.
194
+ `mountly-mcp/json-render` is optional catalog-driven UI. Start with `create` /
195
+ `createMcpView`. Docs: [Generative UI](https://mountly.dev/concepts/generative-ui/).
271
196
 
272
197
  ## Exports
273
198
 
274
- | Entry | What's in it |
275
- | ---------------------- | ------------------------------------------------------- |
276
- | `mountly-mcp` | `runBridge`, spec types re-exported from ext-apps |
277
- | `mountly-mcp/react` | `createMcpView` + hooks |
278
- | `mountly-mcp/vue` | `createMcpView` + composables |
279
- | `mountly-mcp/svelte` | `createMcpView` (props-based) |
280
- | `mountly-mcp/vite` | single- and multi-View `mountlyMcpViews()` build plugin |
281
- | `mountly-mcp/artifact` | versioned manifest and App artifact APIs |
282
- | `mountly-mcp/dev` | `startDevHost()` and in-process server connectivity |
283
- | `mountly-mcp/build` | `buildMcpResource` for other bundlers |
284
- | `mountly-mcp/server` | `registerMcpApps` plus convenience server adapters |
285
- | `mountly-mcp/testing` | static/browser conformance and report formatting |
286
-
287
- Types use the spec's own names (`McpUiHostContext`, `McpUiDisplayMode`, …) —
288
- one vocabulary, no translation layer.
289
-
290
- ## Agent Skills
291
-
292
- Install the plugin skills and ask your coding agent to create an MCP App:
293
- [Agent Skills docs](https://mountly.dev/mcp-apps/agent-skills/) ·
294
- [`create-mcp-app`](../../plugins/mountly-mcp/skills/create-mcp-app/SKILL.md).
295
-
296
- Greenfield without an agent: `npx mountly-mcp create my-app --framework react`.
199
+ | Entry | Contents |
200
+ | ------------------------- | --------------------------------------- |
201
+ | `mountly-mcp` | `runBridge`, `publishMcpView`, types |
202
+ | `mountly-mcp/react` | `createMcpView` + hooks |
203
+ | `mountly-mcp/vue` | `createMcpView` + composables |
204
+ | `mountly-mcp/svelte` | `createMcpView` (props) |
205
+ | `mountly-mcp/vite` | `mountlyMcpViews()` |
206
+ | `mountly-mcp/artifact` | Manifest APIs |
207
+ | `mountly-mcp/server` | `registerMcpApps` |
208
+ | `mountly-mcp/dev` | Local host helpers |
209
+ | `mountly-mcp/testing` | `verifyMcpApps` |
210
+ | `mountly-mcp/json-render` | Generative path |
211
+ | `mountly-mcp/compose` | `registerComposeApp`, `composeViewHtml` |
297
212
 
298
213
  ## See also
299
214
 
300
- - [`docs/examples/mcp-release-readiness`](../../docs/examples/mcp-release-readiness) —
301
- production-shaped Vite View (closest to `create`)
302
- - [`docs/examples/mcp-app-demo`](../../docs/examples/mcp-app-demo) — advanced
303
- protocol harness (not the greenfield starter)
304
- - `docs/how-to-test.md`
215
+ - [`mcp-release-readiness`](../../docs/examples/mcp-release-readiness) — production-shaped Vite View
216
+ - [`mcp-app-demo`](../../docs/examples/mcp-app-demo) — protocol harness
217
+ - [Host matrix](https://mountly.dev/mcp-apps/host-matrix/)