@nuwax-ai/openui-mcp 0.1.0 → 0.1.2

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.
package/README.md CHANGED
@@ -78,9 +78,36 @@ Example MCP client configuration:
78
78
  }
79
79
  ```
80
80
 
81
- stdio can create artifacts, but a sidecar page also requires the HTTP process
82
- to serve the artifact. For sidecar deployments, use Streamable HTTP or replace
83
- the in-memory store with shared durable storage.
81
+ The stdio process starts the sidecar HTTP server by default and both transports
82
+ share the same in-memory artifact store. Set
83
+ `NUWAX_OPENUI_SIDECAR_SERVER_ENABLED=false` only when inline rendering is the
84
+ sole requirement or another process owns the sidecar service.
85
+
86
+ For NuwaClaw, configure this server as persistent so all Agent sessions share
87
+ one process and one sidecar port:
88
+
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "nuwax-openui": {
93
+ "command": "npx",
94
+ "args": ["-y", "@nuwax-ai/openui-mcp@0.1.2"],
95
+ "env": {
96
+ "NUWAX_OPENUI_HOST": "127.0.0.1",
97
+ "NUWAX_OPENUI_PORT": "8787",
98
+ "NUWAX_OPENUI_BASE_URL": "http://127.0.0.1:8787",
99
+ "NUWAX_OPENUI_ALLOWED_HOSTS": "127.0.0.1,localhost"
100
+ },
101
+ "enabled": true,
102
+ "persistent": true
103
+ }
104
+ }
105
+ }
106
+ ```
107
+
108
+ > **Note:** The package exposes `openui-mcp` as the default bin (matching the
109
+ > unscoped package name) so `npx @nuwax-ai/openui-mcp` resolves to the stdio
110
+ > entry. Aliases: `nuwax-openui-mcp` (stdio), `nuwax-openui-mcp-http` (HTTP).
84
111
 
85
112
  ## Run over Streamable HTTP
86
113
 
@@ -3,6 +3,7 @@ declare const configSchema: z.ZodObject<{
3
3
  host: z.ZodString;
4
4
  port: z.ZodCoercedNumber<unknown>;
5
5
  baseUrl: z.ZodString;
6
+ sidecarServerEnabled: z.ZodBoolean;
6
7
  allowedHosts: z.ZodArray<z.ZodString>;
7
8
  frameAncestors: z.ZodArray<z.ZodString>;
8
9
  artifactTtlSeconds: z.ZodCoercedNumber<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;iBAOhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAuBrD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAgB1E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;iBAQhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AA8BrD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAoB1E"}
@@ -3,10 +3,20 @@ const configSchema = z.object({
3
3
  host: z.string().min(1),
4
4
  port: z.coerce.number().int().min(1).max(65_535),
5
5
  baseUrl: z.string().url(),
6
+ sidecarServerEnabled: z.boolean(),
6
7
  allowedHosts: z.array(z.string().min(1)).min(1),
7
8
  frameAncestors: z.array(z.string().min(1)).min(1),
8
9
  artifactTtlSeconds: z.coerce.number().int().min(60).max(86_400),
9
10
  });
11
+ function parseBoolean(value, fallback) {
12
+ if (value === undefined)
13
+ return fallback;
14
+ if (value === 'true' || value === '1')
15
+ return true;
16
+ if (value === 'false' || value === '0')
17
+ return false;
18
+ throw new Error(`Invalid boolean value "${value}".`);
19
+ }
10
20
  function parseCsv(value) {
11
21
  return value
12
22
  .split(',')
@@ -31,6 +41,7 @@ export function loadConfig(env = process.env) {
31
41
  host,
32
42
  port,
33
43
  baseUrl: env.NUWAX_OPENUI_BASE_URL ?? `http://${host}:${String(port)}`,
44
+ sidecarServerEnabled: parseBoolean(env.NUWAX_OPENUI_SIDECAR_SERVER_ENABLED, true),
34
45
  allowedHosts: parseCsv(env.NUWAX_OPENUI_ALLOWED_HOSTS ?? '127.0.0.1,localhost'),
35
46
  frameAncestors: parseFrameAncestors(env.NUWAX_OPENUI_FRAME_ANCESTORS ?? "'self'"),
36
47
  artifactTtlSeconds: env.NUWAX_OPENUI_ARTIFACT_TTL_SECONDS ?? '3600',
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACzB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;CAChE,CAAC,CAAC;AAIH,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAExD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,iCAAiC,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,IAAI,WAAW,CAAC;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC;IAE7C,OAAO,YAAY,CAAC,KAAK,CAAC;QACxB,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,GAAG,CAAC,qBAAqB,IAAI,UAAU,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE;QACtE,YAAY,EAAE,QAAQ,CACpB,GAAG,CAAC,0BAA0B,IAAI,qBAAqB,CACxD;QACD,cAAc,EAAE,mBAAmB,CACjC,GAAG,CAAC,4BAA4B,IAAI,QAAQ,CAC7C;QACD,kBAAkB,EAAE,GAAG,CAAC,iCAAiC,IAAI,MAAM;KACpE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Server } from 'node:http';
2
+ import type { AppConfig } from './config.js';
3
+ import type { OpenUiRuntime } from './runtime.js';
4
+ export interface StartHttpServerOptions {
5
+ config: AppConfig;
6
+ runtime: OpenUiRuntime;
7
+ }
8
+ export declare function startHttpServer({ config, runtime, }: StartHttpServerOptions): Promise<Server>;
9
+ export declare function closeHttpServer(server: Server): Promise<void>;
10
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAsB,eAAe,CAAC,EACpC,MAAM,EACN,OAAO,GACR,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB1C;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE"}
@@ -0,0 +1,30 @@
1
+ import { createHttpApp } from './http-app.js';
2
+ export async function startHttpServer({ config, runtime, }) {
3
+ const app = createHttpApp({ config, ...runtime });
4
+ return new Promise((resolve, reject) => {
5
+ const server = app.listen(config.port, config.host);
6
+ const onError = (error) => {
7
+ server.off('listening', onListening);
8
+ reject(error);
9
+ };
10
+ const onListening = () => {
11
+ server.off('error', onError);
12
+ resolve(server);
13
+ };
14
+ server.once('error', onError);
15
+ server.once('listening', onListening);
16
+ });
17
+ }
18
+ export async function closeHttpServer(server) {
19
+ if (!server.listening)
20
+ return;
21
+ await new Promise((resolve, reject) => {
22
+ server.close((error) => {
23
+ if (error)
24
+ reject(error);
25
+ else
26
+ resolve();
27
+ });
28
+ });
29
+ }
30
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQ9C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,MAAM,EACN,OAAO,GACgB;IACvB,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAElD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;YACrC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO;IAE9B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,20 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import 'dotenv/config';
3
3
  import { loadConfig } from './config.js';
4
- import { createHttpApp } from './http-app.js';
4
+ import { closeHttpServer, startHttpServer } from './http-server.js';
5
5
  import { createRuntime } from './runtime.js';
6
6
  const config = loadConfig();
7
7
  const runtime = createRuntime(config);
8
- const app = createHttpApp({ config, ...runtime });
9
- const server = app.listen(config.port, config.host, () => {
10
- console.log(`nuwax-openui-mcp listening at ${config.baseUrl} (MCP: ${config.baseUrl}/mcp)`);
11
- });
8
+ const server = await startHttpServer({ config, runtime });
9
+ console.log(`nuwax-openui-mcp listening at ${config.baseUrl} (MCP: ${config.baseUrl}/mcp)`);
12
10
  function shutdown() {
13
- server.close((error) => {
14
- if (error) {
15
- console.error(error);
16
- process.exitCode = 1;
17
- }
11
+ void closeHttpServer(server).catch((error) => {
12
+ console.error(error);
13
+ process.exitCode = 1;
18
14
  });
19
15
  }
20
16
  process.on('SIGINT', shutdown);
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAElD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACvD,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,OAAO,OAAO,CAC/E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,SAAS,QAAQ;IACf,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAE1D,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,OAAO,OAAO,CAC/E,CAAC;AAEF,SAAS,QAAQ;IACf,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC"}
@@ -5,4 +5,5 @@ export declare function createRuntime(config: AppConfig): {
5
5
  store: InMemoryArtifactStore;
6
6
  renderService: RenderOpenUiService;
7
7
  };
8
+ export type OpenUiRuntime = ReturnType<typeof createRuntime>;
8
9
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS;;;EAQ9C"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS;;;EAQ9C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -2,14 +2,27 @@
2
2
  import 'dotenv/config';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { loadConfig } from './config.js';
5
+ import { closeHttpServer, startHttpServer } from './http-server.js';
5
6
  import { createOpenUiMcpServer } from './mcp-server.js';
6
7
  import { createRuntime } from './runtime.js';
7
8
  const config = loadConfig();
8
- const { renderService } = createRuntime(config);
9
+ const runtime = createRuntime(config);
10
+ const sidecarServer = config.sidecarServerEnabled
11
+ ? await startHttpServer({ config, runtime })
12
+ : null;
13
+ const { renderService } = runtime;
9
14
  const server = createOpenUiMcpServer(renderService);
10
15
  const transport = new StdioServerTransport();
11
16
  await server.connect(transport);
17
+ async function shutdown() {
18
+ await server.close();
19
+ if (sidecarServer)
20
+ await closeHttpServer(sidecarServer);
21
+ }
12
22
  process.on('SIGINT', () => {
13
- void server.close().finally(() => process.exit(0));
23
+ void shutdown().finally(() => process.exit(0));
24
+ });
25
+ process.on('SIGTERM', () => {
26
+ void shutdown().finally(() => process.exit(0));
14
27
  });
15
28
  //# sourceMappingURL=stdio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB;IAC/C,CAAC,CAAC,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC;AACT,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;AAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,IAAI,aAAa;QAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@nuwax-ai/openui-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "OpenUI over MCP for Nuwax, with inline and sidecar rendering contracts.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/nuwax-ai/nuwax-openui-mcp.git"
9
+ "url": "git+https://github.com/nuwax-ai/nuwax-openui-mcp.git"
10
10
  },
11
11
  "homepage": "https://github.com/nuwax-ai/nuwax-openui-mcp#readme",
12
12
  "bugs": {
@@ -25,6 +25,7 @@
25
25
  }
26
26
  },
27
27
  "bin": {
28
+ "openui-mcp": "dist/server/stdio.js",
28
29
  "nuwax-openui-mcp": "dist/server/stdio.js",
29
30
  "nuwax-openui-mcp-http": "dist/server/http.js"
30
31
  },
@@ -33,22 +34,6 @@
33
34
  "README.md",
34
35
  "LICENSE"
35
36
  ],
36
- "scripts": {
37
- "build": "pnpm build:server && pnpm build:web",
38
- "build:server": "tsc -p tsconfig.server.json",
39
- "build:web": "vite build",
40
- "dev:http": "tsx watch src/http.ts",
41
- "dev:stdio": "tsx src/stdio.ts",
42
- "format": "prettier --write .",
43
- "format:check": "prettier --check .",
44
- "lint": "eslint .",
45
- "start": "node dist/server/http.js",
46
- "test": "vitest run",
47
- "test:watch": "vitest",
48
- "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p tsconfig.web.json --noEmit",
49
- "verify": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build",
50
- "prepublishOnly": "pnpm verify"
51
- },
52
37
  "publishConfig": {
53
38
  "access": "public",
54
39
  "registry": "https://registry.npmjs.org/"
@@ -85,5 +70,19 @@
85
70
  "engines": {
86
71
  "node": ">=20"
87
72
  },
88
- "packageManager": "pnpm@10.30.3"
89
- }
73
+ "scripts": {
74
+ "build": "pnpm build:server && pnpm build:web",
75
+ "build:server": "tsc -p tsconfig.server.json",
76
+ "build:web": "vite build",
77
+ "dev:http": "tsx watch src/http.ts",
78
+ "dev:stdio": "tsx src/stdio.ts",
79
+ "format": "prettier --write .",
80
+ "format:check": "prettier --check .",
81
+ "lint": "eslint .",
82
+ "start": "node dist/server/http.js",
83
+ "test": "vitest run",
84
+ "test:watch": "vitest",
85
+ "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p tsconfig.web.json --noEmit",
86
+ "verify": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"
87
+ }
88
+ }