ply-ui-mcp 0.1.28 → 0.1.30

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/dist/index.js CHANGED
@@ -582,7 +582,7 @@ async function searchComponents(args) {
582
582
  // package.json
583
583
  var package_default = {
584
584
  name: "ply-ui-mcp",
585
- version: "0.1.28",
585
+ version: "0.1.30",
586
586
  description: "Ply MCP server \u2014 stdio or Streamable HTTP (--http). List, search, init, doctor, diff, update, and add Angular + Tailwind components (Pro with PLY_LICENSE_KEY). Not MUI Base UI.",
587
587
  type: "commonjs",
588
588
  main: "dist/index.js",
@@ -636,7 +636,7 @@ var package_default = {
636
636
  },
637
637
  devDependencies: {
638
638
  "@types/node": "^26.5.1",
639
- tsup: "^8.5.1",
639
+ tsup: "^9.0.0",
640
640
  typescript: "^7.0.2",
641
641
  vitest: "^5.0.0"
642
642
  },
@@ -1136,6 +1136,25 @@ function createMcpServer(options = {}) {
1136
1136
  // src/http.ts
1137
1137
  var import_node_http = require("http");
1138
1138
  var import_streamableHttp = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
1139
+
1140
+ // src/auth-metadata.ts
1141
+ var AUTH_MD_URL = "https://ply-ui.com/auth.md";
1142
+ function mcpProtectedResource(resource, bearer) {
1143
+ return {
1144
+ resource,
1145
+ resource_name: "Ply MCP",
1146
+ resource_documentation: AUTH_MD_URL,
1147
+ resource_logo_uri: "https://ply-ui.com/assets/pwa/apple-touch-icon.png",
1148
+ authorization_servers: [],
1149
+ scopes_supported: [],
1150
+ bearer_methods_supported: bearer ? ["header"] : []
1151
+ };
1152
+ }
1153
+ function wwwAuthenticate(resourceMetadataUrl) {
1154
+ return `Bearer resource_metadata="${resourceMetadataUrl}"`;
1155
+ }
1156
+
1157
+ // src/http.ts
1139
1158
  function setCors(res) {
1140
1159
  res.setHeader("Access-Control-Allow-Origin", "*");
1141
1160
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
@@ -1144,9 +1163,12 @@ function setCors(res) {
1144
1163
  "Content-Type, Authorization, Mcp-Session-Id, MCP-Protocol-Version"
1145
1164
  );
1146
1165
  }
1147
- function unauthorized(res) {
1166
+ function unauthorized(res, resourceMetadataUrl) {
1148
1167
  setCors(res);
1149
- res.writeHead(401, { "Content-Type": "application/json" });
1168
+ res.writeHead(401, {
1169
+ "Content-Type": "application/json",
1170
+ "WWW-Authenticate": wwwAuthenticate(resourceMetadataUrl)
1171
+ });
1150
1172
  res.end(JSON.stringify({ error: "Unauthorized" }));
1151
1173
  }
1152
1174
  function checkAuth(req, token) {
@@ -1188,6 +1210,16 @@ function startHttpServer(options) {
1188
1210
  );
1189
1211
  return;
1190
1212
  }
1213
+ if (url.pathname === "/.well-known/oauth-protected-resource" && req.method === "GET") {
1214
+ setCors(res);
1215
+ res.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
1216
+ res.end(
1217
+ JSON.stringify(
1218
+ mcpProtectedResource(new URL("/mcp", url.origin).href, Boolean(options.authToken))
1219
+ )
1220
+ );
1221
+ return;
1222
+ }
1191
1223
  if (url.pathname !== "/mcp") {
1192
1224
  setCors(res);
1193
1225
  res.writeHead(404, { "Content-Type": "application/json" });
@@ -1195,7 +1227,7 @@ function startHttpServer(options) {
1195
1227
  return;
1196
1228
  }
1197
1229
  if (!checkAuth(req, options.authToken)) {
1198
- unauthorized(res);
1230
+ unauthorized(res, new URL("/.well-known/oauth-protected-resource", url.origin).href);
1199
1231
  return;
1200
1232
  }
1201
1233
  setCors(res);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/resources.ts","../src/registry.ts","../src/utf8.ts","../src/tools/get-component.ts","../src/brand.ts","../src/install-hint.ts","../src/result.ts","../src/tools/list-components.ts","../src/tools/search-components.ts","../src/aliases.ts","../package.json","../src/version.ts","../src/tools/add-components.ts","../src/cli.ts","../src/tools/diff-components.ts","../src/tools/doctor.ts","../src/tools/init-project.ts","../src/tools/update-components.ts","../src/server.ts","../src/http.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * ply-ui-mcp — MCP server wrapping the Ply registry + CLI.\n *\n * Default: stdio (Cursor, Claude Code/Desktop, Kimi, VS Code, Windsurf).\n * `--http`: Streamable HTTP for ChatGPT / Gemini chat apps and remote MCP URLs.\n * Hosted HTTP should use `--read-only` so catalog tools work without a local project.\n */\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createMcpServer, PACKAGE_VERSION } from './server';\nimport { startHttpServer } from './http';\nimport { MCP_PACKAGE } from './brand';\n\nfunction parseArgs(argv: string[]): {\n http: boolean;\n readOnly: boolean;\n port: number;\n host: string;\n} {\n let http =\n argv.includes('--http') ||\n process.env.PLY_MCP_HTTP === '1' ||\n process.env.BASE_UI_MCP_HTTP === '1';\n let readOnly =\n argv.includes('--read-only') ||\n process.env.PLY_MCP_READ_ONLY === '1' ||\n process.env.BASE_UI_MCP_READ_ONLY === '1';\n let port = Number(process.env.PORT || process.env.PLY_MCP_PORT || process.env.BASE_UI_MCP_PORT || 3334);\n let host = process.env.PLY_MCP_HOST || process.env.BASE_UI_MCP_HOST || (http ? '127.0.0.1' : '127.0.0.1');\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === '--port' && argv[i + 1]) {\n port = Number(argv[++i]);\n } else if (arg?.startsWith('--port=')) {\n port = Number(arg.slice('--port='.length));\n } else if (arg === '--host' && argv[i + 1]) {\n host = argv[++i]!;\n } else if (arg?.startsWith('--host=')) {\n host = arg.slice('--host='.length);\n }\n }\n if (!Number.isFinite(port) || port <= 0) port = 3334;\n return { http, readOnly, port, host };\n}\n\nasync function main() {\n const opts = parseArgs(process.argv.slice(2));\n if (opts.http) {\n startHttpServer({\n host: opts.host,\n port: opts.port,\n readOnly: opts.readOnly,\n authToken:\n process.env.PLY_MCP_AUTH_TOKEN?.trim() ||\n process.env.BASE_UI_MCP_AUTH_TOKEN?.trim() ||\n undefined,\n });\n return;\n }\n\n const server = createMcpServer({ mutating: true });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(`${MCP_PACKAGE} v${PACKAGE_VERSION} ready on stdio`);\n}\n\nmain().catch((err) => {\n console.error(`${MCP_PACKAGE} failed to start:`, err);\n process.exit(1);\n});\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { registerResources } from './resources';\nimport { getComponent, getComponentInput } from './tools/get-component';\nimport { listComponents, listComponentsInput } from './tools/list-components';\nimport { searchComponents, searchComponentsInput } from './tools/search-components';\nimport { PACKAGE_VERSION } from './version';\nimport { CLI_NPX, MCP_SERVER_NAME } from './brand';\n\n/** ChatGPT treats tools as writes unless readOnlyHint is set. */\nconst catalogAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n} as const;\n\n/** Catalog-only server: safe to bundle on Cloudflare Workers (no child_process). */\nexport function createCatalogMcpServer(): McpServer {\n const server = new McpServer({\n name: MCP_SERVER_NAME,\n version: PACKAGE_VERSION,\n });\n\n server.registerTool(\n 'list_components',\n {\n title: 'List Ply components',\n description:\n `List components from the Ply registry. Filter by tier (free|pro|all), category, or name substring. Does not install anything. To copy a component into a project, tell the user to run ${CLI_NPX} add <name>.`,\n inputSchema: listComponentsInput,\n annotations: catalogAnnotations,\n },\n async (args) => listComponents(args)\n );\n\n server.registerTool(\n 'get_component',\n {\n title: 'Get component details',\n description:\n `Get registry metadata for one component (deps, category, file list). Free source only when includeSource=true. Pro source is never streamed via MCP. Does not install; returns installCommand (${CLI_NPX} add <name>).`,\n inputSchema: getComponentInput,\n annotations: catalogAnnotations,\n },\n async (args) => getComponent(args)\n );\n\n server.registerTool(\n 'search_components',\n {\n title: 'Search Ply components',\n description:\n `Fuzzy / token search over registry component names (e.g. \"dialog\", \"sheet\", \"carousel\"). Does not install anything. Prefer this before guessing names, then give the user ${CLI_NPX} add <name> (or local stdio add_components).`,\n inputSchema: searchComponentsInput,\n annotations: catalogAnnotations,\n },\n async (args) => searchComponents(args)\n );\n\n registerResources(server);\n return server;\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n SITE_URL,\n fetchFreeItem,\n fetchIndex,\n fetchText,\n isSafeItemName,\n} from './registry';\nimport { utf8ByteLength } from './utf8';\n\nexport function registerResources(server: McpServer) {\n server.registerResource(\n 'registry-index',\n 'ply-ui://registry/index',\n {\n title: 'Registry index',\n description: 'Public Ply registry index (names, tiers, categories, description, usage, keywords, deps)',\n mimeType: 'application/json',\n },\n async (uri) => {\n const index = await fetchIndex();\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(index, null, 2),\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'docs-llms',\n 'ply-ui://docs/llms',\n {\n title: 'llms.txt',\n description:\n 'Agent-oriented product overview (keep fetching this URL even when MCP is available)',\n mimeType: 'text/plain',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/llms.txt`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/plain', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-catalog',\n 'ply-ui://docs/catalog',\n {\n title: 'AI component catalog',\n description: 'docs/ai/components.md — detailed component reference for agents',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/components.md`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/markdown', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-cursor-rules',\n 'ply-ui://docs/cursor-rules',\n {\n title: 'Cursor / Windsurf project rules',\n description:\n 'Save as .cursor/rules/ply-ui.mdc (or .windsurf/rules/ply-ui.md). Teaches assistants to write standalone zoneless Angular 22 with Ply without running MCP.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/ply-ui.mdc`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/markdown', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-snippets',\n 'ply-ui://docs/snippets',\n {\n title: 'VS Code / Cursor snippets',\n description:\n 'Save as .vscode/ply-ui.code-snippets. Prefixes like ply-card expand usage markup after CLI install.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/ply-ui.code-snippets`);\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text }],\n };\n }\n );\n\n server.registerResource(\n 'component',\n new ResourceTemplate('ply-ui://component/{name}', {\n list: undefined,\n }),\n {\n title: 'Component metadata',\n description:\n 'Registry metadata for one component. Free source files are listed without content; Pro never streams source via MCP in V1.',\n mimeType: 'application/json',\n },\n async (uri, vars) => {\n const name = String(vars.name || '');\n if (!isSafeItemName(name)) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: `Invalid name: ${name}` }),\n },\n ],\n };\n }\n const index = await fetchIndex();\n const entry = index.find((i) => i.name === name);\n if (!entry) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: `Unknown component: ${name}` }),\n },\n ],\n };\n }\n\n if (entry.tier === 'pro') {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n ...entry,\n files: null,\n note: `Pro — metadata only. ${SITE_URL}/pricing`,\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n const item = await fetchFreeItem(name);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n name: item.name,\n tier: item.tier,\n category: item.category,\n description: item.description,\n usage: item.usage,\n keywords: item.keywords,\n dependencies: item.dependencies,\n registryDependencies: item.registryDependencies,\n files: item.files.map((f) => ({\n path: f.name,\n bytes: utf8ByteLength(f.content),\n })),\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n}\n","/**\n * Thin registry client — mirrors packages/cli/src/registry.ts URLs/schemas\n * so the MCP server can return structured JSON without parsing CLI stdout.\n * Install/write side effects still go through ply-ui-cli (canonical path).\n */\nimport { z } from 'zod';\n\nexport const SITE_URL = 'https://ply-ui.com';\nexport const GITHUB_HUB_URL = 'https://github.com/ply-ui-ng/ply';\n\nconst env =\n typeof process !== 'undefined' && process.env ? process.env : ({} as Record<string, string | undefined>);\n\nfunction firstEnv(...names: string[]): string | undefined {\n for (const name of names) {\n const v = env[name]?.trim();\n if (v) return v;\n }\n}\n\nexport const FREE_REGISTRY_URL =\n firstEnv('PLY_REGISTRY_URL', 'BASE_UI_REGISTRY_URL') || `${SITE_URL}/registry`;\n\nexport const PRO_REGISTRY_URL =\n firstEnv('PLY_PRO_REGISTRY_URL', 'BASE_UI_PRO_REGISTRY_URL') ||\n 'https://pro.ply-ui.com/registry';\n\nconst registryFileSchema = z.object({\n name: z.string(),\n content: z.string(),\n});\n\nexport const registryItemSchema = z.object({\n name: z.string(),\n tier: z.enum(['free', 'pro']),\n category: z\n .enum(['application', 'page-layout', 'block', 'widget', 'shell', 'component'])\n .optional()\n .default('component'),\n dependencies: z.array(z.string()).default([]),\n registryDependencies: z.array(z.string()).default([]),\n description: z.string().optional().default(''),\n usage: z.string().optional().default(''),\n keywords: z.array(z.string()).optional().default([]),\n files: z.array(registryFileSchema),\n type: z.string().optional(),\n license: z.enum(['MIT', 'Ply Pro']).optional(),\n});\n\nexport const registryIndexSchema = z.array(registryItemSchema.omit({ files: true }));\n\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\nexport type RegistryIndexEntry = z.infer<typeof registryIndexSchema>[number];\n\nexport type Category = NonNullable<RegistryIndexEntry['category']>;\n\nexport function itemLicense(tier: 'free' | 'pro'): 'MIT' | 'Ply Pro' {\n return tier === 'pro' ? 'Ply Pro' : 'MIT';\n}\n\nexport function hubSourceUrl(name: string): string {\n return `${GITHUB_HUB_URL}/tree/main/components/${name}`;\n}\n\nexport function itemHaystack(\n item: Pick<RegistryIndexEntry, 'name' | 'description' | 'usage' | 'keywords'>\n): string {\n return [item.name, item.description, item.usage, ...(item.keywords ?? [])]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n}\n\nexport function isSafeItemName(name: string): boolean {\n return /^[a-z0-9][a-z0-9-.]*$/i.test(name) && !name.includes('..');\n}\n\nasync function fetchJson(url: string, headers: Record<string, string> = {}): Promise<unknown> {\n let res: Response;\n try {\n res = await fetch(url, { headers });\n } catch (err: any) {\n throw new Error(\n `Network error while contacting the registry (${err.message}). Check your connection and try again.`\n );\n }\n if (res.status === 401 || res.status === 403) {\n throw new Error(\n `License rejected (HTTP ${res.status}). Check PLY_LICENSE_KEY, or see ${SITE_URL}/pricing.`\n );\n }\n if (res.status === 404) {\n const e: any = new Error('Not found');\n e.code = 'NOT_FOUND';\n throw e;\n }\n if (!res.ok) {\n throw new Error(`Registry request failed (HTTP ${res.status}) for ${url}.`);\n }\n return res.json();\n}\n\nexport async function fetchIndex(): Promise<RegistryIndexEntry[]> {\n const data = await fetchJson(`${FREE_REGISTRY_URL}/index.json`);\n return registryIndexSchema.parse(data);\n}\n\n/** Free registry item only — V1 never streams Pro source through MCP. */\nexport async function fetchFreeItem(name: string): Promise<RegistryItem> {\n if (!isSafeItemName(name)) {\n throw new Error(`Invalid component name: '${name}'.`);\n }\n const data = await fetchJson(`${FREE_REGISTRY_URL}/styles/default/${name}.json`);\n return registryItemSchema.parse(data);\n}\n\nexport async function fetchText(url: string): Promise<string> {\n let res: Response;\n try {\n res = await fetch(url);\n } catch (err: any) {\n throw new Error(`Network error fetching ${url}: ${err.message}`);\n }\n if (!res.ok) {\n throw new Error(`Failed to fetch ${url} (HTTP ${res.status}).`);\n }\n return res.text();\n}\n\n/** Closest names to `query`, for search / suggestions. */\nexport function suggestNames(query: string, names: string[], limit = 8): string[] {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n const scored = names\n .map((name) => {\n const n = name.toLowerCase();\n let score: number;\n if (n === q) score = 0;\n else if (n.startsWith(q) || q.startsWith(n)) score = 1;\n else if (n.includes(q) || q.includes(n)) score = 2;\n else score = 3 + levenshtein(q, n);\n return { name, score };\n })\n .filter((s) => s.score <= 6)\n .sort((a, b) => a.score - b.score || a.name.localeCompare(b.name));\n return scored.slice(0, limit).map((s) => s.name);\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (!m) return n;\n if (!n) return m;\n let prev = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n const curr = [i];\n for (let j = 1; j <= n; j++) {\n curr[j] = Math.min(\n prev[j] + 1,\n curr[j - 1] + 1,\n prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1)\n );\n }\n prev = curr;\n }\n return prev[n];\n}\n","/** UTF-8 byte length without Node `Buffer` (Workers / browsers). */\nexport function utf8ByteLength(text: string): number {\n return new TextEncoder().encode(text).byteLength;\n}\n","import { z } from 'zod';\nimport {\n SITE_URL,\n fetchFreeItem,\n fetchIndex,\n hubSourceUrl,\n isSafeItemName,\n itemLicense,\n suggestNames,\n} from '../registry';\nimport { cliAddCommand, installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\nimport { utf8ByteLength } from '../utf8';\n\nexport const getComponentInput = {\n name: z.string().describe('Registry component name (e.g. button, card)'),\n includeSource: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, include free-tier source file contents. Pro source is never returned via MCP in V1.'\n ),\n};\n\nexport async function getComponent(args: { name: string; includeSource?: boolean }) {\n try {\n const name = args.name.trim();\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n\n const index = await fetchIndex();\n const entry = index.find((i) => i.name === name);\n if (!entry) {\n const suggestions = suggestNames(\n name,\n index.map((i) => i.name)\n );\n return failJson(`Unknown component: '${name}'.`, {\n suggestions,\n listHint: 'Call list_components or search_components.',\n });\n }\n\n const base = {\n ok: true as const,\n name: entry.name,\n tier: entry.tier,\n license: entry.license || itemLicense(entry.tier),\n category: entry.category || 'component',\n description: entry.description || '',\n usage: entry.usage || '',\n keywords: entry.keywords || [],\n dependencies: entry.dependencies,\n registryDependencies: entry.registryDependencies,\n docsUrl: `${SITE_URL}/base-elements/${entry.name}/`,\n pricingUrl: `${SITE_URL}/pricing`,\n };\n\n if (entry.tier === 'pro') {\n return okJson({\n ...base,\n source: null,\n sourceUrl: null,\n installCommand: cliAddCommand(name),\n note: `Pro component — metadata only. ${installHint(name)} Pro install also needs PLY_LICENSE_KEY. Buy at ${SITE_URL}/pricing.`,\n });\n }\n\n const item = await fetchFreeItem(name);\n const files = item.files.map((f) => ({\n path: f.name,\n bytes: utf8ByteLength(f.content),\n ...(args.includeSource ? { content: f.content } : {}),\n }));\n\n return okJson({\n ...base,\n files,\n includeSource: Boolean(args.includeSource),\n sourceUrl: hubSourceUrl(name),\n installCommand: cliAddCommand(name),\n note: args.includeSource\n ? `Free source included for reading. ${installHint(name)}`\n : `Source omitted by default. Pass includeSource=true to read free files here. ${installHint(name)}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","/** Public npm / npx names for the Ply CLI and MCP. */\nexport const CLI_PACKAGE = 'ply-ui-cli';\nexport const CLI_BIN = 'ply-ui-cli';\nexport const CLI_NPX = `npx ${CLI_BIN}`;\nexport const MCP_PACKAGE = 'ply-ui-mcp';\nexport const MCP_NPX = `npx -y ${MCP_PACKAGE}`;\nexport const MCP_SERVER_NAME = 'ply';\n","import { CLI_NPX } from './brand';\n\n/** Copy-paste installer. Hosted catalog MCP cannot write files. */\nexport function cliAddCommand(name?: string): string {\n return name?.trim()\n ? `${CLI_NPX} add ${name.trim()}`\n : `${CLI_NPX} add <name>`;\n}\n\nexport function installHint(name?: string): string {\n return (\n `This catalog does not write files. Install in the project with \\`${cliAddCommand(name)}\\`. ` +\n 'Local stdio MCP (Cursor, Claude Code) can call add_components instead.'\n );\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function okJson(data: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n}\n\nexport function failJson(\n message: string,\n extra: Record<string, unknown> = {}\n): CallToolResult {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: JSON.stringify({ ok: false, error: message, ...extra }, null, 2),\n },\n ],\n };\n}\n","import { z } from 'zod';\nimport { fetchIndex, itemHaystack, itemLicense, type Category } from '../registry';\nimport { installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\n\nconst CATEGORIES = [\n 'application',\n 'page-layout',\n 'block',\n 'widget',\n 'shell',\n 'component',\n] as const satisfies readonly Category[];\n\nexport const listComponentsInput = {\n tier: z\n .enum(['free', 'pro', 'all'])\n .optional()\n .default('all')\n .describe('Filter by license tier'),\n category: z\n .enum(CATEGORIES)\n .optional()\n .describe('Filter by registry category'),\n q: z\n .string()\n .optional()\n .describe('Substring filter on name, description, usage, or keywords (case-insensitive)'),\n};\n\nexport async function listComponents(args: {\n tier?: 'free' | 'pro' | 'all';\n category?: Category;\n q?: string;\n}) {\n try {\n const index = await fetchIndex();\n const tier = args.tier ?? 'all';\n const q = args.q?.trim().toLowerCase();\n\n let items = index;\n if (tier !== 'all') {\n items = items.filter((i) => i.tier === tier);\n }\n if (args.category) {\n items = items.filter((i) => (i.category || 'component') === args.category);\n }\n if (q) {\n items = items.filter((i) => itemHaystack(i).includes(q));\n }\n\n items = [...items].sort((a, b) => a.name.localeCompare(b.name));\n\n return okJson({\n ok: true,\n count: items.length,\n items: items.map((i) => ({\n name: i.name,\n tier: i.tier,\n license: i.license || itemLicense(i.tier),\n category: i.category || 'component',\n description: i.description || '',\n usage: i.usage || '',\n keywords: i.keywords || [],\n dependencies: i.dependencies,\n registryDependencies: i.registryDependencies,\n })),\n hint: `Use get_component for details. ${installHint()}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { canonicalComponentName } from '../aliases';\nimport { fetchIndex, itemHaystack, suggestNames, itemLicense, type Category } from '../registry';\nimport { installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\n\nconst CATEGORIES = [\n 'application',\n 'page-layout',\n 'block',\n 'widget',\n 'shell',\n 'component',\n] as const satisfies readonly Category[];\n\nexport const searchComponentsInput = {\n query: z\n .string()\n .min(1)\n .describe('Natural-language or substring query (e.g. \"dialog modal\", \"button\"). Matches name, description, usage, and keywords.'),\n tier: z\n .enum(['free', 'pro', 'all'])\n .optional()\n .default('all')\n .describe('Filter by license tier'),\n category: z.enum(CATEGORIES).optional().describe('Filter by registry category'),\n limit: z.number().int().min(1).max(40).optional().default(12),\n};\n\nfunction tokenize(query: string): string[] {\n return query\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map((t) => t.trim())\n .filter((t) => t.length >= 2);\n}\n\nexport async function searchComponents(args: {\n query: string;\n tier?: 'free' | 'pro' | 'all';\n category?: Category;\n limit?: number;\n}) {\n try {\n const index = await fetchIndex();\n const tier = args.tier ?? 'all';\n const limit = args.limit ?? 12;\n const rawQuery = args.query.trim();\n const canonical = canonicalComponentName(rawQuery);\n const variants = [...new Set([rawQuery, canonical].filter(Boolean))];\n\n let pool = index;\n if (tier !== 'all') {\n pool = pool.filter((i) => i.tier === tier);\n }\n if (args.category) {\n pool = pool.filter((i) => (i.category || 'component') === args.category);\n }\n\n const names = pool.map((i) => i.name);\n const byFuzzy = new Set(variants.flatMap((q) => suggestNames(q, names, limit)));\n\n const byTokens = pool.filter((i) => {\n const hay = itemHaystack(i);\n return variants.some((q) => {\n const tokens = tokenize(q);\n return tokens.length > 0 && tokens.every((t) => hay.includes(t));\n });\n });\n\n const ranked = [\n ...byTokens.sort((a, b) => a.name.localeCompare(b.name)),\n ...pool\n .filter((i) => byFuzzy.has(i.name) && !byTokens.some((t) => t.name === i.name))\n .sort(\n (a, b) =>\n [...byFuzzy].indexOf(a.name) - [...byFuzzy].indexOf(b.name)\n ),\n ].slice(0, limit);\n\n return okJson({\n ok: true,\n query: args.query,\n count: ranked.length,\n matches: ranked.map((i) => ({\n name: i.name,\n tier: i.tier,\n license: i.license || itemLicense(i.tier),\n category: i.category || 'component',\n description: i.description || '',\n usage: i.usage || '',\n keywords: i.keywords || [],\n registryDependencies: i.registryDependencies,\n })),\n hint: `Next: get_component for details. ${installHint()}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","/** Keep in sync with packages/cli/src/aliases.ts */\nexport const COMPONENT_ALIASES: Record<string, string> = {\n sheet: 'drawer',\n 'side-sheet': 'drawer',\n gallery: 'slider',\n 'image-slider': 'slider',\n slideshow: 'slider',\n range: 'range-slider',\n 'slider-input': 'range-slider',\n 'input-slider': 'range-slider',\n 'base-list-item': 'ply-list-item',\n 'base-tab-icon': 'ply-tab-icon',\n 'base-group-button': 'ply-group-button',\n 'base-dropdown-menu-item': 'ply-dropdown-menu-item',\n 'base-context-menu-item': 'ply-context-menu-item',\n};\n\nexport function canonicalComponentName(name: string): string {\n const key = name.trim().toLowerCase();\n return COMPONENT_ALIASES[key] ?? name.trim();\n}\n","{\n \"name\": \"ply-ui-mcp\",\n \"version\": \"0.1.28\",\n \"description\": \"Ply MCP server — stdio or Streamable HTTP (--http). List, search, init, doctor, diff, update, and add Angular + Tailwind components (Pro with PLY_LICENSE_KEY). Not MUI Base UI.\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"ply-ui-mcp\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"start\": \"node dist/index.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"angular\",\n \"tailwindcss\",\n \"ply\",\n \"ply-ui\",\n \"ply-ui-mcp\",\n \"cli\"\n ],\n \"author\": \"Lussos\",\n \"license\": \"MIT\",\n \"mcpName\": \"io.github.ply-ui-ng/ply-ui\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ply-ui-ng/ply.git\",\n \"directory\": \"packages/mcp\"\n },\n \"homepage\": \"https://ply-ui.com\",\n \"bugs\": {\n \"url\": \"https://github.com/ply-ui-ng/ply/issues\"\n },\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.32.1\",\n \"zod\": \"^4.6.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.5.1\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^7.0.2\",\n \"vitest\": \"^5.0.0\"\n },\n \"overrides\": {\n \"esbuild\": \"0.28.2\",\n \"fast-uri\": \"3.1.8\",\n \"proxy-addr\": \"2.0.8\",\n \"hono\": \"4.13.7\",\n \"qs\": \"6.16.0\"\n }\n}\n","import packageJson from '../package.json' with { type: 'json' };\n\n/** Bundled from packages/mcp/package.json by tsup and by the Workers deploy. */\nexport const PACKAGE_VERSION: string = packageJson.version;\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport {\n SITE_URL,\n fetchIndex,\n isSafeItemName,\n suggestNames,\n} from '../registry';\nimport { failJson, okJson } from '../result';\nimport { canonicalComponentName } from '../aliases';\nimport { CLI_BIN, CLI_NPX } from '../brand';\n\nexport const addComponentsInput = {\n names: z\n .array(z.string().min(1))\n .min(1)\n .describe('One or more registry component names to install (aliases like sheet → drawer are resolved)'),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD / BASE_UI_CWD)'\n ),\n overwrite: z\n .boolean()\n .optional()\n .default(false)\n .describe('Overwrite existing component folders (maps to CLI --overwrite)'),\n licenseKey: z\n .string()\n .optional()\n .describe(\n 'Ply Pro license. Prefer PLY_LICENSE_KEY (or BASE_UI_LICENSE_KEY) in the MCP server env instead of putting a key in chat.'\n ),\n};\n\n/**\n * Installs registry components via the CLI. Pro names require\n * `licenseKey` or `PLY_LICENSE_KEY` / `BASE_UI_LICENSE_KEY`.\n */\nexport async function addComponents(args: {\n names: string[];\n cwd?: string;\n overwrite?: boolean;\n licenseKey?: string;\n}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = [\n ...new Set(\n args.names\n .map((n) => canonicalComponentName(n.trim()))\n .filter(Boolean)\n ),\n ];\n\n if (!names.length) {\n return failJson('Provide at least one component name.');\n }\n\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const index = await fetchIndex();\n const byName = new Map(index.map((i) => [i.name, i]));\n const unknown: string[] = [];\n const pro: string[] = [];\n const free: string[] = [];\n\n for (const name of names) {\n const entry = byName.get(name);\n if (!entry) {\n unknown.push(name);\n continue;\n }\n if (entry.tier === 'pro') {\n pro.push(name);\n } else {\n free.push(name);\n }\n }\n\n if (unknown.length) {\n return failJson('Unknown component name(s).', {\n unknown,\n suggestions: unknown.flatMap((n) =>\n suggestNames(\n n,\n index.map((i) => i.name),\n 3\n )\n ),\n });\n }\n\n const licenseKey =\n args.licenseKey?.trim() ||\n process.env.PLY_LICENSE_KEY?.trim() ||\n process.env.BASE_UI_LICENSE_KEY?.trim() ||\n '';\n\n if (pro.length && !licenseKey) {\n return failJson(\n `Pro components need PLY_LICENSE_KEY (or licenseKey): ${pro.join(', ')}.`,\n {\n pro,\n pricingUrl: `${SITE_URL}/pricing`,\n note: 'Set PLY_LICENSE_KEY on the MCP server process (BASE_UI_LICENSE_KEY still works), then retry. Free components can still be added with this tool.',\n freeCandidates: free,\n }\n );\n }\n\n // Also reject if free items pull Pro registryDependencies (closure).\n const queue = [...free];\n const seen = new Set<string>();\n const proDeps: string[] = [];\n while (queue.length) {\n const name = queue.shift()!;\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = byName.get(name);\n if (!entry) continue;\n if (entry.tier === 'pro') {\n proDeps.push(name);\n continue;\n }\n queue.push(...entry.registryDependencies);\n }\n if (proDeps.length && !licenseKey) {\n return failJson(\n `Install blocked: free selection depends on Pro components: ${proDeps.join(', ')}.`,\n {\n proDependencies: proDeps,\n pricingUrl: `${SITE_URL}/pricing`,\n }\n );\n }\n\n const toInstall = [...free, ...pro];\n const cliArgs = ['add', ...toInstall, '--yes'];\n if (args.overwrite) cliArgs.push('--overwrite');\n\n const result = await runCli(cliArgs, {\n cwd,\n env: licenseKey\n ? { PLY_LICENSE_KEY: licenseKey, BASE_UI_LICENSE_KEY: licenseKey }\n : undefined,\n });\n if (!result.ok) {\n return failJson(`${CLI_BIN} add failed.`, {\n cwd,\n names: toInstall,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: `Ensure the project was initialized (${CLI_NPX} init --yes). CLI remains the canonical install path.`,\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n installed: toInstall,\n cli: `${CLI_BIN} add --yes`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: `Files were written by ${CLI_BIN} (canonical installer). MCP does not replace the CLI.`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { spawn } from 'child_process';\nimport { CLI_PACKAGE } from './brand';\n\n/**\n * Resolve the ply-ui-cli entrypoint.\n * Order: PLY_CLI_PATH → local monorepo dist → node_modules bin → npx.\n */\nexport function resolveCliEntrypoint(): { command: string; argsPrefix: string[] } {\n const envPath = process.env.PLY_CLI_PATH?.trim() || process.env.BASE_UI_CLI_PATH?.trim();\n if (envPath && fs.existsSync(envPath)) {\n return { command: process.execPath, argsPrefix: [envPath] };\n }\n\n const sibling = path.resolve(__dirname, '../../cli/dist/index.js');\n if (fs.existsSync(sibling)) {\n return { command: process.execPath, argsPrefix: [sibling] };\n }\n\n for (const pkg of [CLI_PACKAGE, 'base-ui-cli']) {\n try {\n const pkgJson = require.resolve(`${pkg}/package.json`);\n const bin = path.join(path.dirname(pkgJson), 'dist', 'index.js');\n if (fs.existsSync(bin)) {\n return { command: process.execPath, argsPrefix: [bin] };\n }\n } catch {\n // not installed as a dependency\n }\n }\n\n // npx.cmd is named directly so the child process never needs a shell — see\n // the spawn call below, which deliberately does not set `shell`.\n return { command: process.platform === 'win32' ? 'npx.cmd' : 'npx', argsPrefix: ['-y', CLI_PACKAGE] };\n}\n\nexport interface RunCliResult {\n ok: boolean;\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\nexport function runCli(\n cliArgs: string[],\n options: { cwd: string; env?: NodeJS.ProcessEnv; timeoutMs?: number } = { cwd: process.cwd() }\n): Promise<RunCliResult> {\n const { command, argsPrefix } = resolveCliEntrypoint();\n const args = [...argsPrefix, ...cliArgs];\n const timeoutMs = options.timeoutMs ?? 120_000;\n\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: { ...process.env, ...options.env, FORCE_COLOR: '0' },\n });\n\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n child.kill('SIGTERM');\n resolve({\n ok: false,\n code: null,\n stdout,\n stderr: stderr + `\\nTimed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8');\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ ok: false, code: null, stdout, stderr: err.message });\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ ok: code === 0, code, stdout, stderr });\n });\n });\n}\n\n/** Project root for mutating tools (init/add). Prefer explicit cwd, else process cwd. */\nexport function resolveProjectCwd(cwd?: string): string {\n const root = cwd?.trim() || process.env.PLY_CWD?.trim() || process.env.BASE_UI_CWD?.trim() || process.cwd();\n return path.resolve(root);\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { isSafeItemName } from '../registry';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const diffComponentsInput = {\n names: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Tracked component names to diff. Omit or pass [] to check every component in ply-ui-lock.json.'\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD)'\n ),\n};\n\nexport async function diffComponents(args: { names?: string[]; cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = (args.names ?? []).map((n) => n.trim()).filter(Boolean);\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const cliArgs = names.length ? ['diff', ...names] : ['diff'];\n const result = await runCli(cliArgs, { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} diff failed.`, {\n cwd,\n names,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: 'Project must be initialized and components tracked in ply-ui-lock.json.',\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n names: names.length ? names : 'all-tracked',\n cli: names.length ? `${CLI_BIN} diff ${names.join(' ')}` : `${CLI_BIN} diff`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: 'Read-only. Use update_components to apply upstream changes.',\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const doctorInput = {\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD). Read-only.'\n ),\n};\n\nexport async function doctor(args: { cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const result = await runCli(['doctor'], { cwd });\n const body = {\n cwd,\n cli: `${CLI_BIN} doctor`,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n };\n if (!result.ok) {\n return failJson(`${CLI_BIN} doctor reported problems.`, body);\n }\n return okJson({ ok: true, ...body });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN, CLI_NPX } from '../brand';\n\nexport const initProjectInput = {\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root to initialize (defaults to MCP process cwd / PLY_CWD). Always non-interactive (`init --yes`).'\n ),\n};\n\nexport async function initProject(args: { cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const result = await runCli(['init', '--yes'], { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} init failed.`, {\n cwd,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: `CLI remains the canonical installer: ${CLI_NPX} init --yes`,\n });\n }\n return okJson({\n ok: true,\n cwd,\n cli: `${CLI_BIN} init --yes`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { isSafeItemName } from '../registry';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const updateComponentsInput = {\n names: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Tracked component names to update. Omit or pass [] to update every component in ply-ui-lock.json.'\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD)'\n ),\n force: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'On conflict (both local and upstream changed), take the upstream version. Does not revert local-only edits.'\n ),\n overwriteLocal: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Also revert files you edited that upstream did not change (`--overwrite-local`). Default skips those files.'\n ),\n merge: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'On conflict, apply a 3-way merge using the installed snapshot (`--merge`). force still wins.'\n ),\n};\n\n/**\n * Always non-interactive (`update --yes`). Conflicts are skipped unless `force`.\n * Local-only edits are skipped unless `overwriteLocal`.\n */\nexport async function updateComponents(\n args: {\n names?: string[];\n cwd?: string;\n force?: boolean;\n overwriteLocal?: boolean;\n merge?: boolean;\n } = {}\n) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = (args.names ?? []).map((n) => n.trim()).filter(Boolean);\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const cliArgs = ['update', ...names, '--yes'];\n if (args.force) cliArgs.push('--force');\n if (args.overwriteLocal) cliArgs.push('--overwrite-local');\n if (args.merge) cliArgs.push('--merge');\n\n const result = await runCli(cliArgs, { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} update failed.`, {\n cwd,\n names,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: 'Run diff_components first. Conflicts need --force; local-only edits need overwriteLocal.',\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n names: names.length ? names : 'all-tracked',\n force: Boolean(args.force),\n overwriteLocal: Boolean(args.overwriteLocal),\n merge: Boolean(args.merge),\n cli: [CLI_BIN, ...cliArgs].join(' '),\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: `Files were written by ${CLI_BIN} (canonical updater). MCP does not replace the CLI.`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createCatalogMcpServer } from './catalog';\nimport { addComponents, addComponentsInput } from './tools/add-components';\nimport { diffComponents, diffComponentsInput } from './tools/diff-components';\nimport { doctor, doctorInput } from './tools/doctor';\nimport { initProject, initProjectInput } from './tools/init-project';\nimport { updateComponents, updateComponentsInput } from './tools/update-components';\nimport { CLI_BIN } from './brand';\n\nexport { PACKAGE_VERSION } from './version';\n\nexport interface CreateMcpServerOptions {\n /** When false, mutating CLI tools are omitted (hosted catalog MCP). */\n mutating?: boolean;\n}\n\nexport function createMcpServer(options: CreateMcpServerOptions = {}): McpServer {\n const mutating = options.mutating !== false;\n const server = createCatalogMcpServer();\n\n const readOnlyAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n } as const;\n const writeAnnotations = {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n } as const;\n\n if (mutating) {\n server.registerTool(\n 'add_components',\n {\n title: 'Add Ply components',\n description:\n `Install registry components by shelling to \\`${CLI_BIN} add --yes\\`. --yes leaves an existing component in place; pass overwrite to replace it. Pro names require PLY_LICENSE_KEY (or licenseKey). Project must already have ply-ui.json.`,\n inputSchema: addComponentsInput,\n annotations: writeAnnotations,\n },\n async (args) => addComponents(args)\n );\n\n server.registerTool(\n 'init_project',\n {\n title: 'Initialize Ply in a project',\n description:\n `Run \\`${CLI_BIN} init --yes\\` in the target directory. Writes ply-ui.json, ply-ui.css, and icon sprites only when those files are missing, discovers the stylesheet already listed in angular.json, and inserts @source when it is absent. Always non-interactive.`,\n inputSchema: initProjectInput,\n annotations: writeAnnotations,\n },\n async (args) => initProject(args)\n );\n\n server.registerTool(\n 'doctor',\n {\n title: 'Verify Ply project setup',\n description:\n `Run \\`${CLI_BIN} doctor\\` (read-only). Returns isError when the CLI exits non-zero.`,\n inputSchema: doctorInput,\n annotations: readOnlyAnnotations,\n },\n async (args) => doctor(args)\n );\n\n server.registerTool(\n 'diff_components',\n {\n title: 'Diff installed Ply components',\n description:\n `Run \\`${CLI_BIN} diff\\` against tracked components. Read-only. Omit names to check everything in ply-ui-lock.json.`,\n inputSchema: diffComponentsInput,\n annotations: readOnlyAnnotations,\n },\n async (args) => diffComponents(args)\n );\n\n server.registerTool(\n 'update_components',\n {\n title: 'Update installed Ply components',\n description:\n `Run \\`${CLI_BIN} update --yes\\`. Untouched files take upstream. Conflicts stay local and the CLI exits non-zero unless force or merge. Local-only edits skip unless overwriteLocal.`,\n inputSchema: updateComponentsInput,\n annotations: writeAnnotations,\n },\n async (args) => updateComponents(args)\n );\n }\n\n return server;\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpServer, PACKAGE_VERSION } from './server';\nimport { MCP_PACKAGE } from './brand';\n\nexport interface HttpOptions {\n host: string;\n port: number;\n readOnly: boolean;\n authToken?: string;\n}\n\nfunction setCors(res: ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');\n res.setHeader(\n 'Access-Control-Allow-Headers',\n 'Content-Type, Authorization, Mcp-Session-Id, MCP-Protocol-Version'\n );\n}\n\nfunction unauthorized(res: ServerResponse): void {\n setCors(res);\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Unauthorized' }));\n}\n\nfunction checkAuth(req: IncomingMessage, token?: string): boolean {\n if (!token) return true;\n const header = req.headers.authorization;\n return header === `Bearer ${token}`;\n}\n\nasync function readBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim();\n if (!raw) return undefined;\n return JSON.parse(raw);\n}\n\n/**\n * Streamable HTTP MCP. ChatGPT / Gemini chat apps need a public HTTPS URL\n * pointing at `/mcp`. Mutating tools only work when this process can see\n * the consumer project (local `--http`, not a remote catalog host).\n */\nexport function startHttpServer(options: HttpOptions): ReturnType<typeof createServer> {\n const server = createServer(async (req, res) => {\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n\n if (req.method === 'OPTIONS') {\n setCors(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (url.pathname === '/' && req.method === 'GET') {\n setCors(res);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n ok: true,\n name: MCP_PACKAGE,\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n mcp: '/mcp',\n mutating: !options.readOnly,\n })\n );\n return;\n }\n\n if (url.pathname !== '/mcp') {\n setCors(res);\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not found. MCP is POST/GET /mcp.' }));\n return;\n }\n\n if (!checkAuth(req, options.authToken)) {\n unauthorized(res);\n return;\n }\n\n setCors(res);\n const mcp = createMcpServer({ mutating: !options.readOnly });\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await mcp.connect(transport);\n const parsedBody = req.method === 'POST' ? await readBody(req) : undefined;\n await transport.handleRequest(req, res, parsedBody);\n } catch (err) {\n console.error(`${MCP_PACKAGE} HTTP error:`, err);\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n if (!res.writableEnded) {\n res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));\n }\n }\n });\n\n server.listen(options.port, options.host, () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : options.port;\n console.error(\n `${MCP_PACKAGE} v${PACKAGE_VERSION} Streamable HTTP on http://${options.host}:${port}/mcp` +\n (options.readOnly ? ' (read-only catalog)' : '')\n );\n });\n return server;\n}\n"],"mappings":"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","names":["import_mcp","import_zod","import_zod","import_zod","CATEGORIES","import_zod","fs","path","import_zod","import_zod","import_zod","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/resources.ts","../src/registry.ts","../src/utf8.ts","../src/tools/get-component.ts","../src/brand.ts","../src/install-hint.ts","../src/result.ts","../src/tools/list-components.ts","../src/tools/search-components.ts","../src/aliases.ts","../package.json","../src/version.ts","../src/tools/add-components.ts","../src/cli.ts","../src/tools/diff-components.ts","../src/tools/doctor.ts","../src/tools/init-project.ts","../src/tools/update-components.ts","../src/server.ts","../src/http.ts","../src/auth-metadata.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * ply-ui-mcp — MCP server wrapping the Ply registry + CLI.\n *\n * Default: stdio (Cursor, Claude Code/Desktop, Kimi, VS Code, Windsurf).\n * `--http`: Streamable HTTP for ChatGPT / Gemini chat apps and remote MCP URLs.\n * Hosted HTTP should use `--read-only` so catalog tools work without a local project.\n */\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createMcpServer, PACKAGE_VERSION } from './server';\nimport { startHttpServer } from './http';\nimport { MCP_PACKAGE } from './brand';\n\nfunction parseArgs(argv: string[]): {\n http: boolean;\n readOnly: boolean;\n port: number;\n host: string;\n} {\n let http =\n argv.includes('--http') ||\n process.env.PLY_MCP_HTTP === '1' ||\n process.env.BASE_UI_MCP_HTTP === '1';\n let readOnly =\n argv.includes('--read-only') ||\n process.env.PLY_MCP_READ_ONLY === '1' ||\n process.env.BASE_UI_MCP_READ_ONLY === '1';\n let port = Number(process.env.PORT || process.env.PLY_MCP_PORT || process.env.BASE_UI_MCP_PORT || 3334);\n let host = process.env.PLY_MCP_HOST || process.env.BASE_UI_MCP_HOST || (http ? '127.0.0.1' : '127.0.0.1');\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === '--port' && argv[i + 1]) {\n port = Number(argv[++i]);\n } else if (arg?.startsWith('--port=')) {\n port = Number(arg.slice('--port='.length));\n } else if (arg === '--host' && argv[i + 1]) {\n host = argv[++i]!;\n } else if (arg?.startsWith('--host=')) {\n host = arg.slice('--host='.length);\n }\n }\n if (!Number.isFinite(port) || port <= 0) port = 3334;\n return { http, readOnly, port, host };\n}\n\nasync function main() {\n const opts = parseArgs(process.argv.slice(2));\n if (opts.http) {\n startHttpServer({\n host: opts.host,\n port: opts.port,\n readOnly: opts.readOnly,\n authToken:\n process.env.PLY_MCP_AUTH_TOKEN?.trim() ||\n process.env.BASE_UI_MCP_AUTH_TOKEN?.trim() ||\n undefined,\n });\n return;\n }\n\n const server = createMcpServer({ mutating: true });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(`${MCP_PACKAGE} v${PACKAGE_VERSION} ready on stdio`);\n}\n\nmain().catch((err) => {\n console.error(`${MCP_PACKAGE} failed to start:`, err);\n process.exit(1);\n});\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { registerResources } from './resources';\nimport { getComponent, getComponentInput } from './tools/get-component';\nimport { listComponents, listComponentsInput } from './tools/list-components';\nimport { searchComponents, searchComponentsInput } from './tools/search-components';\nimport { PACKAGE_VERSION } from './version';\nimport { CLI_NPX, MCP_SERVER_NAME } from './brand';\n\n/** ChatGPT treats tools as writes unless readOnlyHint is set. */\nconst catalogAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n} as const;\n\n/** Catalog-only server: safe to bundle on Cloudflare Workers (no child_process). */\nexport function createCatalogMcpServer(): McpServer {\n const server = new McpServer({\n name: MCP_SERVER_NAME,\n version: PACKAGE_VERSION,\n });\n\n server.registerTool(\n 'list_components',\n {\n title: 'List Ply components',\n description:\n `List components from the Ply registry. Filter by tier (free|pro|all), category, or name substring. Does not install anything. To copy a component into a project, tell the user to run ${CLI_NPX} add <name>.`,\n inputSchema: listComponentsInput,\n annotations: catalogAnnotations,\n },\n async (args) => listComponents(args)\n );\n\n server.registerTool(\n 'get_component',\n {\n title: 'Get component details',\n description:\n `Get registry metadata for one component (deps, category, file list). Free source only when includeSource=true. Pro source is never streamed via MCP. Does not install; returns installCommand (${CLI_NPX} add <name>).`,\n inputSchema: getComponentInput,\n annotations: catalogAnnotations,\n },\n async (args) => getComponent(args)\n );\n\n server.registerTool(\n 'search_components',\n {\n title: 'Search Ply components',\n description:\n `Fuzzy / token search over registry component names (e.g. \"dialog\", \"sheet\", \"carousel\"). Does not install anything. Prefer this before guessing names, then give the user ${CLI_NPX} add <name> (or local stdio add_components).`,\n inputSchema: searchComponentsInput,\n annotations: catalogAnnotations,\n },\n async (args) => searchComponents(args)\n );\n\n registerResources(server);\n return server;\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n SITE_URL,\n fetchFreeItem,\n fetchIndex,\n fetchText,\n isSafeItemName,\n} from './registry';\nimport { utf8ByteLength } from './utf8';\n\nexport function registerResources(server: McpServer) {\n server.registerResource(\n 'registry-index',\n 'ply-ui://registry/index',\n {\n title: 'Registry index',\n description: 'Public Ply registry index (names, tiers, categories, description, usage, keywords, deps)',\n mimeType: 'application/json',\n },\n async (uri) => {\n const index = await fetchIndex();\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(index, null, 2),\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'docs-llms',\n 'ply-ui://docs/llms',\n {\n title: 'llms.txt',\n description:\n 'Agent-oriented product overview (keep fetching this URL even when MCP is available)',\n mimeType: 'text/plain',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/llms.txt`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/plain', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-catalog',\n 'ply-ui://docs/catalog',\n {\n title: 'AI component catalog',\n description: 'docs/ai/components.md — detailed component reference for agents',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/components.md`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/markdown', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-cursor-rules',\n 'ply-ui://docs/cursor-rules',\n {\n title: 'Cursor / Windsurf project rules',\n description:\n 'Save as .cursor/rules/ply-ui.mdc (or .windsurf/rules/ply-ui.md). Teaches assistants to write standalone zoneless Angular 22 with Ply without running MCP.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/ply-ui.mdc`);\n return {\n contents: [{ uri: uri.href, mimeType: 'text/markdown', text }],\n };\n }\n );\n\n server.registerResource(\n 'docs-snippets',\n 'ply-ui://docs/snippets',\n {\n title: 'VS Code / Cursor snippets',\n description:\n 'Save as .vscode/ply-ui.code-snippets. Prefixes like ply-card expand usage markup after CLI install.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const text = await fetchText(`${SITE_URL}/docs/ai/ply-ui.code-snippets`);\n return {\n contents: [{ uri: uri.href, mimeType: 'application/json', text }],\n };\n }\n );\n\n server.registerResource(\n 'component',\n new ResourceTemplate('ply-ui://component/{name}', {\n list: undefined,\n }),\n {\n title: 'Component metadata',\n description:\n 'Registry metadata for one component. Free source files are listed without content; Pro never streams source via MCP in V1.',\n mimeType: 'application/json',\n },\n async (uri, vars) => {\n const name = String(vars.name || '');\n if (!isSafeItemName(name)) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: `Invalid name: ${name}` }),\n },\n ],\n };\n }\n const index = await fetchIndex();\n const entry = index.find((i) => i.name === name);\n if (!entry) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: `Unknown component: ${name}` }),\n },\n ],\n };\n }\n\n if (entry.tier === 'pro') {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n ...entry,\n files: null,\n note: `Pro — metadata only. ${SITE_URL}/pricing`,\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n const item = await fetchFreeItem(name);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n name: item.name,\n tier: item.tier,\n category: item.category,\n description: item.description,\n usage: item.usage,\n keywords: item.keywords,\n dependencies: item.dependencies,\n registryDependencies: item.registryDependencies,\n files: item.files.map((f) => ({\n path: f.name,\n bytes: utf8ByteLength(f.content),\n })),\n },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n}\n","/**\n * Thin registry client — mirrors packages/cli/src/registry.ts URLs/schemas\n * so the MCP server can return structured JSON without parsing CLI stdout.\n * Install/write side effects still go through ply-ui-cli (canonical path).\n */\nimport { z } from 'zod';\n\nexport const SITE_URL = 'https://ply-ui.com';\nexport const GITHUB_HUB_URL = 'https://github.com/ply-ui-ng/ply';\n\nconst env =\n typeof process !== 'undefined' && process.env ? process.env : ({} as Record<string, string | undefined>);\n\nfunction firstEnv(...names: string[]): string | undefined {\n for (const name of names) {\n const v = env[name]?.trim();\n if (v) return v;\n }\n}\n\nexport const FREE_REGISTRY_URL =\n firstEnv('PLY_REGISTRY_URL', 'BASE_UI_REGISTRY_URL') || `${SITE_URL}/registry`;\n\nexport const PRO_REGISTRY_URL =\n firstEnv('PLY_PRO_REGISTRY_URL', 'BASE_UI_PRO_REGISTRY_URL') ||\n 'https://pro.ply-ui.com/registry';\n\nconst registryFileSchema = z.object({\n name: z.string(),\n content: z.string(),\n});\n\nexport const registryItemSchema = z.object({\n name: z.string(),\n tier: z.enum(['free', 'pro']),\n category: z\n .enum(['application', 'page-layout', 'block', 'widget', 'shell', 'component'])\n .optional()\n .default('component'),\n dependencies: z.array(z.string()).default([]),\n registryDependencies: z.array(z.string()).default([]),\n description: z.string().optional().default(''),\n usage: z.string().optional().default(''),\n keywords: z.array(z.string()).optional().default([]),\n files: z.array(registryFileSchema),\n type: z.string().optional(),\n license: z.enum(['MIT', 'Ply Pro']).optional(),\n});\n\nexport const registryIndexSchema = z.array(registryItemSchema.omit({ files: true }));\n\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\nexport type RegistryIndexEntry = z.infer<typeof registryIndexSchema>[number];\n\nexport type Category = NonNullable<RegistryIndexEntry['category']>;\n\nexport function itemLicense(tier: 'free' | 'pro'): 'MIT' | 'Ply Pro' {\n return tier === 'pro' ? 'Ply Pro' : 'MIT';\n}\n\nexport function hubSourceUrl(name: string): string {\n return `${GITHUB_HUB_URL}/tree/main/components/${name}`;\n}\n\nexport function itemHaystack(\n item: Pick<RegistryIndexEntry, 'name' | 'description' | 'usage' | 'keywords'>\n): string {\n return [item.name, item.description, item.usage, ...(item.keywords ?? [])]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n}\n\nexport function isSafeItemName(name: string): boolean {\n return /^[a-z0-9][a-z0-9-.]*$/i.test(name) && !name.includes('..');\n}\n\nasync function fetchJson(url: string, headers: Record<string, string> = {}): Promise<unknown> {\n let res: Response;\n try {\n res = await fetch(url, { headers });\n } catch (err: any) {\n throw new Error(\n `Network error while contacting the registry (${err.message}). Check your connection and try again.`\n );\n }\n if (res.status === 401 || res.status === 403) {\n throw new Error(\n `License rejected (HTTP ${res.status}). Check PLY_LICENSE_KEY, or see ${SITE_URL}/pricing.`\n );\n }\n if (res.status === 404) {\n const e: any = new Error('Not found');\n e.code = 'NOT_FOUND';\n throw e;\n }\n if (!res.ok) {\n throw new Error(`Registry request failed (HTTP ${res.status}) for ${url}.`);\n }\n return res.json();\n}\n\nexport async function fetchIndex(): Promise<RegistryIndexEntry[]> {\n const data = await fetchJson(`${FREE_REGISTRY_URL}/index.json`);\n return registryIndexSchema.parse(data);\n}\n\n/** Free registry item only — V1 never streams Pro source through MCP. */\nexport async function fetchFreeItem(name: string): Promise<RegistryItem> {\n if (!isSafeItemName(name)) {\n throw new Error(`Invalid component name: '${name}'.`);\n }\n const data = await fetchJson(`${FREE_REGISTRY_URL}/styles/default/${name}.json`);\n return registryItemSchema.parse(data);\n}\n\nexport async function fetchText(url: string): Promise<string> {\n let res: Response;\n try {\n res = await fetch(url);\n } catch (err: any) {\n throw new Error(`Network error fetching ${url}: ${err.message}`);\n }\n if (!res.ok) {\n throw new Error(`Failed to fetch ${url} (HTTP ${res.status}).`);\n }\n return res.text();\n}\n\n/** Closest names to `query`, for search / suggestions. */\nexport function suggestNames(query: string, names: string[], limit = 8): string[] {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n const scored = names\n .map((name) => {\n const n = name.toLowerCase();\n let score: number;\n if (n === q) score = 0;\n else if (n.startsWith(q) || q.startsWith(n)) score = 1;\n else if (n.includes(q) || q.includes(n)) score = 2;\n else score = 3 + levenshtein(q, n);\n return { name, score };\n })\n .filter((s) => s.score <= 6)\n .sort((a, b) => a.score - b.score || a.name.localeCompare(b.name));\n return scored.slice(0, limit).map((s) => s.name);\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (!m) return n;\n if (!n) return m;\n let prev = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n const curr = [i];\n for (let j = 1; j <= n; j++) {\n curr[j] = Math.min(\n prev[j] + 1,\n curr[j - 1] + 1,\n prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1)\n );\n }\n prev = curr;\n }\n return prev[n];\n}\n","/** UTF-8 byte length without Node `Buffer` (Workers / browsers). */\nexport function utf8ByteLength(text: string): number {\n return new TextEncoder().encode(text).byteLength;\n}\n","import { z } from 'zod';\nimport {\n SITE_URL,\n fetchFreeItem,\n fetchIndex,\n hubSourceUrl,\n isSafeItemName,\n itemLicense,\n suggestNames,\n} from '../registry';\nimport { cliAddCommand, installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\nimport { utf8ByteLength } from '../utf8';\n\nexport const getComponentInput = {\n name: z.string().describe('Registry component name (e.g. button, card)'),\n includeSource: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, include free-tier source file contents. Pro source is never returned via MCP in V1.'\n ),\n};\n\nexport async function getComponent(args: { name: string; includeSource?: boolean }) {\n try {\n const name = args.name.trim();\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n\n const index = await fetchIndex();\n const entry = index.find((i) => i.name === name);\n if (!entry) {\n const suggestions = suggestNames(\n name,\n index.map((i) => i.name)\n );\n return failJson(`Unknown component: '${name}'.`, {\n suggestions,\n listHint: 'Call list_components or search_components.',\n });\n }\n\n const base = {\n ok: true as const,\n name: entry.name,\n tier: entry.tier,\n license: entry.license || itemLicense(entry.tier),\n category: entry.category || 'component',\n description: entry.description || '',\n usage: entry.usage || '',\n keywords: entry.keywords || [],\n dependencies: entry.dependencies,\n registryDependencies: entry.registryDependencies,\n docsUrl: `${SITE_URL}/base-elements/${entry.name}/`,\n pricingUrl: `${SITE_URL}/pricing`,\n };\n\n if (entry.tier === 'pro') {\n return okJson({\n ...base,\n source: null,\n sourceUrl: null,\n installCommand: cliAddCommand(name),\n note: `Pro component — metadata only. ${installHint(name)} Pro install also needs PLY_LICENSE_KEY. Buy at ${SITE_URL}/pricing.`,\n });\n }\n\n const item = await fetchFreeItem(name);\n const files = item.files.map((f) => ({\n path: f.name,\n bytes: utf8ByteLength(f.content),\n ...(args.includeSource ? { content: f.content } : {}),\n }));\n\n return okJson({\n ...base,\n files,\n includeSource: Boolean(args.includeSource),\n sourceUrl: hubSourceUrl(name),\n installCommand: cliAddCommand(name),\n note: args.includeSource\n ? `Free source included for reading. ${installHint(name)}`\n : `Source omitted by default. Pass includeSource=true to read free files here. ${installHint(name)}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","/** Public npm / npx names for the Ply CLI and MCP. */\nexport const CLI_PACKAGE = 'ply-ui-cli';\nexport const CLI_BIN = 'ply-ui-cli';\nexport const CLI_NPX = `npx ${CLI_BIN}`;\nexport const MCP_PACKAGE = 'ply-ui-mcp';\nexport const MCP_NPX = `npx -y ${MCP_PACKAGE}`;\nexport const MCP_SERVER_NAME = 'ply';\n","import { CLI_NPX } from './brand';\n\n/** Copy-paste installer. Hosted catalog MCP cannot write files. */\nexport function cliAddCommand(name?: string): string {\n return name?.trim()\n ? `${CLI_NPX} add ${name.trim()}`\n : `${CLI_NPX} add <name>`;\n}\n\nexport function installHint(name?: string): string {\n return (\n `This catalog does not write files. Install in the project with \\`${cliAddCommand(name)}\\`. ` +\n 'Local stdio MCP (Cursor, Claude Code) can call add_components instead.'\n );\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function okJson(data: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n}\n\nexport function failJson(\n message: string,\n extra: Record<string, unknown> = {}\n): CallToolResult {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: JSON.stringify({ ok: false, error: message, ...extra }, null, 2),\n },\n ],\n };\n}\n","import { z } from 'zod';\nimport { fetchIndex, itemHaystack, itemLicense, type Category } from '../registry';\nimport { installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\n\nconst CATEGORIES = [\n 'application',\n 'page-layout',\n 'block',\n 'widget',\n 'shell',\n 'component',\n] as const satisfies readonly Category[];\n\nexport const listComponentsInput = {\n tier: z\n .enum(['free', 'pro', 'all'])\n .optional()\n .default('all')\n .describe('Filter by license tier'),\n category: z\n .enum(CATEGORIES)\n .optional()\n .describe('Filter by registry category'),\n q: z\n .string()\n .optional()\n .describe('Substring filter on name, description, usage, or keywords (case-insensitive)'),\n};\n\nexport async function listComponents(args: {\n tier?: 'free' | 'pro' | 'all';\n category?: Category;\n q?: string;\n}) {\n try {\n const index = await fetchIndex();\n const tier = args.tier ?? 'all';\n const q = args.q?.trim().toLowerCase();\n\n let items = index;\n if (tier !== 'all') {\n items = items.filter((i) => i.tier === tier);\n }\n if (args.category) {\n items = items.filter((i) => (i.category || 'component') === args.category);\n }\n if (q) {\n items = items.filter((i) => itemHaystack(i).includes(q));\n }\n\n items = [...items].sort((a, b) => a.name.localeCompare(b.name));\n\n return okJson({\n ok: true,\n count: items.length,\n items: items.map((i) => ({\n name: i.name,\n tier: i.tier,\n license: i.license || itemLicense(i.tier),\n category: i.category || 'component',\n description: i.description || '',\n usage: i.usage || '',\n keywords: i.keywords || [],\n dependencies: i.dependencies,\n registryDependencies: i.registryDependencies,\n })),\n hint: `Use get_component for details. ${installHint()}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { canonicalComponentName } from '../aliases';\nimport { fetchIndex, itemHaystack, suggestNames, itemLicense, type Category } from '../registry';\nimport { installHint } from '../install-hint';\nimport { failJson, okJson } from '../result';\n\nconst CATEGORIES = [\n 'application',\n 'page-layout',\n 'block',\n 'widget',\n 'shell',\n 'component',\n] as const satisfies readonly Category[];\n\nexport const searchComponentsInput = {\n query: z\n .string()\n .min(1)\n .describe('Natural-language or substring query (e.g. \"dialog modal\", \"button\"). Matches name, description, usage, and keywords.'),\n tier: z\n .enum(['free', 'pro', 'all'])\n .optional()\n .default('all')\n .describe('Filter by license tier'),\n category: z.enum(CATEGORIES).optional().describe('Filter by registry category'),\n limit: z.number().int().min(1).max(40).optional().default(12),\n};\n\nfunction tokenize(query: string): string[] {\n return query\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map((t) => t.trim())\n .filter((t) => t.length >= 2);\n}\n\nexport async function searchComponents(args: {\n query: string;\n tier?: 'free' | 'pro' | 'all';\n category?: Category;\n limit?: number;\n}) {\n try {\n const index = await fetchIndex();\n const tier = args.tier ?? 'all';\n const limit = args.limit ?? 12;\n const rawQuery = args.query.trim();\n const canonical = canonicalComponentName(rawQuery);\n const variants = [...new Set([rawQuery, canonical].filter(Boolean))];\n\n let pool = index;\n if (tier !== 'all') {\n pool = pool.filter((i) => i.tier === tier);\n }\n if (args.category) {\n pool = pool.filter((i) => (i.category || 'component') === args.category);\n }\n\n const names = pool.map((i) => i.name);\n const byFuzzy = new Set(variants.flatMap((q) => suggestNames(q, names, limit)));\n\n const byTokens = pool.filter((i) => {\n const hay = itemHaystack(i);\n return variants.some((q) => {\n const tokens = tokenize(q);\n return tokens.length > 0 && tokens.every((t) => hay.includes(t));\n });\n });\n\n const ranked = [\n ...byTokens.sort((a, b) => a.name.localeCompare(b.name)),\n ...pool\n .filter((i) => byFuzzy.has(i.name) && !byTokens.some((t) => t.name === i.name))\n .sort(\n (a, b) =>\n [...byFuzzy].indexOf(a.name) - [...byFuzzy].indexOf(b.name)\n ),\n ].slice(0, limit);\n\n return okJson({\n ok: true,\n query: args.query,\n count: ranked.length,\n matches: ranked.map((i) => ({\n name: i.name,\n tier: i.tier,\n license: i.license || itemLicense(i.tier),\n category: i.category || 'component',\n description: i.description || '',\n usage: i.usage || '',\n keywords: i.keywords || [],\n registryDependencies: i.registryDependencies,\n })),\n hint: `Next: get_component for details. ${installHint()}`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","/** Keep in sync with packages/cli/src/aliases.ts */\nexport const COMPONENT_ALIASES: Record<string, string> = {\n sheet: 'drawer',\n 'side-sheet': 'drawer',\n gallery: 'slider',\n 'image-slider': 'slider',\n slideshow: 'slider',\n range: 'range-slider',\n 'slider-input': 'range-slider',\n 'input-slider': 'range-slider',\n 'base-list-item': 'ply-list-item',\n 'base-tab-icon': 'ply-tab-icon',\n 'base-group-button': 'ply-group-button',\n 'base-dropdown-menu-item': 'ply-dropdown-menu-item',\n 'base-context-menu-item': 'ply-context-menu-item',\n};\n\nexport function canonicalComponentName(name: string): string {\n const key = name.trim().toLowerCase();\n return COMPONENT_ALIASES[key] ?? name.trim();\n}\n","{\n \"name\": \"ply-ui-mcp\",\n \"version\": \"0.1.30\",\n \"description\": \"Ply MCP server — stdio or Streamable HTTP (--http). List, search, init, doctor, diff, update, and add Angular + Tailwind components (Pro with PLY_LICENSE_KEY). Not MUI Base UI.\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"ply-ui-mcp\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"start\": \"node dist/index.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"angular\",\n \"tailwindcss\",\n \"ply\",\n \"ply-ui\",\n \"ply-ui-mcp\",\n \"cli\"\n ],\n \"author\": \"Lussos\",\n \"license\": \"MIT\",\n \"mcpName\": \"io.github.ply-ui-ng/ply-ui\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ply-ui-ng/ply.git\",\n \"directory\": \"packages/mcp\"\n },\n \"homepage\": \"https://ply-ui.com\",\n \"bugs\": {\n \"url\": \"https://github.com/ply-ui-ng/ply/issues\"\n },\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.32.1\",\n \"zod\": \"^4.6.2\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.5.1\",\n \"tsup\": \"^9.0.0\",\n \"typescript\": \"^7.0.2\",\n \"vitest\": \"^5.0.0\"\n },\n \"overrides\": {\n \"esbuild\": \"0.28.2\",\n \"fast-uri\": \"3.1.8\",\n \"proxy-addr\": \"2.0.8\",\n \"hono\": \"4.13.7\",\n \"qs\": \"6.16.0\"\n }\n}\n","import packageJson from '../package.json' with { type: 'json' };\n\n/** Bundled from packages/mcp/package.json by tsup and by the Workers deploy. */\nexport const PACKAGE_VERSION: string = packageJson.version;\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport {\n SITE_URL,\n fetchIndex,\n isSafeItemName,\n suggestNames,\n} from '../registry';\nimport { failJson, okJson } from '../result';\nimport { canonicalComponentName } from '../aliases';\nimport { CLI_BIN, CLI_NPX } from '../brand';\n\nexport const addComponentsInput = {\n names: z\n .array(z.string().min(1))\n .min(1)\n .describe('One or more registry component names to install (aliases like sheet → drawer are resolved)'),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD / BASE_UI_CWD)'\n ),\n overwrite: z\n .boolean()\n .optional()\n .default(false)\n .describe('Overwrite existing component folders (maps to CLI --overwrite)'),\n licenseKey: z\n .string()\n .optional()\n .describe(\n 'Ply Pro license. Prefer PLY_LICENSE_KEY (or BASE_UI_LICENSE_KEY) in the MCP server env instead of putting a key in chat.'\n ),\n};\n\n/**\n * Installs registry components via the CLI. Pro names require\n * `licenseKey` or `PLY_LICENSE_KEY` / `BASE_UI_LICENSE_KEY`.\n */\nexport async function addComponents(args: {\n names: string[];\n cwd?: string;\n overwrite?: boolean;\n licenseKey?: string;\n}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = [\n ...new Set(\n args.names\n .map((n) => canonicalComponentName(n.trim()))\n .filter(Boolean)\n ),\n ];\n\n if (!names.length) {\n return failJson('Provide at least one component name.');\n }\n\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const index = await fetchIndex();\n const byName = new Map(index.map((i) => [i.name, i]));\n const unknown: string[] = [];\n const pro: string[] = [];\n const free: string[] = [];\n\n for (const name of names) {\n const entry = byName.get(name);\n if (!entry) {\n unknown.push(name);\n continue;\n }\n if (entry.tier === 'pro') {\n pro.push(name);\n } else {\n free.push(name);\n }\n }\n\n if (unknown.length) {\n return failJson('Unknown component name(s).', {\n unknown,\n suggestions: unknown.flatMap((n) =>\n suggestNames(\n n,\n index.map((i) => i.name),\n 3\n )\n ),\n });\n }\n\n const licenseKey =\n args.licenseKey?.trim() ||\n process.env.PLY_LICENSE_KEY?.trim() ||\n process.env.BASE_UI_LICENSE_KEY?.trim() ||\n '';\n\n if (pro.length && !licenseKey) {\n return failJson(\n `Pro components need PLY_LICENSE_KEY (or licenseKey): ${pro.join(', ')}.`,\n {\n pro,\n pricingUrl: `${SITE_URL}/pricing`,\n note: 'Set PLY_LICENSE_KEY on the MCP server process (BASE_UI_LICENSE_KEY still works), then retry. Free components can still be added with this tool.',\n freeCandidates: free,\n }\n );\n }\n\n // Also reject if free items pull Pro registryDependencies (closure).\n const queue = [...free];\n const seen = new Set<string>();\n const proDeps: string[] = [];\n while (queue.length) {\n const name = queue.shift()!;\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = byName.get(name);\n if (!entry) continue;\n if (entry.tier === 'pro') {\n proDeps.push(name);\n continue;\n }\n queue.push(...entry.registryDependencies);\n }\n if (proDeps.length && !licenseKey) {\n return failJson(\n `Install blocked: free selection depends on Pro components: ${proDeps.join(', ')}.`,\n {\n proDependencies: proDeps,\n pricingUrl: `${SITE_URL}/pricing`,\n }\n );\n }\n\n const toInstall = [...free, ...pro];\n const cliArgs = ['add', ...toInstall, '--yes'];\n if (args.overwrite) cliArgs.push('--overwrite');\n\n const result = await runCli(cliArgs, {\n cwd,\n env: licenseKey\n ? { PLY_LICENSE_KEY: licenseKey, BASE_UI_LICENSE_KEY: licenseKey }\n : undefined,\n });\n if (!result.ok) {\n return failJson(`${CLI_BIN} add failed.`, {\n cwd,\n names: toInstall,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: `Ensure the project was initialized (${CLI_NPX} init --yes). CLI remains the canonical install path.`,\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n installed: toInstall,\n cli: `${CLI_BIN} add --yes`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: `Files were written by ${CLI_BIN} (canonical installer). MCP does not replace the CLI.`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { spawn } from 'child_process';\nimport { CLI_PACKAGE } from './brand';\n\n/**\n * Resolve the ply-ui-cli entrypoint.\n * Order: PLY_CLI_PATH → local monorepo dist → node_modules bin → npx.\n */\nexport function resolveCliEntrypoint(): { command: string; argsPrefix: string[] } {\n const envPath = process.env.PLY_CLI_PATH?.trim() || process.env.BASE_UI_CLI_PATH?.trim();\n if (envPath && fs.existsSync(envPath)) {\n return { command: process.execPath, argsPrefix: [envPath] };\n }\n\n const sibling = path.resolve(__dirname, '../../cli/dist/index.js');\n if (fs.existsSync(sibling)) {\n return { command: process.execPath, argsPrefix: [sibling] };\n }\n\n for (const pkg of [CLI_PACKAGE, 'base-ui-cli']) {\n try {\n const pkgJson = require.resolve(`${pkg}/package.json`);\n const bin = path.join(path.dirname(pkgJson), 'dist', 'index.js');\n if (fs.existsSync(bin)) {\n return { command: process.execPath, argsPrefix: [bin] };\n }\n } catch {\n // not installed as a dependency\n }\n }\n\n // npx.cmd is named directly so the child process never needs a shell — see\n // the spawn call below, which deliberately does not set `shell`.\n return { command: process.platform === 'win32' ? 'npx.cmd' : 'npx', argsPrefix: ['-y', CLI_PACKAGE] };\n}\n\nexport interface RunCliResult {\n ok: boolean;\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\nexport function runCli(\n cliArgs: string[],\n options: { cwd: string; env?: NodeJS.ProcessEnv; timeoutMs?: number } = { cwd: process.cwd() }\n): Promise<RunCliResult> {\n const { command, argsPrefix } = resolveCliEntrypoint();\n const args = [...argsPrefix, ...cliArgs];\n const timeoutMs = options.timeoutMs ?? 120_000;\n\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: { ...process.env, ...options.env, FORCE_COLOR: '0' },\n });\n\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n child.kill('SIGTERM');\n resolve({\n ok: false,\n code: null,\n stdout,\n stderr: stderr + `\\nTimed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8');\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ ok: false, code: null, stdout, stderr: err.message });\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ ok: code === 0, code, stdout, stderr });\n });\n });\n}\n\n/** Project root for mutating tools (init/add). Prefer explicit cwd, else process cwd. */\nexport function resolveProjectCwd(cwd?: string): string {\n const root = cwd?.trim() || process.env.PLY_CWD?.trim() || process.env.BASE_UI_CWD?.trim() || process.cwd();\n return path.resolve(root);\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { isSafeItemName } from '../registry';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const diffComponentsInput = {\n names: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Tracked component names to diff. Omit or pass [] to check every component in ply-ui-lock.json.'\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD)'\n ),\n};\n\nexport async function diffComponents(args: { names?: string[]; cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = (args.names ?? []).map((n) => n.trim()).filter(Boolean);\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const cliArgs = names.length ? ['diff', ...names] : ['diff'];\n const result = await runCli(cliArgs, { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} diff failed.`, {\n cwd,\n names,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: 'Project must be initialized and components tracked in ply-ui-lock.json.',\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n names: names.length ? names : 'all-tracked',\n cli: names.length ? `${CLI_BIN} diff ${names.join(' ')}` : `${CLI_BIN} diff`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: 'Read-only. Use update_components to apply upstream changes.',\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const doctorInput = {\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD). Read-only.'\n ),\n};\n\nexport async function doctor(args: { cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const result = await runCli(['doctor'], { cwd });\n const body = {\n cwd,\n cli: `${CLI_BIN} doctor`,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n };\n if (!result.ok) {\n return failJson(`${CLI_BIN} doctor reported problems.`, body);\n }\n return okJson({ ok: true, ...body });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN, CLI_NPX } from '../brand';\n\nexport const initProjectInput = {\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root to initialize (defaults to MCP process cwd / PLY_CWD). Always non-interactive (`init --yes`).'\n ),\n};\n\nexport async function initProject(args: { cwd?: string } = {}) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const result = await runCli(['init', '--yes'], { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} init failed.`, {\n cwd,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: `CLI remains the canonical installer: ${CLI_NPX} init --yes`,\n });\n }\n return okJson({\n ok: true,\n cwd,\n cli: `${CLI_BIN} init --yes`,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { z } from 'zod';\nimport { resolveProjectCwd, runCli } from '../cli';\nimport { isSafeItemName } from '../registry';\nimport { failJson, okJson } from '../result';\nimport { CLI_BIN } from '../brand';\n\nexport const updateComponentsInput = {\n names: z\n .array(z.string().min(1))\n .optional()\n .describe(\n 'Tracked component names to update. Omit or pass [] to update every component in ply-ui-lock.json.'\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n 'Project root containing ply-ui.json (defaults to MCP process cwd / PLY_CWD)'\n ),\n force: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'On conflict (both local and upstream changed), take the upstream version. Does not revert local-only edits.'\n ),\n overwriteLocal: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Also revert files you edited that upstream did not change (`--overwrite-local`). Default skips those files.'\n ),\n merge: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'On conflict, apply a 3-way merge using the installed snapshot (`--merge`). force still wins.'\n ),\n};\n\n/**\n * Always non-interactive (`update --yes`). Conflicts are skipped unless `force`.\n * Local-only edits are skipped unless `overwriteLocal`.\n */\nexport async function updateComponents(\n args: {\n names?: string[];\n cwd?: string;\n force?: boolean;\n overwriteLocal?: boolean;\n merge?: boolean;\n } = {}\n) {\n try {\n const cwd = resolveProjectCwd(args.cwd);\n const names = (args.names ?? []).map((n) => n.trim()).filter(Boolean);\n for (const name of names) {\n if (!isSafeItemName(name)) {\n return failJson(`Invalid component name: '${name}'.`);\n }\n }\n\n const cliArgs = ['update', ...names, '--yes'];\n if (args.force) cliArgs.push('--force');\n if (args.overwriteLocal) cliArgs.push('--overwrite-local');\n if (args.merge) cliArgs.push('--merge');\n\n const result = await runCli(cliArgs, { cwd });\n if (!result.ok) {\n return failJson(`${CLI_BIN} update failed.`, {\n cwd,\n names,\n exitCode: result.code,\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim(),\n hint: 'Run diff_components first. Conflicts need --force; local-only edits need overwriteLocal.',\n });\n }\n\n return okJson({\n ok: true,\n cwd,\n names: names.length ? names : 'all-tracked',\n force: Boolean(args.force),\n overwriteLocal: Boolean(args.overwriteLocal),\n merge: Boolean(args.merge),\n cli: [CLI_BIN, ...cliArgs].join(' '),\n stdout: result.stdout.trim(),\n stderr: result.stderr.trim() || undefined,\n note: `Files were written by ${CLI_BIN} (canonical updater). MCP does not replace the CLI.`,\n });\n } catch (err: any) {\n return failJson(err.message || String(err));\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createCatalogMcpServer } from './catalog';\nimport { addComponents, addComponentsInput } from './tools/add-components';\nimport { diffComponents, diffComponentsInput } from './tools/diff-components';\nimport { doctor, doctorInput } from './tools/doctor';\nimport { initProject, initProjectInput } from './tools/init-project';\nimport { updateComponents, updateComponentsInput } from './tools/update-components';\nimport { CLI_BIN } from './brand';\n\nexport { PACKAGE_VERSION } from './version';\n\nexport interface CreateMcpServerOptions {\n /** When false, mutating CLI tools are omitted (hosted catalog MCP). */\n mutating?: boolean;\n}\n\nexport function createMcpServer(options: CreateMcpServerOptions = {}): McpServer {\n const mutating = options.mutating !== false;\n const server = createCatalogMcpServer();\n\n const readOnlyAnnotations = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n } as const;\n const writeAnnotations = {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n } as const;\n\n if (mutating) {\n server.registerTool(\n 'add_components',\n {\n title: 'Add Ply components',\n description:\n `Install registry components by shelling to \\`${CLI_BIN} add --yes\\`. --yes leaves an existing component in place; pass overwrite to replace it. Pro names require PLY_LICENSE_KEY (or licenseKey). Project must already have ply-ui.json.`,\n inputSchema: addComponentsInput,\n annotations: writeAnnotations,\n },\n async (args) => addComponents(args)\n );\n\n server.registerTool(\n 'init_project',\n {\n title: 'Initialize Ply in a project',\n description:\n `Run \\`${CLI_BIN} init --yes\\` in the target directory. Writes ply-ui.json, ply-ui.css, and icon sprites only when those files are missing, discovers the stylesheet already listed in angular.json, and inserts @source when it is absent. Always non-interactive.`,\n inputSchema: initProjectInput,\n annotations: writeAnnotations,\n },\n async (args) => initProject(args)\n );\n\n server.registerTool(\n 'doctor',\n {\n title: 'Verify Ply project setup',\n description:\n `Run \\`${CLI_BIN} doctor\\` (read-only). Returns isError when the CLI exits non-zero.`,\n inputSchema: doctorInput,\n annotations: readOnlyAnnotations,\n },\n async (args) => doctor(args)\n );\n\n server.registerTool(\n 'diff_components',\n {\n title: 'Diff installed Ply components',\n description:\n `Run \\`${CLI_BIN} diff\\` against tracked components. Read-only. Omit names to check everything in ply-ui-lock.json.`,\n inputSchema: diffComponentsInput,\n annotations: readOnlyAnnotations,\n },\n async (args) => diffComponents(args)\n );\n\n server.registerTool(\n 'update_components',\n {\n title: 'Update installed Ply components',\n description:\n `Run \\`${CLI_BIN} update --yes\\`. Untouched files take upstream. Conflicts stay local and the CLI exits non-zero unless force or merge. Local-only edits skip unless overwriteLocal.`,\n inputSchema: updateComponentsInput,\n annotations: writeAnnotations,\n },\n async (args) => updateComponents(args)\n );\n }\n\n return server;\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { createMcpServer, PACKAGE_VERSION } from './server';\nimport { MCP_PACKAGE } from './brand';\nimport { mcpProtectedResource, wwwAuthenticate } from './auth-metadata';\n\nexport interface HttpOptions {\n host: string;\n port: number;\n readOnly: boolean;\n authToken?: string;\n}\n\nfunction setCors(res: ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');\n res.setHeader(\n 'Access-Control-Allow-Headers',\n 'Content-Type, Authorization, Mcp-Session-Id, MCP-Protocol-Version'\n );\n}\n\nfunction unauthorized(res: ServerResponse, resourceMetadataUrl: string): void {\n setCors(res);\n res.writeHead(401, {\n 'Content-Type': 'application/json',\n 'WWW-Authenticate': wwwAuthenticate(resourceMetadataUrl),\n });\n res.end(JSON.stringify({ error: 'Unauthorized' }));\n}\n\nfunction checkAuth(req: IncomingMessage, token?: string): boolean {\n if (!token) return true;\n const header = req.headers.authorization;\n return header === `Bearer ${token}`;\n}\n\nasync function readBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const raw = Buffer.concat(chunks).toString('utf8').trim();\n if (!raw) return undefined;\n return JSON.parse(raw);\n}\n\n/**\n * Streamable HTTP MCP. ChatGPT / Gemini chat apps need a public HTTPS URL\n * pointing at `/mcp`. Mutating tools only work when this process can see\n * the consumer project (local `--http`, not a remote catalog host).\n */\nexport function startHttpServer(options: HttpOptions): ReturnType<typeof createServer> {\n const server = createServer(async (req, res) => {\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n\n if (req.method === 'OPTIONS') {\n setCors(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (url.pathname === '/' && req.method === 'GET') {\n setCors(res);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n ok: true,\n name: MCP_PACKAGE,\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n mcp: '/mcp',\n mutating: !options.readOnly,\n })\n );\n return;\n }\n\n if (url.pathname === '/.well-known/oauth-protected-resource' && req.method === 'GET') {\n setCors(res);\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(\n JSON.stringify(\n mcpProtectedResource(new URL('/mcp', url.origin).href, Boolean(options.authToken))\n )\n );\n return;\n }\n\n if (url.pathname !== '/mcp') {\n setCors(res);\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not found. MCP is POST/GET /mcp.' }));\n return;\n }\n\n if (!checkAuth(req, options.authToken)) {\n unauthorized(res, new URL('/.well-known/oauth-protected-resource', url.origin).href);\n return;\n }\n\n setCors(res);\n const mcp = createMcpServer({ mutating: !options.readOnly });\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await mcp.connect(transport);\n const parsedBody = req.method === 'POST' ? await readBody(req) : undefined;\n await transport.handleRequest(req, res, parsedBody);\n } catch (err) {\n console.error(`${MCP_PACKAGE} HTTP error:`, err);\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n if (!res.writableEnded) {\n res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));\n }\n }\n });\n\n server.listen(options.port, options.host, () => {\n const addr = server.address();\n const port = typeof addr === 'object' && addr ? addr.port : options.port;\n console.error(\n `${MCP_PACKAGE} v${PACKAGE_VERSION} Streamable HTTP on http://${options.host}:${port}/mcp` +\n (options.readOnly ? ' (read-only catalog)' : '')\n );\n });\n return server;\n}\n","/** Canonical auth.md skill. Registration is not offered; see the file. */\nexport const AUTH_MD_URL = 'https://ply-ui.com/auth.md';\n\nexport interface ProtectedResourceMetadata {\n resource: string;\n resource_name: string;\n resource_documentation: string;\n resource_logo_uri: string;\n authorization_servers: string[];\n scopes_supported: string[];\n bearer_methods_supported: string[];\n}\n\n/** RFC 9728 metadata for one MCP origin. An empty authorization_servers list means registration is off. */\nexport function mcpProtectedResource(resource: string, bearer: boolean): ProtectedResourceMetadata {\n return {\n resource,\n resource_name: 'Ply MCP',\n resource_documentation: AUTH_MD_URL,\n resource_logo_uri: 'https://ply-ui.com/assets/pwa/apple-touch-icon.png',\n authorization_servers: [],\n scopes_supported: [],\n bearer_methods_supported: bearer ? ['header'] : [],\n };\n}\n\nexport function wwwAuthenticate(resourceMetadataUrl: string): string {\n return `Bearer resource_metadata=\"${resourceMetadataUrl}\"`;\n}\n"],"mappings":"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","names":["import_mcp","import_zod","import_zod","import_zod","CATEGORIES","import_zod","fs","path","import_zod","import_zod","import_zod","import_zod"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ply-ui-mcp",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "description": "Ply MCP server — stdio or Streamable HTTP (--http). List, search, init, doctor, diff, update, and add Angular + Tailwind components (Pro with PLY_LICENSE_KEY). Not MUI Base UI.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/node": "^26.5.1",
57
- "tsup": "^8.5.1",
57
+ "tsup": "^9.0.0",
58
58
  "typescript": "^7.0.2",
59
59
  "vitest": "^5.0.0"
60
60
  },