@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.
- package/CHANGELOG.md +526 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +170 -0
- package/build/data/ds-meta.json +1 -0
- package/build/data/ds-meta.schema.json +282 -0
- package/build/data/ds-meta.verbose.json +1 -0
- package/build/data/icon-metadata.d.ts +64 -0
- package/build/data/icon-metadata.d.ts.map +1 -0
- package/build/data/icon-metadata.js +1128 -0
- package/build/data/icon-metadata.js.map +1 -0
- package/build/data/lucide-icon-names.d.ts +12 -0
- package/build/data/lucide-icon-names.d.ts.map +1 -0
- package/build/data/lucide-icon-names.js +1653 -0
- package/build/data/lucide-icon-names.js.map +1 -0
- package/build/data/lucide-icons.d.ts +41 -0
- package/build/data/lucide-icons.d.ts.map +1 -0
- package/build/data/lucide-icons.js +80 -0
- package/build/data/lucide-icons.js.map +1 -0
- package/build/data/rn-tokens-snapshot.d.ts +753 -0
- package/build/data/rn-tokens-snapshot.d.ts.map +1 -0
- package/build/data/rn-tokens-snapshot.js +286 -0
- package/build/data/rn-tokens-snapshot.js.map +1 -0
- package/build/index.d.ts +18 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +411 -0
- package/build/index.js.map +1 -0
- package/build/prompts/index.d.ts +16 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +145 -0
- package/build/prompts/index.js.map +1 -0
- package/build/resources/code-examples.d.ts +6 -0
- package/build/resources/code-examples.d.ts.map +1 -0
- package/build/resources/code-examples.js +278 -0
- package/build/resources/code-examples.js.map +1 -0
- package/build/resources/design-tokens.d.ts +6 -0
- package/build/resources/design-tokens.d.ts.map +1 -0
- package/build/resources/design-tokens.js +128 -0
- package/build/resources/design-tokens.js.map +1 -0
- package/build/resources/index.d.ts +19 -0
- package/build/resources/index.d.ts.map +1 -0
- package/build/resources/index.js +80 -0
- package/build/resources/index.js.map +1 -0
- package/build/test.d.ts +12 -0
- package/build/test.d.ts.map +1 -0
- package/build/test.js +680 -0
- package/build/test.js.map +1 -0
- package/build/tools/compose-components.d.ts +40 -0
- package/build/tools/compose-components.d.ts.map +1 -0
- package/build/tools/compose-components.js +61 -0
- package/build/tools/compose-components.js.map +1 -0
- package/build/tools/get-animation-examples.d.ts +30 -0
- package/build/tools/get-animation-examples.d.ts.map +1 -0
- package/build/tools/get-animation-examples.js +484 -0
- package/build/tools/get-animation-examples.js.map +1 -0
- package/build/tools/get-component-capabilities.d.ts +43 -0
- package/build/tools/get-component-capabilities.d.ts.map +1 -0
- package/build/tools/get-component-capabilities.js +108 -0
- package/build/tools/get-component-capabilities.js.map +1 -0
- package/build/tools/get-component-props.d.ts +23 -0
- package/build/tools/get-component-props.d.ts.map +1 -0
- package/build/tools/get-component-props.js +46 -0
- package/build/tools/get-component-props.js.map +1 -0
- package/build/tools/get-component-reference.d.ts +25 -0
- package/build/tools/get-component-reference.d.ts.map +1 -0
- package/build/tools/get-component-reference.js +112 -0
- package/build/tools/get-component-reference.js.map +1 -0
- package/build/tools/get-component.d.ts +25 -0
- package/build/tools/get-component.d.ts.map +1 -0
- package/build/tools/get-component.js +60 -0
- package/build/tools/get-component.js.map +1 -0
- package/build/tools/get-composition-hints.d.ts +22 -0
- package/build/tools/get-composition-hints.d.ts.map +1 -0
- package/build/tools/get-composition-hints.js +39 -0
- package/build/tools/get-composition-hints.js.map +1 -0
- package/build/tools/get-design-tokens.d.ts +24 -0
- package/build/tools/get-design-tokens.d.ts.map +1 -0
- package/build/tools/get-design-tokens.js +96 -0
- package/build/tools/get-design-tokens.js.map +1 -0
- package/build/tools/get-ds-metadata.d.ts +16 -0
- package/build/tools/get-ds-metadata.d.ts.map +1 -0
- package/build/tools/get-ds-metadata.js +65 -0
- package/build/tools/get-ds-metadata.js.map +1 -0
- package/build/tools/get-hook.d.ts +19 -0
- package/build/tools/get-hook.d.ts.map +1 -0
- package/build/tools/get-hook.js +46 -0
- package/build/tools/get-hook.js.map +1 -0
- package/build/tools/get-theme-presets.d.ts +13 -0
- package/build/tools/get-theme-presets.d.ts.map +1 -0
- package/build/tools/get-theme-presets.js +41 -0
- package/build/tools/get-theme-presets.js.map +1 -0
- package/build/tools/list-components.d.ts +29 -0
- package/build/tools/list-components.d.ts.map +1 -0
- package/build/tools/list-components.js +88 -0
- package/build/tools/list-components.js.map +1 -0
- package/build/tools/list-hooks.d.ts +22 -0
- package/build/tools/list-hooks.d.ts.map +1 -0
- package/build/tools/list-hooks.js +80 -0
- package/build/tools/list-hooks.js.map +1 -0
- package/build/tools/list-icons.d.ts +28 -0
- package/build/tools/list-icons.d.ts.map +1 -0
- package/build/tools/list-icons.js +161 -0
- package/build/tools/list-icons.js.map +1 -0
- package/build/tools/platform-transform.d.ts +64 -0
- package/build/tools/platform-transform.d.ts.map +1 -0
- package/build/tools/platform-transform.js +117 -0
- package/build/tools/platform-transform.js.map +1 -0
- package/build/tools/platform.d.ts +76 -0
- package/build/tools/platform.d.ts.map +1 -0
- package/build/tools/platform.js +80 -0
- package/build/tools/platform.js.map +1 -0
- package/build/tools/search-icons.d.ts +28 -0
- package/build/tools/search-icons.d.ts.map +1 -0
- package/build/tools/search-icons.js +257 -0
- package/build/tools/search-icons.js.map +1 -0
- package/build/utils/error-envelope.d.ts +14 -0
- package/build/utils/error-envelope.d.ts.map +1 -0
- package/build/utils/error-envelope.js +35 -0
- package/build/utils/error-envelope.js.map +1 -0
- package/build/utils/icon-library.d.ts +17 -0
- package/build/utils/icon-library.d.ts.map +1 -0
- package/build/utils/icon-library.js +24 -0
- package/build/utils/icon-library.js.map +1 -0
- package/build/utils/jsx-safety.d.ts +47 -0
- package/build/utils/jsx-safety.d.ts.map +1 -0
- package/build/utils/jsx-safety.js +63 -0
- package/build/utils/jsx-safety.js.map +1 -0
- package/build/utils/meta-loader.d.ts +37 -0
- package/build/utils/meta-loader.d.ts.map +1 -0
- package/build/utils/meta-loader.js +114 -0
- package/build/utils/meta-loader.js.map +1 -0
- 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
|
+
}
|