@hareru/mcp 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,7 +43,7 @@ Add to your `claude_desktop_config.json`:
43
43
  |-----|-------------|
44
44
  | `hareru-ui://tokens` | DTCG design tokens (light/dark themes, 150+ CSS custom properties) |
45
45
  | `hareru-ui://tokens/schema` | JSON Schema for design tokens — CSS variable enums and type constraints |
46
- | `hareru-ui://components` | Component registry — 49 components with CVA variants, Props, states, a11y, and examples |
46
+ | `hareru-ui://components` | Component registry — 49 components with CVA variants, Props, states, a11y, examples, and slot contracts |
47
47
  | `hareru-ui://components/schema` | JSON Schema for the component registry |
48
48
  | `hareru-ui://bundles` | Task bundles — curated component sets for common UI patterns |
49
49
  | `hareru-ui://rules/consumer` | Consumer rules for AI agents — import patterns, styling rules, and token reference |
@@ -52,7 +52,7 @@ Add to your `claude_desktop_config.json`:
52
52
 
53
53
  | Tool | Description | Parameters |
54
54
  |------|-------------|------------|
55
- | `get-component-usage` | Get usage docs for a component — import, variants, props, JSX example, states, accessibility, and examples when available | `componentName` (string) |
55
+ | `get-component-usage` | Get usage docs for a component — import, variants, props, JSX example, states, accessibility, examples, and Structure (slot tree for compound components) when available | `componentName` (string) |
56
56
  | `get-bundle-usage` | Get usage docs for a task bundle — components, CSS imports, and token categories | `bundleName` (string) |
57
57
  | `validate-token-value` | Validate a CSS value against the token schema | `tokenType` (string), `value` (string) |
58
58
  | `recommend-css-mode` | Recommend the best CSS import mode based on project context | `hasTailwind` (boolean), `componentCount` (number), `hasExistingReset?` (boolean) |
package/dist/index.js CHANGED
@@ -17,7 +17,8 @@ import {
17
17
  loadConsumerRules,
18
18
  CSS_MODES,
19
19
  CSS_MODE_DESCRIPTIONS,
20
- recommendCssMode
20
+ recommendCssMode,
21
+ buildSlotTree
21
22
  } from "@hareru/registry";
22
23
 
23
24
  // src/prompts.ts
@@ -239,7 +240,7 @@ function registerResources(server) {
239
240
  "components",
240
241
  "hareru-ui://components",
241
242
  {
242
- description: `Component registry \u2014 ${registry.componentCount} components with CVA variants and Props interfaces`,
243
+ description: `Component registry \u2014 ${registry.componentCount} components with CVA variants, Props interfaces, and slot contracts`,
243
244
  mimeType: "application/json"
244
245
  },
245
246
  async (uri) => ({
@@ -336,6 +337,19 @@ function formatUsageMarkdown(entry) {
336
337
  parts.push(`@import '@hareru/ui/${entry.cssArtifact}';`);
337
338
  parts.push("```");
338
339
  parts.push("");
340
+ const slotTree = buildSlotTree(
341
+ entry.name,
342
+ entry.slots,
343
+ entry.name === "Table" ? ["TableRow is also valid inside TableHeader."] : void 0
344
+ );
345
+ if (slotTree) {
346
+ parts.push("## Structure");
347
+ parts.push("");
348
+ parts.push("```text");
349
+ parts.push(slotTree);
350
+ parts.push("```");
351
+ parts.push("");
352
+ }
339
353
  const variants = entry.variants ?? [];
340
354
  const props = entry.props ?? [];
341
355
  if (variants.length > 0) {
@@ -427,7 +441,7 @@ function formatUsageMarkdown(entry) {
427
441
  function registerTools(server) {
428
442
  server.tool(
429
443
  "get-component-usage",
430
- "Get usage documentation for a Hareru UI component \u2014 import, variants, props, states, accessibility, and examples",
444
+ "Get usage documentation for a Hareru UI component \u2014 import, structure, variants, props, states, accessibility, slots, and examples",
431
445
  { componentName: z2.string().describe('Component name (e.g. "Button", "Card", "Alert")') },
432
446
  async ({ componentName }) => {
433
447
  const registry = loadRegistry();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/utils.ts","../src/resources.ts","../src/tools.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\nimport { registerTools } from './tools.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as {\n version: string;\n};\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: 'hareru-ui',\n version: pkg.version,\n });\n\n registerResources(server);\n registerTools(server);\n registerPrompts(server);\n\n return server;\n}\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Hareru UI MCP server started (stdio)');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { loadConsumerRules, loadRegistry, loadSchema } from './utils.js';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'create-ui',\n 'Generate a UI component using Hareru UI design system',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A settings form with name and email fields\")',\n ),\n framework: z.string().optional().describe('Target framework: react (default)'),\n },\n async ({ description, framework }) => {\n const registry = loadRegistry();\n const schema = loadSchema();\n\n const componentList = registry.components\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${variantInfo}${desc}`;\n })\n .join('\\n');\n\n const bundles = registry.taskBundles ?? [];\n const bundleList =\n bundles.length > 0\n ? bundles\n .map((b) => `- ${b.name}: ${b.description} (${b.components.length} components)`)\n .join('\\n')\n : '';\n\n const cssVars = schema.properties.cssVariables.items.enum.slice(0, 20).join(', ');\n const fw = framework ?? 'react';\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using the Hareru UI design system (${fw}).\n\n## Available Components\n\n${componentList}\n\n## Design Token CSS Variables (sample)\n\n${cssVars}, ...\n\n## Rules\n\n1. Import components from '@hareru/ui'. For CSS setup, refer to the consumer-rules (standalone: '@hareru/ui/styles.css', portable: '@hareru/tokens/css' + '@hareru/ui/styles/components.css')\n2. Use only semantic variant props (e.g. variant=\"default\"), never hardcode CSS values\n3. Use CSS variables (--hui-*) for any custom styling\n4. All components support forwardRef\n5. Use BEM class naming (hui-*) if adding custom classes\n6. Colors use OKLCH format\n\n## Task\n\n${description}\n${bundleList ? `\\n## Available Bundles\\n\\n${bundleList}\\n` : ''}\nGenerate a complete ${fw} component that fulfills this requirement.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'create-ui-tailwind',\n 'Generate a UI component mixing Hareru UI and Tailwind CSS with Cascade Layer guidance',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A dashboard card with Tailwind layout and Hareru UI buttons\")',\n ),\n },\n async ({ description }) => {\n const registry = loadRegistry();\n\n const componentList = registry.components\n .map((c) => {\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${desc}`;\n })\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using Hareru UI + Tailwind CSS v4 together.\n\n## Cascade Layer Order\n\nDeclare this layer order at the top of your CSS entry point:\n\n\\`\\`\\`css\n@layer theme, base, hui, components, utilities;\n@import 'tailwindcss';\n@import '@hareru/tokens/css';\n@import '@hareru/ui/styles/components.layer.css';\n\\`\\`\\`\n\n- Hareru components live in \\`@layer hui\\` — below Tailwind \\`utilities\\`\n- Tailwind utility classes (e.g. \\`flex\\`, \\`gap-4\\`, \\`p-2\\`) can safely override Hareru layout\n- Never use Tailwind classes to override Hareru component internals (colors, border-radius, shadows) — use \\`--hui-*\\` CSS variables instead\n\n## Mixing Classes Example\n\n\\`\\`\\`tsx\n{/* Tailwind for layout, Hareru for components */}\n<div className=\"flex gap-4 p-6\">\n <Card className=\"flex-1\">\n <CardHeader>Title</CardHeader>\n <CardContent>\n <Button variant=\"default\">Action</Button>\n </CardContent>\n </Card>\n</div>\n\\`\\`\\`\n\n## Available Components\n\n${componentList}\n\n## Rules\n\n1. Import components from \\`@hareru/ui\\`\n2. Use Tailwind utilities for layout (flex, grid, gap, padding, margin)\n3. Use Hareru components for interactive UI elements (Button, Input, Card, Dialog)\n4. Use \\`--hui-*\\` CSS variables for theming — do not override with Tailwind color classes\n5. Use BEM class naming (\\`hui-*\\`) if adding custom component styles\n6. Colors are OKLCH format\n\n## Task\n\n${description}\n\nGenerate a complete React component that combines Tailwind layout utilities with Hareru UI components.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'consumer-rules',\n 'Get the rules for using Hareru UI in your project',\n {},\n async () => {\n const rules = loadConsumerRules();\n\n const CODE_BLOCK_SECTIONS = new Set(['cssImports']);\n\n const rulesSections = Object.entries(rules.rules)\n .map(([key, section]) => {\n const ruleList = section.rules.map((r) => `- ${r}`).join('\\n');\n const examples = Object.entries(section.examples)\n .map(([label, code]) =>\n CODE_BLOCK_SECTIONS.has(key)\n ? `**${label}:**\\n\\`\\`\\`css\\n${code}\\n\\`\\`\\``\n : ` ${label}: ${code}`,\n )\n .join('\\n');\n return `### ${key}\\n${section.description}\\n\\n${ruleList}\\n\\nExamples:\\n${examples}`;\n })\n .join('\\n\\n');\n\n const tokenRef = Object.entries(rules.tokenQuickReference)\n .map(([category, pattern]) => `- ${category}: ${pattern}`)\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Hareru UI Consumer Rules (v${rules.version})\n\nThese rules apply when using Hareru UI in any project.\n\n## Rules\n\n${rulesSections}\n\n## Token Quick Reference\n\n${tokenRef}`,\n },\n },\n ],\n };\n },\n );\n}\n","export {\n loadTokens,\n loadSchema,\n loadRegistry,\n loadComponentSchema,\n loadConsumerRules,\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n recommendCssMode,\n} from '@hareru/registry';\n\nexport type {\n TokensJSON,\n SchemaJSON,\n ComponentRegistryJSON,\n ComponentEntry,\n TaskBundle,\n ComponentGroup,\n TokenCategory,\n VariantDef,\n CustomPropDef,\n PropDef,\n StateDef,\n A11yDef,\n ExampleDef,\n ComponentSchemaJSON,\n ConsumerRulesJSON,\n CssMode,\n CssModeContext,\n} from '@hareru/registry';\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadComponentSchema,\n loadConsumerRules,\n loadRegistry,\n loadSchema,\n loadTokens,\n} from './utils.js';\n\nexport function registerResources(server: McpServer): void {\n const schema = loadSchema();\n const tokenCount = schema.properties.tokenCount.const;\n const registry = loadRegistry();\n\n server.resource(\n 'tokens',\n 'hareru-ui://tokens',\n {\n description: `DTCG design tokens (light/dark themes, ${tokenCount} CSS custom properties)`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadTokens(), null, 2) }],\n }),\n );\n\n server.resource(\n 'tokens-schema',\n 'hareru-ui://tokens/schema',\n {\n description: 'JSON Schema for design tokens — CSS variable enums and type constraints',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'components',\n 'hareru-ui://components',\n {\n description: `Component registry — ${registry.componentCount} components with CVA variants and Props interfaces`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry, null, 2) }],\n }),\n );\n\n server.resource(\n 'bundles',\n 'hareru-ui://bundles',\n {\n description: `Task bundles — ${registry.taskBundles?.length ?? 0} curated component sets for common UI patterns`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry.taskBundles ?? [], null, 2) }],\n }),\n );\n\n server.resource(\n 'components-schema',\n 'hareru-ui://components/schema',\n {\n description: 'JSON Schema for the component registry',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadComponentSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'consumer-rules',\n 'hareru-ui://rules/consumer',\n {\n description:\n 'Consumer rules for AI agents — import patterns, styling rules, and token reference',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadConsumerRules(), null, 2) }],\n }),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport {\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n loadRegistry,\n loadSchema,\n recommendCssMode,\n} from './utils.js';\nimport type { ComponentEntry } from './utils.js';\n\nfunction escPipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction formatVariantsTable(entry: ComponentEntry): string {\n const variants = entry.variants ?? [];\n if (variants.length === 0) return 'No CVA variants defined.';\n\n const lines: string[] = ['| Variant | Options | Default |', '|---------|---------|---------|'];\n for (const v of variants) {\n for (const [key, options] of Object.entries(v.variants)) {\n const defaultVal = v.defaultVariants[key] ?? '-';\n lines.push(\n `| ${escPipe(key)} | ${options.map(escPipe).join(', ')} | ${escPipe(defaultVal)} |`,\n );\n }\n }\n return lines.join('\\n');\n}\n\nfunction formatUsageMarkdown(entry: ComponentEntry): string {\n const parts: string[] = [];\n\n parts.push(`# ${entry.displayName}`);\n parts.push('');\n\n // Description (Phase 3A)\n parts.push(entry.description);\n parts.push('');\n\n // AI Guidance (Phase 3A)\n if (entry.aiHint) {\n parts.push('## AI Guidance');\n parts.push('');\n parts.push(entry.aiHint);\n parts.push('');\n }\n\n // Import section\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n const subs = entry.subcomponents ?? [];\n const allNames = [entry.name, ...subs];\n parts.push(`import { ${allNames.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section (registry-driven)\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const dep of entry.requiredCssArtifacts ?? []) {\n parts.push(`@import '@hareru/ui/${dep}';`);\n }\n parts.push(`@import '@hareru/ui/${entry.cssArtifact}';`);\n parts.push('```');\n parts.push('');\n\n const variants = entry.variants ?? [];\n const props = entry.props ?? [];\n\n if (variants.length > 0) {\n parts.push('## Variants');\n parts.push('');\n parts.push(formatVariantsTable(entry));\n parts.push('');\n }\n\n if (props.length > 0) {\n parts.push('## Props');\n parts.push('');\n for (const prop of props) {\n if (prop.extends) {\n parts.push(`- **${prop.name}** extends \\`${prop.extends}\\``);\n } else {\n parts.push(`- **${prop.name}**`);\n }\n }\n parts.push('');\n }\n\n // States (Phase 3C)\n const states = entry.states ?? [];\n if (states.length > 0) {\n parts.push('## States');\n parts.push('');\n parts.push('| State | Type | Values | Default |');\n parts.push('|-------|------|--------|---------|');\n for (const s of states) {\n const values = s.type === 'enum' ? s.values.map(escPipe).join(', ') : '-';\n const def = s.type === 'enum' && s.defaultValue ? escPipe(s.defaultValue) : '-';\n parts.push(`| ${escPipe(s.name)} | ${s.type} | ${values} | ${def} |`);\n }\n parts.push('');\n }\n\n // Accessibility (Phase 3C)\n const a11y = entry.a11y;\n if (a11y) {\n parts.push('## Accessibility');\n parts.push('');\n if (a11y.roles?.length) parts.push(`- Roles: ${a11y.roles.join(', ')}`);\n if (a11y.ariaAttributes?.length) parts.push(`- ARIA: ${a11y.ariaAttributes.join(', ')}`);\n if (a11y.semanticElements?.length)\n parts.push(`- Semantic elements: ${a11y.semanticElements.join(', ')}`);\n if (a11y.keyboardInteractions?.length)\n parts.push(`- Keyboard: ${a11y.keyboardInteractions.join('; ')}`);\n if (a11y.liveRegion) parts.push('- Live region: yes');\n if (a11y.notes) parts.push(`- Notes: ${a11y.notes}`);\n parts.push('');\n }\n\n // Also Consider (Phase 3A)\n if (entry.peerComponents) {\n parts.push('## Also Consider');\n parts.push('');\n for (const peer of entry.peerComponents) {\n parts.push(`- ${peer}`);\n }\n parts.push('');\n }\n\n // Example (Phase 3C: prefer canonical examples from manifest)\n const examples = entry.examples ?? [];\n if (examples.length > 0) {\n parts.push('## Example');\n parts.push('');\n for (const ex of examples) {\n parts.push(`### ${ex.title}`);\n parts.push('');\n parts.push('```tsx');\n parts.push(ex.code);\n parts.push('```');\n parts.push('');\n }\n } else {\n // Fallback: auto-generated example\n parts.push('## Example');\n parts.push('');\n parts.push('```tsx');\n if (variants.length > 0) {\n const firstVariant = variants[0];\n const propsStr = Object.entries(firstVariant.defaultVariants)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);\n } else if (subs.length > 0) {\n parts.push(`<${entry.name}>`);\n for (const sub of subs) {\n parts.push(` <${sub}>Content</${sub}>`);\n }\n parts.push(`</${entry.name}>`);\n } else {\n parts.push(`<${entry.name}>Content</${entry.name}>`);\n }\n parts.push('```');\n }\n\n return parts.join('\\n');\n}\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n 'get-component-usage',\n 'Get usage documentation for a Hareru UI component — import, variants, props, states, accessibility, and examples',\n { componentName: z.string().describe('Component name (e.g. \"Button\", \"Card\", \"Alert\")') },\n async ({ componentName }) => {\n const registry = loadRegistry();\n const entry = registry.components.find(\n (c) => c.name.toLowerCase() === componentName.toLowerCase(),\n );\n\n if (!entry) {\n const available = registry.components.map((c) => c.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Component \"${componentName}\" not found. Available components: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: formatUsageMarkdown(entry) }],\n };\n },\n );\n\n server.tool(\n 'get-bundle-usage',\n 'Get usage documentation for a Hareru UI task bundle — components, CSS imports, and token categories',\n { bundleName: z.string().describe('Bundle name (e.g. \"agent-chat-shell\", \"form-basics\")') },\n async ({ bundleName }) => {\n const registry = loadRegistry();\n const bundles = registry.taskBundles ?? [];\n const bundle = bundles.find((b) => b.name.toLowerCase() === bundleName.toLowerCase());\n\n if (!bundle) {\n const available = bundles.map((b) => b.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Bundle \"${bundleName}\" not found. Available bundles: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n const componentMap = new Map(registry.components.map((c) => [c.name, c]));\n\n const parts: string[] = [];\n parts.push(`# Bundle: ${bundle.name}`);\n parts.push('');\n parts.push(bundle.description);\n parts.push('');\n\n // Import section — expand subcomponents so the import is copy-pasteable\n const allImports: string[] = [];\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n allImports.push(compName);\n if (comp?.subcomponents) {\n allImports.push(...comp.subcomponents);\n }\n }\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n parts.push(`import { ${allImports.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const artifact of bundle.cssArtifacts) {\n parts.push(`@import '@hareru/ui/${artifact}';`);\n }\n parts.push('```');\n parts.push('');\n\n // Token categories\n parts.push('## Token Categories');\n parts.push('');\n parts.push(bundle.tokenCategories.join(', '));\n parts.push('');\n\n // Components detail\n parts.push('## Components');\n parts.push('');\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n if (comp) {\n parts.push(`- **${comp.name}** — ${comp.description}`);\n } else {\n parts.push(`- **${compName}**`);\n }\n }\n parts.push('');\n\n return {\n content: [{ type: 'text' as const, text: parts.join('\\n') }],\n };\n },\n );\n\n server.tool(\n 'validate-token-value',\n 'Validate a CSS token value against the Hareru UI design token schema',\n {\n tokenType: z\n .string()\n .describe(\n 'Token type: color, dimension, fontFamily, fontWeight, duration, number, shadow, typography, cubicBezier',\n ),\n value: z.string().describe('The value to validate (e.g. \"oklch(0.5 0.2 250)\")'),\n },\n async ({ tokenType, value }) => {\n const schema = loadSchema();\n const constraint =\n schema.properties.typeConstraints.properties[\n tokenType as keyof typeof schema.properties.typeConstraints.properties\n ];\n\n if (!constraint) {\n const availableTypes = Object.keys(schema.properties.typeConstraints.properties).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Unknown token type \"${tokenType}\". Available types: ${availableTypes}`,\n },\n ],\n isError: true,\n };\n }\n\n if (!constraint.pattern) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — token type \"${tokenType}\" has no pattern constraint (any ${constraint.type ?? 'string'} value accepted).`,\n },\n ],\n };\n }\n\n let regex: RegExp;\n try {\n regex = new RegExp(constraint.pattern);\n } catch {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error — invalid pattern for token type \"${tokenType}\": ${constraint.pattern}`,\n },\n ],\n isError: true,\n };\n }\n\n const isValid = regex.test(value);\n\n if (isValid) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — \"${value}\" matches the ${tokenType} pattern: ${constraint.pattern}`,\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Invalid — \"${value}\" does not match the ${tokenType} pattern.\\nExpected: ${constraint.pattern}\\nDescription: ${constraint.description ?? tokenType}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'recommend-css-mode',\n 'Recommend the best CSS import mode for a Hareru UI project based on project context',\n {\n hasTailwind: z.boolean().describe('Whether Tailwind CSS is detected in the project'),\n componentCount: z\n .number()\n .int()\n .min(0)\n .describe('Number of Hareru components used in the project'),\n hasExistingReset: z\n .boolean()\n .optional()\n .describe(\n 'Whether the project already has a CSS reset or framework (e.g. Bootstrap, Pico CSS)',\n ),\n },\n async ({ hasTailwind, componentCount, hasExistingReset }) => {\n const result = recommendCssMode({ hasTailwind, componentCount, hasExistingReset });\n\n const allModes = CSS_MODES.map((m) => {\n const marker = m === result.mode ? ' ← recommended' : '';\n return `- **${m}**: ${CSS_MODE_DESCRIPTIONS[m]}${marker}`;\n }).join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## Recommended CSS Mode: \\`${result.mode}\\`\\n\\n${result.reason}\\n\\n## All Modes\\n\\n${allModes}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'list-components-by-group',\n 'List Hareru UI components filtered by group',\n {\n group: z\n .enum([\n 'core',\n 'form',\n 'layout',\n 'overlay',\n 'navigation',\n 'feedback',\n 'data-display',\n 'agent',\n 'di-domain',\n ])\n .describe('Component group to filter by'),\n },\n async ({ group }) => {\n const registry = loadRegistry();\n const filtered = registry.components.filter((c) => c.group === group);\n\n if (filtered.length === 0) {\n const groups = [...new Set(registry.components.map((c) => c.group))].sort();\n return {\n content: [\n {\n type: 'text' as const,\n text: `No components in group \"${group}\". Available groups: ${groups.join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines = filtered\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n return `- **${c.name}**${variantInfo} — ${c.description}`;\n })\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## ${group} (${filtered.length} components)\\n\\n${lines}`,\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/utils.ts","../src/resources.ts","../src/tools.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\nimport { registerTools } from './tools.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as {\n version: string;\n};\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: 'hareru-ui',\n version: pkg.version,\n });\n\n registerResources(server);\n registerTools(server);\n registerPrompts(server);\n\n return server;\n}\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Hareru UI MCP server started (stdio)');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { loadConsumerRules, loadRegistry, loadSchema } from './utils.js';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'create-ui',\n 'Generate a UI component using Hareru UI design system',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A settings form with name and email fields\")',\n ),\n framework: z.string().optional().describe('Target framework: react (default)'),\n },\n async ({ description, framework }) => {\n const registry = loadRegistry();\n const schema = loadSchema();\n\n const componentList = registry.components\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${variantInfo}${desc}`;\n })\n .join('\\n');\n\n const bundles = registry.taskBundles ?? [];\n const bundleList =\n bundles.length > 0\n ? bundles\n .map((b) => `- ${b.name}: ${b.description} (${b.components.length} components)`)\n .join('\\n')\n : '';\n\n const cssVars = schema.properties.cssVariables.items.enum.slice(0, 20).join(', ');\n const fw = framework ?? 'react';\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using the Hareru UI design system (${fw}).\n\n## Available Components\n\n${componentList}\n\n## Design Token CSS Variables (sample)\n\n${cssVars}, ...\n\n## Rules\n\n1. Import components from '@hareru/ui'. For CSS setup, refer to the consumer-rules (standalone: '@hareru/ui/styles.css', portable: '@hareru/tokens/css' + '@hareru/ui/styles/components.css')\n2. Use only semantic variant props (e.g. variant=\"default\"), never hardcode CSS values\n3. Use CSS variables (--hui-*) for any custom styling\n4. All components support forwardRef\n5. Use BEM class naming (hui-*) if adding custom classes\n6. Colors use OKLCH format\n\n## Task\n\n${description}\n${bundleList ? `\\n## Available Bundles\\n\\n${bundleList}\\n` : ''}\nGenerate a complete ${fw} component that fulfills this requirement.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'create-ui-tailwind',\n 'Generate a UI component mixing Hareru UI and Tailwind CSS with Cascade Layer guidance',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A dashboard card with Tailwind layout and Hareru UI buttons\")',\n ),\n },\n async ({ description }) => {\n const registry = loadRegistry();\n\n const componentList = registry.components\n .map((c) => {\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${desc}`;\n })\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using Hareru UI + Tailwind CSS v4 together.\n\n## Cascade Layer Order\n\nDeclare this layer order at the top of your CSS entry point:\n\n\\`\\`\\`css\n@layer theme, base, hui, components, utilities;\n@import 'tailwindcss';\n@import '@hareru/tokens/css';\n@import '@hareru/ui/styles/components.layer.css';\n\\`\\`\\`\n\n- Hareru components live in \\`@layer hui\\` — below Tailwind \\`utilities\\`\n- Tailwind utility classes (e.g. \\`flex\\`, \\`gap-4\\`, \\`p-2\\`) can safely override Hareru layout\n- Never use Tailwind classes to override Hareru component internals (colors, border-radius, shadows) — use \\`--hui-*\\` CSS variables instead\n\n## Mixing Classes Example\n\n\\`\\`\\`tsx\n{/* Tailwind for layout, Hareru for components */}\n<div className=\"flex gap-4 p-6\">\n <Card className=\"flex-1\">\n <CardHeader>Title</CardHeader>\n <CardContent>\n <Button variant=\"default\">Action</Button>\n </CardContent>\n </Card>\n</div>\n\\`\\`\\`\n\n## Available Components\n\n${componentList}\n\n## Rules\n\n1. Import components from \\`@hareru/ui\\`\n2. Use Tailwind utilities for layout (flex, grid, gap, padding, margin)\n3. Use Hareru components for interactive UI elements (Button, Input, Card, Dialog)\n4. Use \\`--hui-*\\` CSS variables for theming — do not override with Tailwind color classes\n5. Use BEM class naming (\\`hui-*\\`) if adding custom component styles\n6. Colors are OKLCH format\n\n## Task\n\n${description}\n\nGenerate a complete React component that combines Tailwind layout utilities with Hareru UI components.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'consumer-rules',\n 'Get the rules for using Hareru UI in your project',\n {},\n async () => {\n const rules = loadConsumerRules();\n\n const CODE_BLOCK_SECTIONS = new Set(['cssImports']);\n\n const rulesSections = Object.entries(rules.rules)\n .map(([key, section]) => {\n const ruleList = section.rules.map((r) => `- ${r}`).join('\\n');\n const examples = Object.entries(section.examples)\n .map(([label, code]) =>\n CODE_BLOCK_SECTIONS.has(key)\n ? `**${label}:**\\n\\`\\`\\`css\\n${code}\\n\\`\\`\\``\n : ` ${label}: ${code}`,\n )\n .join('\\n');\n return `### ${key}\\n${section.description}\\n\\n${ruleList}\\n\\nExamples:\\n${examples}`;\n })\n .join('\\n\\n');\n\n const tokenRef = Object.entries(rules.tokenQuickReference)\n .map(([category, pattern]) => `- ${category}: ${pattern}`)\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Hareru UI Consumer Rules (v${rules.version})\n\nThese rules apply when using Hareru UI in any project.\n\n## Rules\n\n${rulesSections}\n\n## Token Quick Reference\n\n${tokenRef}`,\n },\n },\n ],\n };\n },\n );\n}\n","export {\n loadTokens,\n loadSchema,\n loadRegistry,\n loadComponentSchema,\n loadConsumerRules,\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n recommendCssMode,\n buildSlotTree,\n} from '@hareru/registry';\n\nexport type {\n TokensJSON,\n SchemaJSON,\n ComponentRegistryJSON,\n ComponentEntry,\n TaskBundle,\n ComponentGroup,\n TokenCategory,\n VariantDef,\n CustomPropDef,\n PropDef,\n StateDef,\n A11yDef,\n SlotDef,\n SlotRole,\n ExampleDef,\n ComponentSchemaJSON,\n ConsumerRulesJSON,\n CssMode,\n CssModeContext,\n} from '@hareru/registry';\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadComponentSchema,\n loadConsumerRules,\n loadRegistry,\n loadSchema,\n loadTokens,\n} from './utils.js';\n\nexport function registerResources(server: McpServer): void {\n const schema = loadSchema();\n const tokenCount = schema.properties.tokenCount.const;\n const registry = loadRegistry();\n\n server.resource(\n 'tokens',\n 'hareru-ui://tokens',\n {\n description: `DTCG design tokens (light/dark themes, ${tokenCount} CSS custom properties)`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadTokens(), null, 2) }],\n }),\n );\n\n server.resource(\n 'tokens-schema',\n 'hareru-ui://tokens/schema',\n {\n description: 'JSON Schema for design tokens — CSS variable enums and type constraints',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'components',\n 'hareru-ui://components',\n {\n description: `Component registry — ${registry.componentCount} components with CVA variants, Props interfaces, and slot contracts`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry, null, 2) }],\n }),\n );\n\n server.resource(\n 'bundles',\n 'hareru-ui://bundles',\n {\n description: `Task bundles — ${registry.taskBundles?.length ?? 0} curated component sets for common UI patterns`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry.taskBundles ?? [], null, 2) }],\n }),\n );\n\n server.resource(\n 'components-schema',\n 'hareru-ui://components/schema',\n {\n description: 'JSON Schema for the component registry',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadComponentSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'consumer-rules',\n 'hareru-ui://rules/consumer',\n {\n description:\n 'Consumer rules for AI agents — import patterns, styling rules, and token reference',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadConsumerRules(), null, 2) }],\n }),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport {\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n buildSlotTree,\n loadRegistry,\n loadSchema,\n recommendCssMode,\n} from './utils.js';\nimport type { ComponentEntry } from './utils.js';\n\nfunction escPipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction formatVariantsTable(entry: ComponentEntry): string {\n const variants = entry.variants ?? [];\n if (variants.length === 0) return 'No CVA variants defined.';\n\n const lines: string[] = ['| Variant | Options | Default |', '|---------|---------|---------|'];\n for (const v of variants) {\n for (const [key, options] of Object.entries(v.variants)) {\n const defaultVal = v.defaultVariants[key] ?? '-';\n lines.push(\n `| ${escPipe(key)} | ${options.map(escPipe).join(', ')} | ${escPipe(defaultVal)} |`,\n );\n }\n }\n return lines.join('\\n');\n}\n\nfunction formatUsageMarkdown(entry: ComponentEntry): string {\n const parts: string[] = [];\n\n parts.push(`# ${entry.displayName}`);\n parts.push('');\n\n // Description (Phase 3A)\n parts.push(entry.description);\n parts.push('');\n\n // AI Guidance (Phase 3A)\n if (entry.aiHint) {\n parts.push('## AI Guidance');\n parts.push('');\n parts.push(entry.aiHint);\n parts.push('');\n }\n\n // Import section\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n const subs = entry.subcomponents ?? [];\n const allNames = [entry.name, ...subs];\n parts.push(`import { ${allNames.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section (registry-driven)\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const dep of entry.requiredCssArtifacts ?? []) {\n parts.push(`@import '@hareru/ui/${dep}';`);\n }\n parts.push(`@import '@hareru/ui/${entry.cssArtifact}';`);\n parts.push('```');\n parts.push('');\n\n // Structure (Phase 3D) — placed after CSS, before Variants in markdown doc format\n const slotTree = buildSlotTree(\n entry.name,\n entry.slots,\n entry.name === 'Table' ? ['TableRow is also valid inside TableHeader.'] : undefined,\n );\n if (slotTree) {\n parts.push('## Structure');\n parts.push('');\n parts.push('```text');\n parts.push(slotTree);\n parts.push('```');\n parts.push('');\n }\n\n const variants = entry.variants ?? [];\n const props = entry.props ?? [];\n\n if (variants.length > 0) {\n parts.push('## Variants');\n parts.push('');\n parts.push(formatVariantsTable(entry));\n parts.push('');\n }\n\n if (props.length > 0) {\n parts.push('## Props');\n parts.push('');\n for (const prop of props) {\n if (prop.extends) {\n parts.push(`- **${prop.name}** extends \\`${prop.extends}\\``);\n } else {\n parts.push(`- **${prop.name}**`);\n }\n }\n parts.push('');\n }\n\n // States (Phase 3C)\n const states = entry.states ?? [];\n if (states.length > 0) {\n parts.push('## States');\n parts.push('');\n parts.push('| State | Type | Values | Default |');\n parts.push('|-------|------|--------|---------|');\n for (const s of states) {\n const values = s.type === 'enum' ? s.values.map(escPipe).join(', ') : '-';\n const def = s.type === 'enum' && s.defaultValue ? escPipe(s.defaultValue) : '-';\n parts.push(`| ${escPipe(s.name)} | ${s.type} | ${values} | ${def} |`);\n }\n parts.push('');\n }\n\n // Accessibility (Phase 3C)\n const a11y = entry.a11y;\n if (a11y) {\n parts.push('## Accessibility');\n parts.push('');\n if (a11y.roles?.length) parts.push(`- Roles: ${a11y.roles.join(', ')}`);\n if (a11y.ariaAttributes?.length) parts.push(`- ARIA: ${a11y.ariaAttributes.join(', ')}`);\n if (a11y.semanticElements?.length)\n parts.push(`- Semantic elements: ${a11y.semanticElements.join(', ')}`);\n if (a11y.keyboardInteractions?.length)\n parts.push(`- Keyboard: ${a11y.keyboardInteractions.join('; ')}`);\n if (a11y.liveRegion) parts.push('- Live region: yes');\n if (a11y.notes) parts.push(`- Notes: ${a11y.notes}`);\n parts.push('');\n }\n\n // Also Consider (Phase 3A)\n if (entry.peerComponents) {\n parts.push('## Also Consider');\n parts.push('');\n for (const peer of entry.peerComponents) {\n parts.push(`- ${peer}`);\n }\n parts.push('');\n }\n\n // Example (Phase 3C: prefer canonical examples from manifest)\n const examples = entry.examples ?? [];\n if (examples.length > 0) {\n parts.push('## Example');\n parts.push('');\n for (const ex of examples) {\n parts.push(`### ${ex.title}`);\n parts.push('');\n parts.push('```tsx');\n parts.push(ex.code);\n parts.push('```');\n parts.push('');\n }\n } else {\n // Fallback: auto-generated example\n parts.push('## Example');\n parts.push('');\n parts.push('```tsx');\n if (variants.length > 0) {\n const firstVariant = variants[0];\n const propsStr = Object.entries(firstVariant.defaultVariants)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);\n } else if (subs.length > 0) {\n parts.push(`<${entry.name}>`);\n for (const sub of subs) {\n parts.push(` <${sub}>Content</${sub}>`);\n }\n parts.push(`</${entry.name}>`);\n } else {\n parts.push(`<${entry.name}>Content</${entry.name}>`);\n }\n parts.push('```');\n }\n\n return parts.join('\\n');\n}\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n 'get-component-usage',\n 'Get usage documentation for a Hareru UI component — import, structure, variants, props, states, accessibility, slots, and examples',\n { componentName: z.string().describe('Component name (e.g. \"Button\", \"Card\", \"Alert\")') },\n async ({ componentName }) => {\n const registry = loadRegistry();\n const entry = registry.components.find(\n (c) => c.name.toLowerCase() === componentName.toLowerCase(),\n );\n\n if (!entry) {\n const available = registry.components.map((c) => c.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Component \"${componentName}\" not found. Available components: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: formatUsageMarkdown(entry) }],\n };\n },\n );\n\n server.tool(\n 'get-bundle-usage',\n 'Get usage documentation for a Hareru UI task bundle — components, CSS imports, and token categories',\n { bundleName: z.string().describe('Bundle name (e.g. \"agent-chat-shell\", \"form-basics\")') },\n async ({ bundleName }) => {\n const registry = loadRegistry();\n const bundles = registry.taskBundles ?? [];\n const bundle = bundles.find((b) => b.name.toLowerCase() === bundleName.toLowerCase());\n\n if (!bundle) {\n const available = bundles.map((b) => b.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Bundle \"${bundleName}\" not found. Available bundles: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n const componentMap = new Map(registry.components.map((c) => [c.name, c]));\n\n const parts: string[] = [];\n parts.push(`# Bundle: ${bundle.name}`);\n parts.push('');\n parts.push(bundle.description);\n parts.push('');\n\n // Import section — expand subcomponents so the import is copy-pasteable\n const allImports: string[] = [];\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n allImports.push(compName);\n if (comp?.subcomponents) {\n allImports.push(...comp.subcomponents);\n }\n }\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n parts.push(`import { ${allImports.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const artifact of bundle.cssArtifacts) {\n parts.push(`@import '@hareru/ui/${artifact}';`);\n }\n parts.push('```');\n parts.push('');\n\n // Token categories\n parts.push('## Token Categories');\n parts.push('');\n parts.push(bundle.tokenCategories.join(', '));\n parts.push('');\n\n // Components detail\n parts.push('## Components');\n parts.push('');\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n if (comp) {\n parts.push(`- **${comp.name}** — ${comp.description}`);\n } else {\n parts.push(`- **${compName}**`);\n }\n }\n parts.push('');\n\n return {\n content: [{ type: 'text' as const, text: parts.join('\\n') }],\n };\n },\n );\n\n server.tool(\n 'validate-token-value',\n 'Validate a CSS token value against the Hareru UI design token schema',\n {\n tokenType: z\n .string()\n .describe(\n 'Token type: color, dimension, fontFamily, fontWeight, duration, number, shadow, typography, cubicBezier',\n ),\n value: z.string().describe('The value to validate (e.g. \"oklch(0.5 0.2 250)\")'),\n },\n async ({ tokenType, value }) => {\n const schema = loadSchema();\n const constraint =\n schema.properties.typeConstraints.properties[\n tokenType as keyof typeof schema.properties.typeConstraints.properties\n ];\n\n if (!constraint) {\n const availableTypes = Object.keys(schema.properties.typeConstraints.properties).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Unknown token type \"${tokenType}\". Available types: ${availableTypes}`,\n },\n ],\n isError: true,\n };\n }\n\n if (!constraint.pattern) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — token type \"${tokenType}\" has no pattern constraint (any ${constraint.type ?? 'string'} value accepted).`,\n },\n ],\n };\n }\n\n let regex: RegExp;\n try {\n regex = new RegExp(constraint.pattern);\n } catch {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error — invalid pattern for token type \"${tokenType}\": ${constraint.pattern}`,\n },\n ],\n isError: true,\n };\n }\n\n const isValid = regex.test(value);\n\n if (isValid) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — \"${value}\" matches the ${tokenType} pattern: ${constraint.pattern}`,\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Invalid — \"${value}\" does not match the ${tokenType} pattern.\\nExpected: ${constraint.pattern}\\nDescription: ${constraint.description ?? tokenType}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'recommend-css-mode',\n 'Recommend the best CSS import mode for a Hareru UI project based on project context',\n {\n hasTailwind: z.boolean().describe('Whether Tailwind CSS is detected in the project'),\n componentCount: z\n .number()\n .int()\n .min(0)\n .describe('Number of Hareru components used in the project'),\n hasExistingReset: z\n .boolean()\n .optional()\n .describe(\n 'Whether the project already has a CSS reset or framework (e.g. Bootstrap, Pico CSS)',\n ),\n },\n async ({ hasTailwind, componentCount, hasExistingReset }) => {\n const result = recommendCssMode({ hasTailwind, componentCount, hasExistingReset });\n\n const allModes = CSS_MODES.map((m) => {\n const marker = m === result.mode ? ' ← recommended' : '';\n return `- **${m}**: ${CSS_MODE_DESCRIPTIONS[m]}${marker}`;\n }).join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## Recommended CSS Mode: \\`${result.mode}\\`\\n\\n${result.reason}\\n\\n## All Modes\\n\\n${allModes}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'list-components-by-group',\n 'List Hareru UI components filtered by group',\n {\n group: z\n .enum([\n 'core',\n 'form',\n 'layout',\n 'overlay',\n 'navigation',\n 'feedback',\n 'data-display',\n 'agent',\n 'di-domain',\n ])\n .describe('Component group to filter by'),\n },\n async ({ group }) => {\n const registry = loadRegistry();\n const filtered = registry.components.filter((c) => c.group === group);\n\n if (filtered.length === 0) {\n const groups = [...new Set(registry.components.map((c) => c.group))].sort();\n return {\n content: [\n {\n type: 'text' as const,\n text: `No components in group \"${group}\". Available groups: ${groups.join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines = filtered\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n return `- **${c.name}**${variantInfo} — ${c.description}`;\n })\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## ${group} (${filtered.length} components)\\n\\n${lines}`,\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hareru/mcp",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server for Hareru UI design system — exposes tokens, schema, and component registry to AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,7 +39,7 @@
39
39
  "dependencies": {
40
40
  "@modelcontextprotocol/sdk": "^1.12.0",
41
41
  "zod": "^3.23.0",
42
- "@hareru/registry": "0.3.0"
42
+ "@hareru/registry": "0.4.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.0.0",