@lando-labs/lando-ds-mcp 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/CHANGELOG.md +526 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +170 -0
  5. package/build/data/ds-meta.json +1 -0
  6. package/build/data/ds-meta.schema.json +282 -0
  7. package/build/data/ds-meta.verbose.json +1 -0
  8. package/build/data/icon-metadata.d.ts +64 -0
  9. package/build/data/icon-metadata.d.ts.map +1 -0
  10. package/build/data/icon-metadata.js +1128 -0
  11. package/build/data/icon-metadata.js.map +1 -0
  12. package/build/data/lucide-icon-names.d.ts +12 -0
  13. package/build/data/lucide-icon-names.d.ts.map +1 -0
  14. package/build/data/lucide-icon-names.js +1653 -0
  15. package/build/data/lucide-icon-names.js.map +1 -0
  16. package/build/data/lucide-icons.d.ts +41 -0
  17. package/build/data/lucide-icons.d.ts.map +1 -0
  18. package/build/data/lucide-icons.js +80 -0
  19. package/build/data/lucide-icons.js.map +1 -0
  20. package/build/data/rn-tokens-snapshot.d.ts +753 -0
  21. package/build/data/rn-tokens-snapshot.d.ts.map +1 -0
  22. package/build/data/rn-tokens-snapshot.js +286 -0
  23. package/build/data/rn-tokens-snapshot.js.map +1 -0
  24. package/build/index.d.ts +18 -0
  25. package/build/index.d.ts.map +1 -0
  26. package/build/index.js +411 -0
  27. package/build/index.js.map +1 -0
  28. package/build/prompts/index.d.ts +16 -0
  29. package/build/prompts/index.d.ts.map +1 -0
  30. package/build/prompts/index.js +145 -0
  31. package/build/prompts/index.js.map +1 -0
  32. package/build/resources/code-examples.d.ts +6 -0
  33. package/build/resources/code-examples.d.ts.map +1 -0
  34. package/build/resources/code-examples.js +278 -0
  35. package/build/resources/code-examples.js.map +1 -0
  36. package/build/resources/design-tokens.d.ts +6 -0
  37. package/build/resources/design-tokens.d.ts.map +1 -0
  38. package/build/resources/design-tokens.js +128 -0
  39. package/build/resources/design-tokens.js.map +1 -0
  40. package/build/resources/index.d.ts +19 -0
  41. package/build/resources/index.d.ts.map +1 -0
  42. package/build/resources/index.js +80 -0
  43. package/build/resources/index.js.map +1 -0
  44. package/build/test.d.ts +12 -0
  45. package/build/test.d.ts.map +1 -0
  46. package/build/test.js +680 -0
  47. package/build/test.js.map +1 -0
  48. package/build/tools/compose-components.d.ts +40 -0
  49. package/build/tools/compose-components.d.ts.map +1 -0
  50. package/build/tools/compose-components.js +61 -0
  51. package/build/tools/compose-components.js.map +1 -0
  52. package/build/tools/get-animation-examples.d.ts +30 -0
  53. package/build/tools/get-animation-examples.d.ts.map +1 -0
  54. package/build/tools/get-animation-examples.js +484 -0
  55. package/build/tools/get-animation-examples.js.map +1 -0
  56. package/build/tools/get-component-capabilities.d.ts +43 -0
  57. package/build/tools/get-component-capabilities.d.ts.map +1 -0
  58. package/build/tools/get-component-capabilities.js +108 -0
  59. package/build/tools/get-component-capabilities.js.map +1 -0
  60. package/build/tools/get-component-props.d.ts +23 -0
  61. package/build/tools/get-component-props.d.ts.map +1 -0
  62. package/build/tools/get-component-props.js +46 -0
  63. package/build/tools/get-component-props.js.map +1 -0
  64. package/build/tools/get-component-reference.d.ts +25 -0
  65. package/build/tools/get-component-reference.d.ts.map +1 -0
  66. package/build/tools/get-component-reference.js +112 -0
  67. package/build/tools/get-component-reference.js.map +1 -0
  68. package/build/tools/get-component.d.ts +25 -0
  69. package/build/tools/get-component.d.ts.map +1 -0
  70. package/build/tools/get-component.js +60 -0
  71. package/build/tools/get-component.js.map +1 -0
  72. package/build/tools/get-composition-hints.d.ts +22 -0
  73. package/build/tools/get-composition-hints.d.ts.map +1 -0
  74. package/build/tools/get-composition-hints.js +39 -0
  75. package/build/tools/get-composition-hints.js.map +1 -0
  76. package/build/tools/get-design-tokens.d.ts +24 -0
  77. package/build/tools/get-design-tokens.d.ts.map +1 -0
  78. package/build/tools/get-design-tokens.js +96 -0
  79. package/build/tools/get-design-tokens.js.map +1 -0
  80. package/build/tools/get-ds-metadata.d.ts +16 -0
  81. package/build/tools/get-ds-metadata.d.ts.map +1 -0
  82. package/build/tools/get-ds-metadata.js +65 -0
  83. package/build/tools/get-ds-metadata.js.map +1 -0
  84. package/build/tools/get-hook.d.ts +19 -0
  85. package/build/tools/get-hook.d.ts.map +1 -0
  86. package/build/tools/get-hook.js +46 -0
  87. package/build/tools/get-hook.js.map +1 -0
  88. package/build/tools/get-theme-presets.d.ts +13 -0
  89. package/build/tools/get-theme-presets.d.ts.map +1 -0
  90. package/build/tools/get-theme-presets.js +41 -0
  91. package/build/tools/get-theme-presets.js.map +1 -0
  92. package/build/tools/list-components.d.ts +29 -0
  93. package/build/tools/list-components.d.ts.map +1 -0
  94. package/build/tools/list-components.js +88 -0
  95. package/build/tools/list-components.js.map +1 -0
  96. package/build/tools/list-hooks.d.ts +22 -0
  97. package/build/tools/list-hooks.d.ts.map +1 -0
  98. package/build/tools/list-hooks.js +80 -0
  99. package/build/tools/list-hooks.js.map +1 -0
  100. package/build/tools/list-icons.d.ts +28 -0
  101. package/build/tools/list-icons.d.ts.map +1 -0
  102. package/build/tools/list-icons.js +161 -0
  103. package/build/tools/list-icons.js.map +1 -0
  104. package/build/tools/platform-transform.d.ts +64 -0
  105. package/build/tools/platform-transform.d.ts.map +1 -0
  106. package/build/tools/platform-transform.js +117 -0
  107. package/build/tools/platform-transform.js.map +1 -0
  108. package/build/tools/platform.d.ts +76 -0
  109. package/build/tools/platform.d.ts.map +1 -0
  110. package/build/tools/platform.js +80 -0
  111. package/build/tools/platform.js.map +1 -0
  112. package/build/tools/search-icons.d.ts +28 -0
  113. package/build/tools/search-icons.d.ts.map +1 -0
  114. package/build/tools/search-icons.js +257 -0
  115. package/build/tools/search-icons.js.map +1 -0
  116. package/build/utils/error-envelope.d.ts +14 -0
  117. package/build/utils/error-envelope.d.ts.map +1 -0
  118. package/build/utils/error-envelope.js +35 -0
  119. package/build/utils/error-envelope.js.map +1 -0
  120. package/build/utils/icon-library.d.ts +17 -0
  121. package/build/utils/icon-library.d.ts.map +1 -0
  122. package/build/utils/icon-library.js +24 -0
  123. package/build/utils/icon-library.js.map +1 -0
  124. package/build/utils/jsx-safety.d.ts +47 -0
  125. package/build/utils/jsx-safety.d.ts.map +1 -0
  126. package/build/utils/jsx-safety.js +63 -0
  127. package/build/utils/jsx-safety.js.map +1 -0
  128. package/build/utils/meta-loader.d.ts +37 -0
  129. package/build/utils/meta-loader.d.ts.map +1 -0
  130. package/build/utils/meta-loader.js +114 -0
  131. package/build/utils/meta-loader.js.map +1 -0
  132. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-envelope.js","sourceRoot":"","sources":["../../src/utils/error-envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAExE,IAAI,UAAU,GAAG,CAAC,CAAA;AAElB,sCAAsC;AACtC,MAAM,UAAU,gBAAgB;IAC9B,UAAU,GAAG,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,WAAW;IAClB,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,SAAoD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAErF,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,sBAAsB,OAAO,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,MAAM,CAAC,kBAAkB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACtC,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAA;AAC3E,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Icon library — surface info for the Lucide catalog.
3
+ *
4
+ * v4.0.0: RN support removed with the rest of the platform code; this
5
+ * module now returns a single fixed shape referencing `lucide-react` for
6
+ * the web. If the DS ever ships an RN sibling package again, add a
7
+ * variant here.
8
+ */
9
+ export interface IconLibraryInfo {
10
+ libraryName: 'lucide-react';
11
+ /** Approximate icon count published by Lucide (canonical, deduped) */
12
+ totalIcons: number;
13
+ browseUrl: string;
14
+ importPattern: string;
15
+ }
16
+ export declare function resolveLibraryInfo(): IconLibraryInfo;
17
+ //# sourceMappingURL=icon-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-library.d.ts","sourceRoot":"","sources":["../../src/utils/icon-library.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,cAAc,CAAA;IAC3B,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAUD,wBAAgB,kBAAkB,IAAI,eAAe,CAOpD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Icon library — surface info for the Lucide catalog.
3
+ *
4
+ * v4.0.0: RN support removed with the rest of the platform code; this
5
+ * module now returns a single fixed shape referencing `lucide-react` for
6
+ * the web. If the DS ever ships an RN sibling package again, add a
7
+ * variant here.
8
+ */
9
+ /**
10
+ * Verified against `lucide-react@0.548.0`: ~1,640 PascalCase icon exports.
11
+ * Rounded to 1,500 for agent-facing copy so we don't have to cut a new MCP
12
+ * release every time Lucide adds a handful of new glyphs.
13
+ */
14
+ const TOTAL_ICONS = 1500;
15
+ const LUCIDE_BROWSE_URL = 'https://lucide.dev/icons';
16
+ export function resolveLibraryInfo() {
17
+ return {
18
+ libraryName: 'lucide-react',
19
+ totalIcons: TOTAL_ICONS,
20
+ browseUrl: LUCIDE_BROWSE_URL,
21
+ importPattern: "import { IconName } from 'lucide-react'",
22
+ };
23
+ }
24
+ //# sourceMappingURL=icon-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-library.js","sourceRoot":"","sources":["../../src/utils/icon-library.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;;;GAIG;AACH,MAAM,WAAW,GAAG,IAAI,CAAA;AACxB,MAAM,iBAAiB,GAAG,0BAA0B,CAAA;AAEpD,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,iBAAiB;QAC5B,aAAa,EAAE,yCAAyC;KACzD,CAAA;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * JSX prop safety helpers.
3
+ *
4
+ * Tool output is JSX SOURCE CODE consumed by downstream agents — it is
5
+ * never rendered by this server. That means a string prop value containing
6
+ * `"`, `<`, `>`, `{`, `}`, or `\` can break out of the attribute and inject
7
+ * arbitrary JSX into the consumer's tree. Smuggled `}` also previously
8
+ * broke the regex-based import-merge in compose-components (closes #19).
9
+ *
10
+ * Policy: reject, don't escape. Rejecting gives the AI caller an
11
+ * actionable error; escaping silently transforms intent.
12
+ */
13
+ import { z } from 'zod';
14
+ /**
15
+ * Throw an InvalidParams McpError if a string prop value contains any
16
+ * character that would break out of a JSX attribute.
17
+ */
18
+ export declare function assertSafeJsxAttrString(value: string, propName: string): void;
19
+ /**
20
+ * Throw an InvalidParams McpError if a prop name isn't a plausible JSX
21
+ * attribute identifier. Permissive enough for camelCase, kebab-case,
22
+ * data-*, and aria-*; strict enough to reject whitespace and JSX syntax.
23
+ */
24
+ export declare function assertSafeJsxPropKey(key: string): void;
25
+ /**
26
+ * Recursive schema for prop values: scalars only at the leaves, with
27
+ * nested objects/arrays of scalars allowed (so {style: {color: 'red'}}
28
+ * still works). Excludes functions, symbols, null, undefined, BigInt.
29
+ */
30
+ export type PropValue = string | number | boolean | {
31
+ [key: string]: PropValue;
32
+ } | PropValue[];
33
+ export declare const propValueSchema: z.ZodType<PropValue>;
34
+ /**
35
+ * Record schema for the `props` argument on get_component and
36
+ * compose_components. Replaces `z.record(z.any())`.
37
+ */
38
+ export declare const propsRecordSchema: z.ZodRecord<z.ZodString, z.ZodType<PropValue, z.ZodTypeDef, PropValue>>;
39
+ /**
40
+ * Reflect a user-supplied string back into markdown output safely.
41
+ * Strips/replaces characters that would let the value escape its
42
+ * surrounding context (backticks, angle brackets, template-literal
43
+ * markers, control chars). Truncates to keep echoes bounded even if
44
+ * the upstream Zod cap is removed.
45
+ */
46
+ export declare function escapeForMarkdownEcho(value: string): string;
47
+ //# sourceMappingURL=jsx-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-safety.d.ts","sourceRoot":"","sources":["../../src/utils/jsx-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ7E;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOtD;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5B,SAAS,EAAE,CAAA;AAQf,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAEhD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,yEAA4B,CAAA;AAE1D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * JSX prop safety helpers.
3
+ *
4
+ * Tool output is JSX SOURCE CODE consumed by downstream agents — it is
5
+ * never rendered by this server. That means a string prop value containing
6
+ * `"`, `<`, `>`, `{`, `}`, or `\` can break out of the attribute and inject
7
+ * arbitrary JSX into the consumer's tree. Smuggled `}` also previously
8
+ * broke the regex-based import-merge in compose-components (closes #19).
9
+ *
10
+ * Policy: reject, don't escape. Rejecting gives the AI caller an
11
+ * actionable error; escaping silently transforms intent.
12
+ */
13
+ import { z } from 'zod';
14
+ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
15
+ const DISALLOWED_JSX_ATTR_CHARS = /[<>"{}\\]/;
16
+ /**
17
+ * Throw an InvalidParams McpError if a string prop value contains any
18
+ * character that would break out of a JSX attribute.
19
+ */
20
+ export function assertSafeJsxAttrString(value, propName) {
21
+ if (DISALLOWED_JSX_ATTR_CHARS.test(value)) {
22
+ throw new McpError(ErrorCode.InvalidParams, `Prop "${propName}" contains a JSX-unsafe character (one of: < > " { } \\). ` +
23
+ `Pass complex content via "children" or compose the JSX yourself.`);
24
+ }
25
+ }
26
+ const JSX_PROP_KEY = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
27
+ /**
28
+ * Throw an InvalidParams McpError if a prop name isn't a plausible JSX
29
+ * attribute identifier. Permissive enough for camelCase, kebab-case,
30
+ * data-*, and aria-*; strict enough to reject whitespace and JSX syntax.
31
+ */
32
+ export function assertSafeJsxPropKey(key) {
33
+ if (!JSX_PROP_KEY.test(key)) {
34
+ throw new McpError(ErrorCode.InvalidParams, `Prop name "${key}" is not a valid JSX attribute identifier.`);
35
+ }
36
+ }
37
+ const propPrimitiveSchema = z.union([
38
+ z.string().max(8_000),
39
+ z.boolean(),
40
+ z.number(),
41
+ ]);
42
+ export const propValueSchema = z.lazy(() => z.union([propPrimitiveSchema, z.record(propValueSchema), z.array(propValueSchema)]));
43
+ /**
44
+ * Record schema for the `props` argument on get_component and
45
+ * compose_components. Replaces `z.record(z.any())`.
46
+ */
47
+ export const propsRecordSchema = z.record(propValueSchema);
48
+ /**
49
+ * Reflect a user-supplied string back into markdown output safely.
50
+ * Strips/replaces characters that would let the value escape its
51
+ * surrounding context (backticks, angle brackets, template-literal
52
+ * markers, control chars). Truncates to keep echoes bounded even if
53
+ * the upstream Zod cap is removed.
54
+ */
55
+ export function escapeForMarkdownEcho(value) {
56
+ return value
57
+ .slice(0, 200)
58
+ .replace(/[\r\n\t]+/g, ' ')
59
+ // eslint-disable-next-line no-control-regex
60
+ .replace(/[\x00-\x1f\x7f]/g, '')
61
+ .replace(/[`<>]/g, '?');
62
+ }
63
+ //# sourceMappingURL=jsx-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-safety.js","sourceRoot":"","sources":["../../src/utils/jsx-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAExE,MAAM,yBAAyB,GAAG,WAAW,CAAA;AAE7C;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,QAAgB;IACrE,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,SAAS,QAAQ,4DAA4D;YAC3E,kEAAkE,CACrE,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,2BAA2B,CAAA;AAEhD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,cAAc,GAAG,4CAA4C,CAC9D,CAAA;IACH,CAAC;AACH,CAAC;AAcD,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC;IAClC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACrB,CAAC,CAAC,OAAO,EAAE;IACX,CAAC,CAAC,MAAM,EAAE;CACX,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAyB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC/D,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CACpF,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK;SACT,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;QAC3B,4CAA4C;SAC3C,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * DS meta loader — runtime-dep-backed since v4.0.0.
3
+ *
4
+ * Reads the DS meta from the `@lando-labs/lando-ds-meta` npm package
5
+ * (default export is `meta.json`, `/verbose` for the verbose bundle).
6
+ * Types come from the same package. Replaces the v3.x build-time copy
7
+ * workflow (`scripts/copy-ds-meta.ts` + baked `src/data/ds-meta.*.json`).
8
+ *
9
+ * Compat: MCP supports schema version ^1.0. Bumps within 1.x are additive;
10
+ * 2.x would be a breaking change and requires an MCP major bump too.
11
+ */
12
+ import type { LightMeta, VerboseMeta, LightComponentMeta, VerboseComponentMeta, HookMeta, IconRegistryEntry, MetaSchemaVersion } from '@lando-labs/lando-ds-meta/types';
13
+ export type { LightMeta, VerboseMeta, LightComponentMeta, VerboseComponentMeta, HookMeta, IconRegistryEntry, MetaSchemaVersion, };
14
+ export declare class MetaCompatError extends Error {
15
+ constructor(message: string);
16
+ }
17
+ /**
18
+ * The light meta — always available. Prefer this for anything that doesn't
19
+ * need descriptions, examples, composes, or appliesClassNames.
20
+ */
21
+ export declare function getLightMeta(): LightMeta;
22
+ /**
23
+ * The verbose meta. Use when the tool needs descriptions, examples,
24
+ * composes, or appliesClassNames.
25
+ */
26
+ export declare function getVerboseMeta(): VerboseMeta;
27
+ export declare function getComponentNames(): string[];
28
+ export declare function getComponent(name: string): LightComponentMeta | undefined;
29
+ export declare function getVerboseComponent(name: string): VerboseComponentMeta | undefined;
30
+ export declare function getDsPackageName(): string;
31
+ export declare function getDsVersion(): string;
32
+ export declare function getSchemaVersion(): MetaSchemaVersion;
33
+ export declare function getHookNames(): string[];
34
+ export declare function getHook(name: string): HookMeta | undefined;
35
+ export declare function likelySpreadsHtmlAttrs(cmp: LightComponentMeta): boolean;
36
+ export declare function renderHtmlAttrsFooter(cmp: LightComponentMeta): string;
37
+ //# sourceMappingURL=meta-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-loader.d.ts","sourceRoot":"","sources":["../../src/utils/meta-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,iCAAiC,CAAA;AAexC,YAAY,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,GAClB,CAAA;AAUD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AA2BD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAMD,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAElF;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE1D;AASD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAIvE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAcrE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * DS meta loader — runtime-dep-backed since v4.0.0.
3
+ *
4
+ * Reads the DS meta from the `@lando-labs/lando-ds-meta` npm package
5
+ * (default export is `meta.json`, `/verbose` for the verbose bundle).
6
+ * Types come from the same package. Replaces the v3.x build-time copy
7
+ * workflow (`scripts/copy-ds-meta.ts` + baked `src/data/ds-meta.*.json`).
8
+ *
9
+ * Compat: MCP supports schema version ^1.0. Bumps within 1.x are additive;
10
+ * 2.x would be a breaking change and requires an MCP major bump too.
11
+ */
12
+ import { createRequire } from 'module';
13
+ // The meta subpackage's `exports` map serves JSON at `.` and `./verbose`.
14
+ // TypeScript's static `import ... with { type: 'json' }` friction here is
15
+ // that the package's types.d.ts describes the JSON *shape* but doesn't
16
+ // declare a `default` export. Using `createRequire` bypasses the typing
17
+ // mismatch and reads the JSON directly (the package explicitly declares
18
+ // `"type": "module"` on its own, but `createRequire` works fine in ESM
19
+ // consumers for the "give me the JSON blob" case).
20
+ const requireJson = createRequire(import.meta.url);
21
+ const meta = requireJson('@lando-labs/lando-ds-meta');
22
+ const verboseMetaRaw = requireJson('@lando-labs/lando-ds-meta/verbose');
23
+ const lightMeta = meta;
24
+ // ---------------------------------------------------------------------------
25
+ // Compat
26
+ // ---------------------------------------------------------------------------
27
+ const SUPPORTED_SCHEMA_MAJOR = 1;
28
+ export class MetaCompatError extends Error {
29
+ constructor(message) {
30
+ super(message);
31
+ this.name = 'MetaCompatError';
32
+ }
33
+ }
34
+ function assertCompatibleSchema(schemaVersion, source) {
35
+ if (typeof schemaVersion !== 'string') {
36
+ throw new MetaCompatError(`Meta from "${source}" is missing $schemaVersion. Cannot verify compatibility.`);
37
+ }
38
+ const match = /^(\d+)\.(\d+)$/.exec(schemaVersion);
39
+ if (!match) {
40
+ throw new MetaCompatError(`Meta from "${source}" has malformed $schemaVersion "${schemaVersion}" (expected MAJOR.MINOR).`);
41
+ }
42
+ const major = Number(match[1]);
43
+ if (major !== SUPPORTED_SCHEMA_MAJOR) {
44
+ throw new MetaCompatError(`Meta from "${source}" declares schema v${schemaVersion}; MCP supports v${SUPPORTED_SCHEMA_MAJOR}.x only. Bump the MCP major to support a newer schema.`);
45
+ }
46
+ }
47
+ assertCompatibleSchema(lightMeta.$schemaVersion, '@lando-labs/lando-ds-meta');
48
+ const verboseMeta = verboseMetaRaw;
49
+ assertCompatibleSchema(verboseMeta.$schemaVersion, '@lando-labs/lando-ds-meta/verbose');
50
+ /**
51
+ * The light meta — always available. Prefer this for anything that doesn't
52
+ * need descriptions, examples, composes, or appliesClassNames.
53
+ */
54
+ export function getLightMeta() {
55
+ return lightMeta;
56
+ }
57
+ /**
58
+ * The verbose meta. Use when the tool needs descriptions, examples,
59
+ * composes, or appliesClassNames.
60
+ */
61
+ export function getVerboseMeta() {
62
+ return verboseMeta;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Convenience accessors used across tools.
66
+ // ---------------------------------------------------------------------------
67
+ export function getComponentNames() {
68
+ return Object.keys(lightMeta.components).sort();
69
+ }
70
+ export function getComponent(name) {
71
+ return lightMeta.components[name];
72
+ }
73
+ export function getVerboseComponent(name) {
74
+ return verboseMeta.components[name];
75
+ }
76
+ export function getDsPackageName() {
77
+ return lightMeta.package.name;
78
+ }
79
+ export function getDsVersion() {
80
+ return lightMeta.package.version;
81
+ }
82
+ export function getSchemaVersion() {
83
+ return lightMeta.$schemaVersion;
84
+ }
85
+ export function getHookNames() {
86
+ return lightMeta.hooks ? Object.keys(lightMeta.hooks).sort() : [];
87
+ }
88
+ export function getHook(name) {
89
+ return lightMeta.hooks?.[name];
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // HTML-attrs pass-through helpers — MCP-specific rendering logic, not part
93
+ // of the DS meta shape. Kept as-is from v3.x.
94
+ // ---------------------------------------------------------------------------
95
+ const HTML_ATTRS_FOOTER_OWN_PROPS_THRESHOLD = 3;
96
+ export function likelySpreadsHtmlAttrs(cmp) {
97
+ const ownPropsCount = Object.keys(cmp.props).length;
98
+ if (ownPropsCount >= HTML_ATTRS_FOOTER_OWN_PROPS_THRESHOLD)
99
+ return false;
100
+ return cmp.polymorphic || cmp.ref !== null;
101
+ }
102
+ export function renderHtmlAttrsFooter(cmp) {
103
+ if (cmp.extends && cmp.extends.length > 0) {
104
+ const chain = cmp.extends.map((t) => `\`${t}\``).join(', ');
105
+ return (`\n> _Also accepts everything in: ${chain}. ` +
106
+ `(Standard React/HTML attributes like className, id, aria-\\*, and event handlers propagate through.)_\n`);
107
+ }
108
+ if (!likelySpreadsHtmlAttrs(cmp))
109
+ return '';
110
+ const refPart = cmp.ref ? ` (forwards to \`${cmp.ref}\`)` : '';
111
+ return (`\n> _Note: this component may accept additional standard React/HTML attributes${refPart} ` +
112
+ `(className, id, aria-\\*, event handlers) not enumerated here. See the component source in the DS for the full extends chain._\n`);
113
+ }
114
+ //# sourceMappingURL=meta-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-loader.js","sourceRoot":"","sources":["../../src/utils/meta-loader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@lando-labs/lando-ds-mcp",
3
+ "version": "4.0.0",
4
+ "description": "MCP server for the Lando Labs Design System — thin protocol adapter over @lando-labs/lando-ds-meta. Exposes 127 components, DS utility hooks, OKLCH-aware design tokens, DS-brand + Lucide-curated icons, capability introspection, and JSX-safe code generation to AI agents. 15 tools; auto-current with every DS release via the meta schema-version compat boundary.",
5
+ "type": "module",
6
+ "main": "./build/index.js",
7
+ "bin": {
8
+ "lando-ds-mcp": "./build/index.js"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public",
12
+ "provenance": true,
13
+ "registry": "https://registry.npmjs.org/"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/lando-labs/lando-ds-mcp.git"
18
+ },
19
+ "homepage": "https://github.com/lando-labs/lando-ds-mcp#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/lando-labs/lando-ds-mcp/issues"
22
+ },
23
+ "files": [
24
+ "build/",
25
+ "README.md",
26
+ "LICENSE",
27
+ "NOTICE",
28
+ "CHANGELOG.md"
29
+ ],
30
+ "scripts": {
31
+ "generate:lucide-icons": "npx tsx scripts/generate-lucide-icon-index.ts",
32
+ "build": "tsc && chmod +x build/index.js",
33
+ "dev": "tsc --watch",
34
+ "test": "node build/test.js",
35
+ "typecheck": "tsc --noEmit"
36
+ },
37
+ "keywords": [
38
+ "mcp",
39
+ "model-context-protocol",
40
+ "design-system",
41
+ "lando-labs",
42
+ "ai",
43
+ "claude"
44
+ ],
45
+ "author": "Lando Labs",
46
+ "license": "Apache-2.0",
47
+ "dependencies": {
48
+ "@lando-labs/lando-ds-meta": "^0.57.0",
49
+ "@modelcontextprotocol/sdk": "^1.25.4",
50
+ "zod": "^3.23.8"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^22.10.2",
54
+ "tsx": "^4.20.6",
55
+ "typescript": "^5.7.2"
56
+ },
57
+ "engines": {
58
+ "node": ">=18.0.0"
59
+ }
60
+ }