mountly-mcp 4.0.2 → 4.1.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 (45) hide show
  1. package/GLOSSARY.md +37 -0
  2. package/README.md +75 -197
  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-UECZA34Q.js → chunk-OWAXBNZA.js} +10 -5
  9. package/dist/chunk-OWAXBNZA.js.map +1 -0
  10. package/dist/cli.js +96 -24
  11. package/dist/cli.js.map +1 -1
  12. package/dist/connect-server-P2UZ62YC.js +7 -0
  13. package/dist/create.js +43 -15
  14. package/dist/create.js.map +1 -1
  15. package/dist/dev/index.js +1 -1
  16. package/dist/doctor-B54H6CRN.js +122 -0
  17. package/dist/doctor-B54H6CRN.js.map +1 -0
  18. package/dist/doctor.d.ts +16 -0
  19. package/dist/errors-4ERW7HZB.js +11 -0
  20. package/dist/errors-4ERW7HZB.js.map +1 -0
  21. package/dist/errors.d.ts +25 -0
  22. package/package.json +9 -6
  23. package/templates/react/README.md.tmpl +83 -6
  24. package/templates/react/package.json.tmpl +2 -0
  25. package/templates/react/serve-stdio.mjs.tmpl +9 -0
  26. package/templates/react/server.mjs.tmpl +6 -1
  27. package/templates/react/src/view.tsx.tmpl +1 -1
  28. package/templates/svelte/README.md.tmpl +27 -4
  29. package/templates/svelte/package.json.tmpl +2 -0
  30. package/templates/svelte/serve-stdio.mjs.tmpl +5 -0
  31. package/templates/svelte/server.mjs.tmpl +6 -1
  32. package/templates/svelte/src/Dashboard.svelte.tmpl +1 -1
  33. package/templates/vanilla/README.md.tmpl +27 -11
  34. package/templates/vanilla/package.json.tmpl +2 -0
  35. package/templates/vanilla/serve-stdio.mjs.tmpl +5 -0
  36. package/templates/vanilla/server.mjs.tmpl +6 -1
  37. package/templates/vanilla/src/view.ts.tmpl +1 -1
  38. package/templates/vue/README.md.tmpl +27 -4
  39. package/templates/vue/package.json.tmpl +2 -0
  40. package/templates/vue/serve-stdio.mjs.tmpl +5 -0
  41. package/templates/vue/server.mjs.tmpl +6 -1
  42. package/templates/vue/src/Dashboard.vue.tmpl +1 -1
  43. package/dist/chunk-UECZA34Q.js.map +0 -1
  44. package/dist/connect-server-7L4HGKKL.js +0 -7
  45. /package/dist/{connect-server-7L4HGKKL.js.map → connect-server-P2UZ62YC.js.map} +0 -0
@@ -0,0 +1,5 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import createServer from "./server.mjs";
3
+
4
+ const server = await createServer();
5
+ await server.connect(new StdioServerTransport());
@@ -1,3 +1,4 @@
1
+ import { fileURLToPath } from "node:url";
1
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
3
  import { readMcpAppManifest } from "mountly-mcp/artifact";
3
4
  import { registerMcpApps } from "mountly-mcp/server";
@@ -5,6 +6,10 @@ import { z } from "zod";
5
6
 
6
7
  const URI = "{{uri}}";
7
8
 
9
+ // Resolved from this file, not the cwd: an MCP host spawns the process with a
10
+ // working directory of its own choosing.
11
+ const MANIFEST = fileURLToPath(new URL("./dist/mountly-mcp.manifest.json", import.meta.url));
12
+
8
13
  function sampleCards() {
9
14
  return [
10
15
  { label: "Requests", value: Math.floor(1200 + Math.random() * 200) },
@@ -20,7 +25,7 @@ export default async function createServer() {
20
25
  { capabilities: { tools: {}, resources: {} } },
21
26
  );
22
27
 
23
- const { artifacts } = await readMcpAppManifest("dist/mountly-mcp.manifest.json");
28
+ const { artifacts } = await readMcpAppManifest(MANIFEST);
24
29
 
25
30
  await registerMcpApps(server, {
26
31
  views: artifacts.map((artifact) => ({ artifact })),
@@ -68,7 +68,7 @@ async function refresh() {
68
68
  <p class="eyebrow">MCP App · Mountly</p>
69
69
  <h1>{{ title }}</h1>
70
70
  <p class="subtitle">
71
- Built with <code>mountly-mcp</code> — try Refresh to call an app-only tool.
71
+ Built with <code>mountly-mcp</code>. Try Refresh to call an app-only tool.
72
72
  </p>
73
73
  <div class="grid">
74
74
  <div v-if="cards.length === 0" v-for="i in 3" :key="i" class="metric">
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/dev/connect-server.ts"],"sourcesContent":["import type { McpUiToolMeta } from \"@modelcontextprotocol/ext-apps\";\n\nexport interface ConnectedMcpServer {\n callTool: (name: string, args: unknown) => Promise<unknown>;\n /** The model-visible tool bound to `uri` — the one a host would call. */\n toolFor(uri: string): Promise<string | undefined>;\n close(): Promise<void>;\n}\n\n/**\n * Connect a server module in-process for a development session.\n *\n * The module default-exports either the server or a function returning it: a\n * `RunningMcpAppServer` from `createMcpAppServer`, or a raw `McpServer`.\n */\nexport async function connectMcpServer(path: string): Promise<ConnectedMcpServer> {\n const { pathToFileURL } = await import(\"node:url\");\n const { resolve } = await import(\"node:path\");\n const mod = (await import(pathToFileURL(resolve(path)).href)) as { default?: unknown };\n if (mod.default === undefined) {\n throw new Error(\n `mountly-mcp: ${path} has no default export. Export your server (or a function returning it) as default.`,\n );\n }\n const value = typeof mod.default === \"function\" ? await mod.default() : mod.default;\n\n let client: import(\"@modelcontextprotocol/sdk/client/index.js\").Client;\n if (\n value !== null &&\n typeof value === \"object\" &&\n \"connectInProcess\" in value &&\n typeof value.connectInProcess === \"function\"\n ) {\n const running = value as { connectInProcess(): Promise<{ client: typeof client }> };\n ({ client } = await running.connectInProcess());\n } else if (\n value !== null &&\n typeof value === \"object\" &&\n \"connect\" in value &&\n typeof value.connect === \"function\"\n ) {\n const [{ Client }, { InMemoryTransport }, { EXTENSION_ID, RESOURCE_MIME_TYPE }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/client/index.js\"),\n import(\"@modelcontextprotocol/sdk/inMemory.js\"),\n import(\"@modelcontextprotocol/ext-apps/server\"),\n ]);\n const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();\n await (value as { connect(transport: unknown): Promise<void> }).connect(serverTransport);\n client = new Client({ name: \"mountly-mcp-dev\", version: \"0.0.1\" }, {\n capabilities: { extensions: { [EXTENSION_ID]: { mimeTypes: [RESOURCE_MIME_TYPE] } } },\n } as never);\n await client.connect(clientTransport);\n } else {\n throw new TypeError(\n `mountly-mcp: ${path} must default-export an MCP server, RunningMcpAppServer, or a function returning one`,\n );\n }\n\n return {\n callTool: (name, args) =>\n client.callTool({ name, arguments: (args ?? {}) as Record<string, unknown> }),\n async toolFor(uri) {\n const { tools } = await client.listTools();\n const uiMeta = (tool: { _meta?: unknown }): McpUiToolMeta | undefined =>\n (tool._meta as { ui?: McpUiToolMeta } | undefined)?.ui;\n const bound = tools.filter((tool) => uiMeta(tool)?.resourceUri === uri);\n const visible = bound.find((tool) => {\n const visibility = uiMeta(tool)?.visibility;\n return visibility === undefined || visibility.includes(\"model\");\n });\n return (visible ?? bound[0])?.name;\n },\n close: () => client.close(),\n };\n}\n"],"mappings":";AAeA,eAAsB,iBAAiB,MAA2C;AAChF,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,KAAU;AACjD,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,MAAW;AAC5C,QAAM,MAAO,MAAM,OAAO,cAAc,QAAQ,IAAI,CAAC,EAAE;AACvD,MAAI,IAAI,YAAY,QAAW;AAC7B,UAAM,IAAI;AAAA,MACR,gBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,IAAI,YAAY,aAAa,MAAM,IAAI,QAAQ,IAAI,IAAI;AAE5E,MAAI;AACJ,MACE,UAAU,QACV,OAAO,UAAU,YACjB,sBAAsB,SACtB,OAAO,MAAM,qBAAqB,YAClC;AACA,UAAM,UAAU;AAChB,KAAC,EAAE,OAAO,IAAI,MAAM,QAAQ,iBAAiB;AAAA,EAC/C,WACE,UAAU,QACV,OAAO,UAAU,YACjB,aAAa,SACb,OAAO,MAAM,YAAY,YACzB;AACA,UAAM,CAAC,EAAE,OAAO,GAAG,EAAE,kBAAkB,GAAG,EAAE,cAAc,mBAAmB,CAAC,IAC5E,MAAM,QAAQ,IAAI;AAAA,MAChB,OAAO,2CAA2C;AAAA,MAClD,OAAO,uCAAuC;AAAA,MAC9C,OAAO,uCAAuC;AAAA,IAChD,CAAC;AACH,UAAM,CAAC,iBAAiB,eAAe,IAAI,kBAAkB,iBAAiB;AAC9E,UAAO,MAAyD,QAAQ,eAAe;AACvF,aAAS,IAAI,OAAO,EAAE,MAAM,mBAAmB,SAAS,QAAQ,GAAG;AAAA,MACjE,cAAc,EAAE,YAAY,EAAE,CAAC,YAAY,GAAG,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,EAAE;AAAA,IACtF,CAAU;AACV,UAAM,OAAO,QAAQ,eAAe;AAAA,EACtC,OAAO;AACL,UAAM,IAAI;AAAA,MACR,gBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,CAAC,MAAM,SACf,OAAO,SAAS,EAAE,MAAM,WAAY,QAAQ,CAAC,EAA8B,CAAC;AAAA,IAC9E,MAAM,QAAQ,KAAK;AACjB,YAAM,EAAE,MAAM,IAAI,MAAM,OAAO,UAAU;AACzC,YAAM,SAAS,CAAC,SACb,KAAK,OAA8C;AACtD,YAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,OAAO,IAAI,GAAG,gBAAgB,GAAG;AACtE,YAAM,UAAU,MAAM,KAAK,CAAC,SAAS;AACnC,cAAM,aAAa,OAAO,IAAI,GAAG;AACjC,eAAO,eAAe,UAAa,WAAW,SAAS,OAAO;AAAA,MAChE,CAAC;AACD,cAAQ,WAAW,MAAM,CAAC,IAAI;AAAA,IAChC;AAAA,IACA,OAAO,MAAM,OAAO,MAAM;AAAA,EAC5B;AACF;","names":[]}
@@ -1,7 +0,0 @@
1
- import {
2
- connectMcpServer
3
- } from "./chunk-UECZA34Q.js";
4
- export {
5
- connectMcpServer
6
- };
7
- //# sourceMappingURL=connect-server-7L4HGKKL.js.map