@urbicon-ui/mcp-server 6.48.1 → 6.50.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.
package/README.md CHANGED
@@ -9,7 +9,9 @@ Model Context Protocol server for the Urbicon UI design system. Gives LLMs first
9
9
  > bundle (`@urbicon-ui/design-content`), kept for the launch decision of hosting a public
10
10
  > endpoint (evaluation/reach: "point your agent at Urbicon without installing anything").
11
11
  > It is deliberately absent from the public docs until that endpoint exists, and a local
12
- > install is **not** a supported consumer path (see docs/internal/DESIGN-MCP-V2.md §11).
12
+ > install is **not** a supported consumer path: manifest read/write is a working-directory
13
+ > concern and lives in the CLI, so a locally installed copy of this stateless server would
14
+ > offer strictly less than the dev-dependency it duplicates.
13
15
 
14
16
  **Transports:** stdio (default, for in-repo development) and streamable HTTP (the intended remote deployment).
15
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbicon-ui/mcp-server",
3
- "version": "6.48.1",
3
+ "version": "6.50.0",
4
4
  "description": "Model Context Protocol server exposing the Urbicon UI component catalog, recipes and design intelligence to LLM agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,8 +39,8 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@modelcontextprotocol/sdk": "^1.30.0",
42
- "@urbicon-ui/design-content": "6.48.1",
43
- "@urbicon-ui/design-engine": "6.48.1",
42
+ "@urbicon-ui/design-content": "6.50.0",
43
+ "@urbicon-ui/design-engine": "6.50.0",
44
44
  "zod": "^4.3.6"
45
45
  },
46
46
  "devDependencies": {
package/src/index.ts CHANGED
@@ -8,13 +8,20 @@ import { startStdioTransport } from './transports/stdio.js';
8
8
  interface CliArgs {
9
9
  transport: 'stdio' | 'http';
10
10
  port: number;
11
+ host: string;
11
12
  contentDir?: string;
12
13
  }
13
14
 
14
15
  function parseArgs(args: string[]): CliArgs {
15
16
  const result: CliArgs = {
16
17
  transport: 'stdio',
17
- port: 3001
18
+ port: 3001,
19
+ // Loopback by default: this server has no authentication of its own and is
20
+ // meant to sit behind a reverse proxy. Binding every interface was the old
21
+ // behaviour — the deploy host set `HOST=127.0.0.1` for years and nothing
22
+ // read it, so the listener answered on `0.0.0.0` and only the firewall kept
23
+ // it private. Widening this is now a deliberate `--host 0.0.0.0`.
24
+ host: process.env.HOST ?? '127.0.0.1'
18
25
  };
19
26
 
20
27
  for (let i = 0; i < args.length; i++) {
@@ -29,6 +36,9 @@ function parseArgs(args: string[]): CliArgs {
29
36
  } else if (arg === '--port' && next) {
30
37
  result.port = parseInt(next, 10);
31
38
  i++;
39
+ } else if (arg === '--host' && next) {
40
+ result.host = next;
41
+ i++;
32
42
  } else if (arg === '--content-dir' && next) {
33
43
  result.contentDir = next;
34
44
  i++;
@@ -53,7 +63,7 @@ async function main(): Promise<void> {
53
63
  }
54
64
 
55
65
  if (args.transport === 'http') {
56
- await startHttpTransport(args.port);
66
+ await startHttpTransport(args.port, args.host);
57
67
  } else {
58
68
  const server = createServer();
59
69
  await startStdioTransport(server);
@@ -93,7 +93,7 @@ export function registerGetChecklistTool(server: McpServer): void {
93
93
  md +=
94
94
  '- [ ] Spacing varies: tight (`gap-2`/`gap-3`) within related items, generous (`gap-8`/`gap-10`) between sections — not uniform everywhere\n';
95
95
  md +=
96
- "- [ ] Border-radius follows a deliberate strategy overridden via `class` or `slotClasses` where component defaults don't match the design identity\n";
96
+ '- [ ] Shape is decided at the tier, not per element if the default family radii don\'t match the design identity, retune `--radius-commit`/`-modify`/`-contain` together in the theme (containers never tighter than what sits inside them). A `class="rounded-*"` on a single component splits its family\n';
97
97
  md +=
98
98
  '- [ ] Data-driven styling: different states/severities are visually distinct through padding, font-weight, Badge `variant`, and text color — not just labels\n';
99
99
  md +=
@@ -26,11 +26,16 @@ function respondError(res: ServerResponse, status: number, code: number, message
26
26
  * server that offers no sessions. Any non-`/mcp` path returns a plain-text
27
27
  * banner (a lightweight liveness ping).
28
28
  *
29
- * @param port - TCP port to listen on (binds `http://localhost:<port>/mcp`).
29
+ * @param port - TCP port to listen on (binds `http://<host>:<port>/mcp`).
30
+ * @param host - Interface to bind. Defaults to loopback: the server has no auth
31
+ * of its own and belongs behind a reverse proxy. Pass `0.0.0.0` to widen it.
30
32
  * @returns A stop handle; `index.ts` ignores it and runs until the process
31
33
  * exits, the transport test uses it to shut the listener down.
32
34
  */
33
- export async function startHttpTransport(port: number): Promise<{ close: () => Promise<void> }> {
35
+ export async function startHttpTransport(
36
+ port: number,
37
+ host = '127.0.0.1'
38
+ ): Promise<{ close: () => Promise<void> }> {
34
39
  const httpServer = createHttpServer(async (req, res) => {
35
40
  const url = new URL(req.url || '/', `http://localhost:${port}`);
36
41
 
@@ -74,8 +79,8 @@ export async function startHttpTransport(port: number): Promise<{ close: () => P
74
79
  });
75
80
 
76
81
  await new Promise<void>((resolve) => {
77
- httpServer.listen(port, () => {
78
- console.error(`Urbicon UI MCP Server listening on http://localhost:${port}/mcp`);
82
+ httpServer.listen(port, host, () => {
83
+ console.error(`Urbicon UI MCP Server listening on http://${host}:${port}/mcp`);
79
84
  resolve();
80
85
  });
81
86
  });