@ncds/ui-admin-mcp 1.6.4-alpha.5 → 1.6.4-alpha.7

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 (53) hide show
  1. package/README.md +5 -0
  2. package/bin/server.js +19 -11
  3. package/bin/tools/listIcons.d.ts +4 -1
  4. package/bin/tools/listIcons.js +8 -2
  5. package/bin/tools/ping.js +1 -1
  6. package/bin/tools/renderToHtml.d.ts +7 -0
  7. package/bin/tools/renderToHtml.js +83 -0
  8. package/bin/types.d.ts +2 -0
  9. package/bin/utils/dataLoader.d.ts +2 -10
  10. package/data/badge-group.json +2 -0
  11. package/data/badge.json +2 -0
  12. package/data/bread-crumb.json +2 -0
  13. package/data/breadcrumb.json +2 -0
  14. package/data/button-group.json +2 -0
  15. package/data/button.json +2 -0
  16. package/data/carousel-arrow.json +2 -0
  17. package/data/carousel-number-group.json +2 -0
  18. package/data/carousel.json +2 -0
  19. package/data/checkbox.json +2 -0
  20. package/data/combobox.json +2 -0
  21. package/data/date-picker.json +2 -0
  22. package/data/divider.json +2 -0
  23. package/data/dot.json +2 -0
  24. package/data/dropdown.json +2 -0
  25. package/data/empty-state.json +2 -0
  26. package/data/featured-icon.json +2 -0
  27. package/data/file-input.json +2 -0
  28. package/data/horizontal-tab.json +2 -0
  29. package/data/image-file-input.json +2 -0
  30. package/data/input.json +2 -0
  31. package/data/modal.json +2 -0
  32. package/data/notification.json +2 -0
  33. package/data/number-input.json +2 -0
  34. package/data/pagination.json +2 -0
  35. package/data/password-input.json +2 -0
  36. package/data/progress-bar.json +2 -0
  37. package/data/progress-circle.json +2 -0
  38. package/data/radio.json +2 -0
  39. package/data/range-date-picker-with-buttons.json +2 -0
  40. package/data/range-date-picker.json +2 -0
  41. package/data/select-dropdown.json +2 -0
  42. package/data/select.json +2 -0
  43. package/data/selectbox.json +2 -0
  44. package/data/slider.json +2 -0
  45. package/data/spinner.json +2 -0
  46. package/data/switch.json +2 -0
  47. package/data/tab.json +2 -0
  48. package/data/tag.json +2 -0
  49. package/data/textarea.json +2 -0
  50. package/data/toggle.json +2 -0
  51. package/data/tooltip.json +2 -0
  52. package/data/vertical-tab.json +2 -0
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -79,6 +79,8 @@ Claude에게 자연어로 물어보면 됩니다:
79
79
  "어드민 컴포넌트 목록 보여줘"
80
80
  "버튼 컴포넌트 어떤 속성 사용할 수 있어?"
81
81
  "input 컴포넌트 HTML 마크업 보여줘"
82
+ "화살표 관련 아이콘 검색해줘"
83
+ "버튼 컴포넌트를 label은 저장, primary로 렌더링해줘"
82
84
  "이 HTML에 사용된 클래스가 맞는지 검증해줘"
83
85
  ```
84
86
 
@@ -90,9 +92,12 @@ Claude에게 자연어로 물어보면 됩니다:
90
92
  | --------------------- | -------------------------------------------------------------- |
91
93
  | 📋 컴포넌트 목록 조회 | 사용 가능한 전체 UI 컴포넌트를 확인합니다 |
92
94
  | 🔍 컴포넌트 검색 | 키워드로 원하는 컴포넌트를 찾습니다 |
95
+ | 🎨 아이콘 목록 조회 | 사용 가능한 아이콘 요약 정보를 확인합니다 |
96
+ | 🔍 아이콘 검색 | 키워드로 원하는 아이콘을 찾습니다 |
93
97
  | 🧩 HTML 마크업 조회 | 컴포넌트의 정확한 HTML 구조와 React 사용 예시를 확인합니다 |
94
98
  | ⚙️ 속성(Props) 조회 | 컴포넌트에 사용할 수 있는 옵션과 기본값을 확인합니다 |
95
99
  | ✅ HTML 검증 | 작성한 HTML의 클래스명이 올바른지 검증하고 자동으로 수정합니다 |
100
+ | 🔄 동적 HTML 렌더링 | props를 전달하면 실제 렌더링된 정확한 HTML을 받을 수 있습니다 |
96
101
  | 📡 서버 상태 확인 | 연결 상태, 버전, 사용 규칙을 확인합니다 |
97
102
 
98
103
  <br />
package/bin/server.js CHANGED
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  /**
4
7
  * MCP 서버 진입점 — componentMap 소유, tool 등록, transport 연결
5
8
  */
9
+ const path_1 = __importDefault(require("path"));
6
10
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
7
11
  const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
8
12
  const zod_1 = require("zod");
@@ -10,12 +14,12 @@ const dataLoader_js_1 = require("./utils/dataLoader.js");
10
14
  const logger_js_1 = require("./utils/logger.js");
11
15
  const listComponents_js_1 = require("./tools/listComponents.js");
12
16
  const searchComponent_js_1 = require("./tools/searchComponent.js");
13
- const getComponentHtml_js_1 = require("./tools/getComponentHtml.js");
14
17
  const getComponentProps_js_1 = require("./tools/getComponentProps.js");
15
18
  const validateHtml_js_1 = require("./tools/validateHtml.js");
16
19
  const ping_js_1 = require("./tools/ping.js");
17
20
  const listIcons_js_1 = require("./tools/listIcons.js");
18
21
  const searchIcon_js_1 = require("./tools/searchIcon.js");
22
+ const renderToHtml_js_1 = require("./tools/renderToHtml.js");
19
23
  const version_js_1 = require("./version.js");
20
24
  const server = new mcp_js_1.McpServer({
21
25
  name: 'ncds-ui-admin',
@@ -26,6 +30,10 @@ const main = async () => {
26
30
  const componentMap = (0, dataLoader_js_1.loadComponentsFromDir)(dataLoader_js_1.DEFAULT_DATA_DIR);
27
31
  const cdnMeta = (0, dataLoader_js_1.loadCdnMeta)(dataLoader_js_1.DEFAULT_DATA_DIR);
28
32
  const iconData = (0, dataLoader_js_1.loadIconData)(dataLoader_js_1.DEFAULT_DATA_DIR);
33
+ const bundlePath = path_1.default.resolve(__dirname, '..', 'bin', 'components.bundle.js');
34
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
35
+ const bundle = require(bundlePath);
36
+ logger_js_1.logger.info(`컴포넌트 번들 로딩 완료`);
29
37
  server.registerTool('ping', {
30
38
  description: 'NCUA MCP 서버 연결 확인 + 버전 + capabilities/rules 조회',
31
39
  }, () => (0, ping_js_1.ping)(componentMap, cdnMeta, version_js_1.VERSION));
@@ -43,16 +51,6 @@ const main = async () => {
43
51
  description: '이름이나 설명으로 UI 컴포넌트를 찾습니다.',
44
52
  inputSchema: { query: zod_1.z.string().describe('검색 키워드 (대소문자 무관)') },
45
53
  }, ({ query }) => (0, searchComponent_js_1.searchComponent)(componentMap, query));
46
- server.registerTool('get_component_html', {
47
- description: '컴포넌트의 HTML 마크업 예시를 가져옵니다. variant를 지정하면 해당 옵션이 적용된 HTML을 반환합니다.',
48
- inputSchema: {
49
- name: zod_1.z.string().min(1).describe('컴포넌트명 (예: "button", "badge")'),
50
- variant: zod_1.z
51
- .record(zod_1.z.string(), zod_1.z.string())
52
- .optional()
53
- .describe('옵션 조합 (예: { hierarchy: "primary", size: "md" })'),
54
- },
55
- }, ({ name, variant }) => (0, getComponentHtml_js_1.getComponentHtml)(componentMap, name, variant));
56
54
  server.registerTool('get_component_props', {
57
55
  description: '컴포넌트에서 사용할 수 있는 옵션(속성) 목록을 가져옵니다.',
58
56
  inputSchema: { name: zod_1.z.string().min(1).describe('컴포넌트명 (예: "button", "badge")') },
@@ -66,6 +64,16 @@ const main = async () => {
66
64
  .describe('검증할 HTML 마크업 (예: \'<button class="ncua-btn ncua-btn--primary"></button>\')'),
67
65
  },
68
66
  }, ({ html }) => (0, validateHtml_js_1.validateHtml)(componentMap, html));
67
+ server.registerTool('render_to_html', {
68
+ description: '컴포넌트명과 속성을 전달하면 정확한 HTML을 반환합니다.',
69
+ inputSchema: {
70
+ name: zod_1.z.string().min(1).describe('컴포넌트명 (예: "button", "modal", "input")'),
71
+ props: zod_1.z
72
+ .record(zod_1.z.string(), zod_1.z.unknown())
73
+ .optional()
74
+ .describe('컴포넌트 props (예: { label: "확인", hierarchy: "primary" })'),
75
+ },
76
+ }, ({ name, props }) => (0, renderToHtml_js_1.renderToHtml)(componentMap, bundle, cdnMeta, name, props));
69
77
  const transport = new stdio_js_1.StdioServerTransport();
70
78
  await server.connect(transport);
71
79
  logger_js_1.logger.info(`NCUA MCP 서버 시작됨 (ncds-ui-admin v${version_js_1.VERSION})`);
@@ -1,5 +1,8 @@
1
1
  /**
2
- * list_icons tool — 전체 아이콘 목록 반환 (순수 함수)
2
+ * list_icons tool — 아이콘 요약 정보 반환 (순수 함수)
3
+ *
4
+ * 아이콘 이름을 전부 반환하면 토큰 낭비이므로,
5
+ * 요약 정보만 반환하고 search_icon으로 검색을 유도한다.
3
6
  */
4
7
  import { type McpToolResponse } from '../utils/response.js';
5
8
  export interface IconEntry {
@@ -2,14 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listIcons = void 0;
4
4
  /**
5
- * list_icons tool — 전체 아이콘 목록 반환 (순수 함수)
5
+ * list_icons tool — 아이콘 요약 정보 반환 (순수 함수)
6
+ *
7
+ * 아이콘 이름을 전부 반환하면 토큰 낭비이므로,
8
+ * 요약 정보만 반환하고 search_icon으로 검색을 유도한다.
6
9
  */
7
10
  const response_js_1 = require("../utils/response.js");
8
11
  const listIcons = (iconData) => {
12
+ const prefixes = new Set(iconData.icons.map((i) => i.name.replace(/Fill$/, '')));
9
13
  return (0, response_js_1.successResponse)({
10
14
  totalCount: iconData.totalCount,
11
15
  fillCount: iconData.fillCount,
12
- icons: iconData.icons.map((i) => i.name).sort(),
16
+ uniqueIcons: prefixes.size,
17
+ hint: '아이콘이 많으므로 search_icon tool로 키워드 검색을 권장합니다. 예: search_icon("arrow"), search_icon("check")',
18
+ sample: iconData.icons.slice(0, 20).map((i) => i.name),
13
19
  });
14
20
  };
15
21
  exports.listIcons = listIcons;
package/bin/tools/ping.js CHANGED
@@ -8,9 +8,9 @@ const CAPABILITIES = [
8
8
  { tool: 'search_component', description: '키워드로 컴포넌트 검색' },
9
9
  { tool: 'list_icons', description: '전체 아이콘 목록 조회' },
10
10
  { tool: 'search_icon', description: '키워드로 아이콘 검색' },
11
- { tool: 'get_component_html', description: '컴포넌트 HTML 마크업 조회 (variant 지원)' },
12
11
  { tool: 'get_component_props', description: '컴포넌트 Props 스펙 조회' },
13
12
  { tool: 'validate_html', description: 'HTML BEM 클래스 유효성 검증 + 자동 수정' },
13
+ { tool: 'render_to_html', description: 'Props 기반 동적 HTML 렌더링' },
14
14
  ];
15
15
  const RULES = [
16
16
  '이 라이브러리의 컴포넌트를 사용할 때는 CDN CSS/JS를 포함하세요',
@@ -0,0 +1,7 @@
1
+ /**
2
+ * render_to_html tool — 컴포넌트 속성을 전달하면 정확한 HTML을 반환
3
+ */
4
+ import type { ComponentData } from '../types.js';
5
+ import type { CdnMeta } from '../utils/dataLoader.js';
6
+ import { type McpToolResponse } from '../utils/response.js';
7
+ export declare const renderToHtml: (componentMap: Map<string, ComponentData>, bundle: Record<string, unknown>, cdnMeta: CdnMeta | null, name: string, props?: Record<string, unknown>) => McpToolResponse;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderToHtml = void 0;
4
+ const response_js_1 = require("../utils/response.js");
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
6
+ const { JSDOM } = require('jsdom');
7
+ let domInitialized = false;
8
+ let portalMocked = false;
9
+ /** jsdom + createPortal mock 환경을 세팅한다 */
10
+ const setupDomEnvironment = () => {
11
+ if (!domInitialized) {
12
+ const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>');
13
+ if (typeof globalThis.document === 'undefined')
14
+ globalThis.document = dom.window.document;
15
+ if (typeof globalThis.window === 'undefined')
16
+ globalThis.window = dom.window;
17
+ if (typeof globalThis.navigator === 'undefined') {
18
+ Object.defineProperty(globalThis, 'navigator', { value: dom.window.navigator, writable: true });
19
+ }
20
+ domInitialized = true;
21
+ }
22
+ if (!portalMocked) {
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
24
+ const ReactDOM = require('react-dom');
25
+ ReactDOM.createPortal = (children) => children;
26
+ portalMocked = true;
27
+ }
28
+ };
29
+ /** componentData.exportName으로 번들에서 컴포넌트를 찾는다 */
30
+ const findComponent = (bundle, exportName) => {
31
+ return bundle[exportName] ?? null;
32
+ };
33
+ /** componentMap의 props 스펙에서 defaultsUsed를 자동 계산 */
34
+ const calcDefaultsUsed = (propsSpec, userProps) => {
35
+ const defaults = {};
36
+ for (const [key, spec] of Object.entries(propsSpec)) {
37
+ if (spec.default !== undefined && !(key in userProps)) {
38
+ defaults[key] = spec.default;
39
+ }
40
+ }
41
+ return defaults;
42
+ };
43
+ const renderToHtml = (componentMap, bundle, cdnMeta, name, props) => {
44
+ const normalized = (0, response_js_1.normalizeName)(name);
45
+ const componentData = componentMap.get(normalized);
46
+ if (!componentData)
47
+ return (0, response_js_1.componentNotFoundResponse)(normalized);
48
+ setupDomEnvironment();
49
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
50
+ const React = require('react');
51
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
52
+ const { renderToStaticMarkup } = require('react-dom/server');
53
+ const exportName = componentData.exportName;
54
+ if (!exportName) {
55
+ return (0, response_js_1.errorResponse)('EXPORT_NAME_MISSING', `'${normalized}' 컴포넌트에 exportName이 없습니다.`, '데이터를 재추출해주세요 (yarn extract).');
56
+ }
57
+ const Component = findComponent(bundle, exportName);
58
+ if (!Component) {
59
+ return (0, response_js_1.errorResponse)('COMPONENT_NOT_IN_BUNDLE', `'${normalized}' (${exportName}) 컴포넌트가 번들에 없습니다.`, '번들을 재빌드해주세요 (yarn build:bundle).');
60
+ }
61
+ try {
62
+ const userProps = props ?? {};
63
+ const element = React.createElement(Component, userProps);
64
+ const html = renderToStaticMarkup(element);
65
+ const defaultsUsed = componentData.props ? calcDefaultsUsed(componentData.props, userProps) : {};
66
+ return (0, response_js_1.successResponse)({
67
+ html,
68
+ component: normalized,
69
+ exportName,
70
+ appliedProps: userProps,
71
+ defaultsUsed,
72
+ js: componentData.jsRequired
73
+ ? { required: true, description: '이 컴포넌트는 인터랙션을 위해 CDN JS가 필요합니다' }
74
+ : { required: false },
75
+ cdn: cdnMeta ?? undefined,
76
+ });
77
+ }
78
+ catch (err) {
79
+ const errMessage = err instanceof Error ? err.message : String(err);
80
+ return (0, response_js_1.errorResponse)('RENDER_FAILED', `'${normalized}' 렌더링 실패: ${errMessage}`, '사용 가능한 속성을 확인하려면 get_component_props를 사용하세요.');
81
+ }
82
+ };
83
+ exports.renderToHtml = renderToHtml;
package/bin/types.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface ComponentUsage {
13
13
  }
14
14
  export interface ComponentData {
15
15
  name: string;
16
+ exportName?: string;
17
+ jsRequired?: boolean;
16
18
  description: string;
17
19
  aliases: string[];
18
20
  props: Record<string, PropSpec>;
@@ -8,15 +8,7 @@ export interface CdnMeta {
8
8
  css: string;
9
9
  js: string;
10
10
  }
11
- export interface IconEntry {
12
- name: string;
13
- kebab: string;
14
- fill: boolean;
15
- }
16
- export interface IconData {
17
- totalCount: number;
18
- fillCount: number;
19
- icons: IconEntry[];
20
- }
11
+ import type { IconData } from '../tools/listIcons.js';
12
+ export type { IconData };
21
13
  export declare const loadIconData: (dataDir: string) => IconData;
22
14
  export declare const loadCdnMeta: (dataDir: string) => CdnMeta | null;
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "badge-group",
3
+ "exportName": "BadgeGroup",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Badge Group 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/badge.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "badge",
3
+ "exportName": "Badge",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Badge 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "bread-crumb",
3
+ "exportName": "BreadCrumb",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Bread Crumb 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {},
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "breadcrumb",
3
+ "exportName": "Breadcrumb",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Breadcrumb 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "button-group",
3
+ "exportName": "ButtonGroup",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Button Group 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/button.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "button",
3
+ "exportName": "Button",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Button 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "carousel-arrow",
3
+ "exportName": "CarouselArrow",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Carousel Arrow 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "carousel-number-group",
3
+ "exportName": "CarouselNumberGroup",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Carousel Number Group 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "carousel",
3
+ "exportName": "Carousel",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Carousel 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {},
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "checkbox",
3
+ "exportName": "Checkbox",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Checkbox 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "combobox",
3
+ "exportName": "Combobox",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Combobox 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "date-picker",
3
+ "exportName": "DatePicker",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Date Picker 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/divider.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "divider",
3
+ "exportName": "Divider",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Divider 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/dot.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "dot",
3
+ "exportName": "Dot",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Dot 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "dropdown",
3
+ "exportName": "Dropdown",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Dropdown 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "empty-state",
3
+ "exportName": "EmptyState",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Empty State 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "featured-icon",
3
+ "exportName": "FeaturedIcon",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Featured Icon 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "file-input",
3
+ "exportName": "FileInput",
4
+ "jsRequired": true,
3
5
  "description": "NCDS File Input 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "horizontal-tab",
3
+ "exportName": "HorizontalTab",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Horizontal Tab 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "image-file-input",
3
+ "exportName": "ImageFileInput",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Image File Input 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/input.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "input",
3
+ "exportName": "InputBase",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Input 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/modal.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "modal",
3
+ "exportName": "Modal",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Modal 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "notification",
3
+ "exportName": "Notification",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Notification 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "number-input",
3
+ "exportName": "NumberInput",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Number Input 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "pagination",
3
+ "exportName": "Pagination",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Pagination 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "password-input",
3
+ "exportName": "PasswordInput",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Password Input 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {},
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "progress-bar",
3
+ "exportName": "ProgressBar",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Progress Bar 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "progress-circle",
3
+ "exportName": "ProgressCircle",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Progress Circle 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/radio.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "radio",
3
+ "exportName": "Radio",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Radio 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "range-date-picker-with-buttons",
3
+ "exportName": "RangeDatePickerWithButtons",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Range Date Picker With Buttons 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "range-date-picker",
3
+ "exportName": "RangeDatePicker",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Range Date Picker 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "select-dropdown",
3
+ "exportName": "SelectDropdown",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Select Dropdown 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {},
package/data/select.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "select",
3
+ "exportName": "Select",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Select 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "selectbox",
3
+ "exportName": "Selectbox",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Selectbox 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/slider.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "slider",
3
+ "exportName": "Slider",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Slider 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/spinner.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "spinner",
3
+ "exportName": "Spinner",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Spinner 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/switch.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "switch",
3
+ "exportName": "Switch",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Switch 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/tab.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "tab",
3
+ "exportName": "Tab",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Tab 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/tag.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "tag",
3
+ "exportName": "Tag",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Tag 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "textarea",
3
+ "exportName": "Textarea",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Textarea 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/toggle.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "toggle",
3
+ "exportName": "Toggle",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Toggle 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/data/tooltip.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "tooltip",
3
+ "exportName": "Tooltip",
4
+ "jsRequired": true,
3
5
  "description": "NCDS Tooltip 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "vertical-tab",
3
+ "exportName": "VerticalTab",
4
+ "jsRequired": false,
3
5
  "description": "NCDS Vertical Tab 컴포넌트",
4
6
  "aliases": [],
5
7
  "props": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncds/ui-admin-mcp",
3
- "version": "1.6.4-alpha.5",
3
+ "version": "1.6.4-alpha.7",
4
4
  "description": "NCDS UI Admin MCP 서버 — AI 에이전트가 NCUA 컴포넌트를 조회하고 HTML을 검증할 수 있는 MCP 서버",
5
5
  "bin": {
6
6
  "ncua-mcp": "./bin/server.mjs"