@makitt.io/mds-mcp-server 0.1.2 → 0.2.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 (55) hide show
  1. package/README.md +142 -41
  2. package/dist/catalog.d.ts +16 -0
  3. package/dist/catalog.d.ts.map +1 -0
  4. package/dist/catalog.js +383 -0
  5. package/dist/catalog.js.map +1 -0
  6. package/dist/data/catalog.json +42535 -5019
  7. package/dist/data/playbook/ai-fill.md +62 -49
  8. package/dist/data/playbook/anti-patterns.md +112 -110
  9. package/dist/data/playbook/array-input.md +95 -50
  10. package/dist/data/playbook/async-states.md +71 -61
  11. package/dist/data/playbook/data-grid.md +177 -80
  12. package/dist/data/playbook/feedback.md +107 -88
  13. package/dist/data/playbook/form.md +164 -134
  14. package/dist/data/playbook/overlay.md +98 -89
  15. package/dist/data/playbook/page-layout.md +96 -77
  16. package/dist/data/playbook/responsive-tokens.md +78 -59
  17. package/dist/data/recipes/admin-list-page.md +86 -0
  18. package/dist/data/recipes/async-state-section.md +60 -0
  19. package/dist/data/recipes/dashboard-overview.md +65 -0
  20. package/dist/data/recipes/detail-drawer.md +69 -0
  21. package/dist/data/recipes/modal-form.md +67 -0
  22. package/dist/data/recipes/settings-form-page.md +79 -0
  23. package/dist/index.d.ts +4 -23
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +25 -339
  26. package/dist/index.js.map +1 -1
  27. package/dist/loaders.d.ts +8 -0
  28. package/dist/loaders.d.ts.map +1 -0
  29. package/dist/loaders.js +120 -0
  30. package/dist/loaders.js.map +1 -0
  31. package/dist/recipes.d.ts +13 -0
  32. package/dist/recipes.d.ts.map +1 -0
  33. package/dist/recipes.js +82 -0
  34. package/dist/recipes.js.map +1 -0
  35. package/dist/responses.d.ts +8 -0
  36. package/dist/responses.d.ts.map +1 -0
  37. package/dist/responses.js +25 -0
  38. package/dist/responses.js.map +1 -0
  39. package/dist/text.d.ts +4 -0
  40. package/dist/text.d.ts.map +1 -0
  41. package/dist/text.js +20 -0
  42. package/dist/text.js.map +1 -0
  43. package/dist/tool-definitions.d.ts +3 -0
  44. package/dist/tool-definitions.d.ts.map +1 -0
  45. package/dist/tool-definitions.js +199 -0
  46. package/dist/tool-definitions.js.map +1 -0
  47. package/dist/tools.d.ts +4 -0
  48. package/dist/tools.d.ts.map +1 -0
  49. package/dist/tools.js +233 -0
  50. package/dist/tools.js.map +1 -0
  51. package/dist/types.d.ts +107 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +10 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +20 -16
package/README.md CHANGED
@@ -1,29 +1,72 @@
1
1
  # @makitt.io/mds-mcp-server
2
2
 
3
3
  MCP (Model Context Protocol) server for `@makitt/mds`. AI 가 mds 의 catalog +
4
- playbook 자동 query — fabrication 0 최종 layer.
4
+ playbook + recipe 를 자동 query — fabrication 0 보장의 최종 layer.
5
5
 
6
- > **Registry**: npmjs.org (표준 public npm registry). `.npmrc` 별도 setup 없이 install.
6
+ > **Registry**: npmjs.org (표준 public npm registry). `.npmrc` 별도 setup 없이
7
+ > install 가능.
7
8
 
8
9
  ## 무엇을 하는가
9
10
 
10
11
  Claude Code / Cursor 같은 AI 도구가 다음을 자동 query:
11
12
 
12
- - **컴포넌트 spec** — props / types / JSDoc / stories (301 components in catalog.json)
13
- - **Playbook 9 영역** — form / feedback / data-grid / overlay / page-layout / array-input / async-states / ai-fill / anti-patterns
13
+ - **컴포넌트 contract** — public import / props / enum values / type shapes /
14
+ JSDoc / Storybook URLs / story source
15
+ - **Playbook 영역** — form / feedback / data-grid / overlay / page-layout /
16
+ array-input / async-states / ai-fill / anti-patterns
17
+ - **MDS-only composition recipes** — admin list page / settings form page /
18
+ modal form / detail drawer / dashboard overview / async state section
14
19
  - **결정 표 검색** — "modal-form vs page-form 어떻게 선택?" → playbook 안 lookup
15
- - **안티패턴 자동 검출** 작성 코드의 mds rule 위반 식별
20
+ - **안티패턴 조회/가드레일**playbook 기반으로 사용 금지 패턴 확인
16
21
 
17
22
  ## Tools
18
23
 
19
- | Tool | 용도 |
20
- |---|---|
21
- | `mds_components_list` | 모든 mds 컴포넌트 list (layer 필터 가능) |
22
- | `mds_components_get` | 특정 컴포넌트의 full spec (props / types / JSDoc) |
23
- | `mds_components_search` | 컴포넌트 name / description / prop text search |
24
- | `mds_playbook_list` | 9 Playbook 영역 list |
25
- | `mds_playbook_get` | 특정 Playbook full content (markdown) |
26
- | `mds_playbook_search` | 모든 Playbook decision matrix / 안티패턴 text search |
24
+ | Tool | 용도 |
25
+ | ---------------------------- | ----------------------------------------------------------------------------------------------- |
26
+ | `mds_codegen_plan` | 페이지/기능 codegen 시작점. task recipe/playbook/component 후속 조회 계획 + guardrail 반환 |
27
+ | `mds_components_list` | public JSX component / compound part list. 기본 compact, helper/type/internal 숨김 |
28
+ | `mds_components_get` | 특정 컴포넌트의 full contract (import / props / enum values / type shapes / stories / examples) |
29
+ | `mds_components_search` | alias / dot name / prop / enum value / type / story normalized search |
30
+ | `mds_component_examples_get` | Storybook URL / iframe URL / story source / JSDoc examples |
31
+ | `mds_playbook_list` | Playbook 영역 list |
32
+ | `mds_playbook_get` | 특정 Playbook 의 full content (markdown) |
33
+ | `mds_playbook_search` | 모든 Playbook 의 decision matrix / 안티패턴 text search |
34
+ | `mds_recipes_list` | MDS-only composition recipe list |
35
+ | `mds_recipes_get` | 특정 recipe 의 full MDS composition contract |
36
+ | `mds_recipes_search` | recipe content text search |
37
+
38
+ ## Agent Codegen Contract
39
+
40
+ MCP 응답은 AI agent 가 MDS UI 를 바로 작성할 수 있게 아래 정보를 제공한다.
41
+
42
+ - `kind` — `component`, `compoundPart`, `hook`, `helper`, `type`, `store`,
43
+ `internal`
44
+ - `status` — `implemented`, `planned`, `deprecated`, `internal`
45
+ - `import.statement` — 실제 코드에서 써야 하는 public import
46
+ - `props[].values` — union / enum literal values
47
+ - `types` — `ColumnDef<T>`, `SortState`, `TableDensity` 같은 참조 타입 shape
48
+ - `storybook[].storyUrl` / `iframeUrl` — browser agent 가 직접 열 visual oracle
49
+ - `storybook[].source` — 해당 story 의 source snippet
50
+ - `examples` — component JSDoc `@example`
51
+
52
+ 기본 `mds_components_list` 는 실제 JSX 로 조립 가능한 public component 와
53
+ compound part 만 반환한다. `insertImage`, `$isImageNode`,
54
+ `NotificationRootProps` 같은 helper / type / internal symbol 은
55
+ `includeInternal: true` 를 명시한 경우에만 탐색 대상이다.
56
+
57
+ Agent 의 표준 사용 순서:
58
+
59
+ 0. `mds_codegen_plan` 으로 task 에 맞는 recipe / playbook / component 조회
60
+ 순서를 잡는다.
61
+ 1. `mds_recipes_search` 또는 `mds_recipes_get` 으로 MDS-only 조립 패턴을
62
+ 확인한다.
63
+ 2. `mds_playbook_get` 으로 page/form/data/overlay 결정 기준을 확인한다.
64
+ 3. `mds_components_search` 로 후보를 찾는다.
65
+ 4. `mds_components_get` 으로 import, prop values, type shape 를 확인한다.
66
+ 5. `mds_component_examples_get` 의 Storybook `iframeUrl` 을 browser/screenshot
67
+ 도구로 열어 실제 렌더링을 확인한다.
68
+ 6. 생성한 페이지도 Playwright/Storybook screenshot 으로 desktop/mobile overflow
69
+ 와 interaction 을 확인한다.
27
70
 
28
71
  ## 설치
29
72
 
@@ -33,13 +76,14 @@ Claude Code / Cursor 같은 AI 도구가 다음을 자동 query:
33
76
  claude mcp add mds -- npx -y @makitt.io/mds-mcp-server@latest
34
77
  ```
35
78
 
36
- → npmjs.org 에서 자동 fetch + 실행. self-contained (embedded catalog + playbook). 별도 auth / scope mapping 없음.
79
+ → npmjs.org 에서 자동 fetch + 실행. self-contained (embedded catalog +
80
+ playbook + recipe). 별도 auth / scope mapping 없음.
37
81
 
38
82
  ### B. Local build (mds 개발자 monorepo)
39
83
 
40
84
  ```bash
41
85
  cd packages/mds && pnpm build # catalog.json 생성
42
- cd ../mds-mcp-server && pnpm build # tsc + copy:data
86
+ cd ../mds-mcp-server && pnpm build # tsc + data/release verify + dogfood + stdio smoke + pack verify
43
87
  claude mcp add mds -- node /absolute/path/.../mds-mcp-server/dist/index.js
44
88
  ```
45
89
 
@@ -49,6 +93,7 @@ claude mcp add mds -- node /absolute/path/.../mds-mcp-server/dist/index.js
49
93
  claude mcp add mds \
50
94
  -e MDS_CATALOG_PATH=/path/to/your/catalog.json \
51
95
  -e MDS_PLAYBOOK_DIR=/path/to/your/playbook \
96
+ -e MDS_RECIPE_DIR=/path/to/your/recipes \
52
97
  -- npx -y @makitt.io/mds-mcp-server@latest
53
98
  ```
54
99
 
@@ -72,20 +117,41 @@ AI: (mds_playbook_get 'form' 자동 호출 → 결정 표 lookup)
72
117
 
73
118
  ## Path resolution 우선순위
74
119
 
75
- 1. **env var** (`MDS_CATALOG_PATH` / `MDS_PLAYBOOK_DIR`) — 외부 customize
120
+ 1. **env var** (`MDS_CATALOG_PATH` / `MDS_PLAYBOOK_DIR` / `MDS_RECIPE_DIR`) —
121
+ 외부 customize
76
122
  2. **embedded data** (`dist/data/`) — published package 의 self-contained
77
123
  3. **monorepo relative** (`../../mds/`) — dev fallback
78
124
 
79
125
  ## Build (data 자동 embed)
80
126
 
81
127
  ```bash
82
- pnpm build # tsc + scripts/copy-data.mjs
128
+ pnpm build # tsc + copy:data + verify:data + dogfood + smoke:stdio + verify:pack
83
129
  ```
84
130
 
85
131
  - `tsc` — TypeScript compile (`dist/index.js`)
86
- - `copy-data.mjs` — `../mds/dist/catalog.json` + `../mds/docs/playbook/` 을 `dist/data/` 로 복사
132
+ - `copy-data.mjs` — `../mds/dist/catalog.json` + `../mds/docs/playbook/` +
133
+ `../mds/docs/recipes/` 를 `dist/data/` 로 복사
134
+ - `verify-data.mjs` — embedded catalog/playbook/recipe 누락과 버전 메타 검증
135
+ - `dogfood.mjs` — build 된 MCP API 로 전체 recipe reachability, recipe 참조
136
+ component, compound namespace overview, 대표 agent 시나리오 검증
137
+ - `smoke-stdio.mjs` — MCP SDK client 로 `node dist/index.js` 실제 stdio
138
+ transport 호출 검증
139
+ - `verify-pack.mjs` — `npm pack --dry-run` payload 에 embedded data 포함,
140
+ source/script 누출 없음 검증
87
141
 
88
- → self-contained package. `files: ["dist", "README.md"]` 가 npm publish 의 포함.
142
+ → self-contained package. `files: ["dist", "README.md"]` 가 npm publish
143
+ 포함됨.
144
+
145
+ ## Release policy
146
+
147
+ ```bash
148
+ pnpm verify:release
149
+ ```
150
+
151
+ - `verify-release.mjs` — Changesets/publish policy, npm files contract,
152
+ README publish guide 검증
153
+ - CI와 `prepublishOnly`에서 실행한다. 앱/로컬 빌드가 루트 `.changeset` 메타데이터에
154
+ 묶이지 않도록 `pnpm build`에는 포함하지 않는다.
89
155
 
90
156
  ## Transport
91
157
 
@@ -93,57 +159,92 @@ stdio (Claude Code / Cursor 표준).
93
159
 
94
160
  ## Publish (maintainer 용)
95
161
 
96
- npm registry (`registry.npmjs.org`) `@makitt.io/mds-mcp-server` publish.
162
+ npm registry (`registry.npmjs.org`) `@makitt.io/mds-mcp-server` publish.
97
163
 
98
164
  ### 첫 setup — Granular Access Token (공용 계정 권장)
99
165
 
100
- 공용 npm 계정 (예: `techtaka-makitt`) publish 자동 — 매번 2FA OTP race 의 안 적합. **Granular Access Token + bypass 2FA** 의 1회 setup + 이후 publish 자동.
166
+ 공용 npm 계정 (예: `techtaka-makitt`) publish 흐름을 자동화 — 매번 2FA OTP race
167
+ 에는 부적합. **Granular Access Token + bypass 2FA** 를 1회 setup 하면 이후
168
+ publish 가 자동.
101
169
 
102
- 1. **token 생성** — https://www.npmjs.com/settings/<username>/tokens/granular-access-tokens/new
170
+ 1. **token 생성** —
171
+ https://www.npmjs.com/settings/<username>/tokens/granular-access-tokens/new
103
172
  - **Token name**: `mds-mcp-server publish` (또는 유의미한 라벨)
104
173
  - **Expiration**: 1 year (또는 정책 따라)
105
174
  - **Allowed IP ranges**: 비워두기 (또는 CI / 사무실 IP)
106
175
  - **Packages and scopes**:
107
176
  - "Only select packages and scopes" → **`@makitt.io`** scope 추가
108
177
  - Permissions: **Read and write**
109
- - **Bypass 2FA**: ✓ enable (publish OTP 필요)
110
- - Generate token → 값 복사 (한 표시)
111
- 2. **token 공용 vault share** — 1Password / LastPass / Bitwarden 등 team 의 공유 entry. 채팅 / 코드 에 직접 X
112
- 3. **각 maintainer local setup** `~/.npmrc` 의 직접 entry (또는 `npm config set`):
178
+ - **Bypass 2FA**: ✓ enable (publish OTP 요구하지 않음)
179
+ - Generate token → 값 복사 (한 번만 표시)
180
+ 2. **token 공용 vault share** — 1Password / LastPass / Bitwarden 등 team
181
+ 공유 entry 보관. 채팅 / 코드에 직접 노출 금지
182
+ 3. **각 maintainer 의 local setup** — `~/.npmrc` 에 직접 entry 추가 (또는
183
+ `npm config set`):
113
184
  ```bash
114
185
  npm config set //registry.npmjs.org/:_authToken=<token>
115
186
  ```
116
- → `~/.npmrc` 추가. git ignore 됨 (사용자 home dir).
187
+ → `~/.npmrc` 추가됨. git ignore 됨 (사용자 home dir).
188
+
189
+ ### Version bump — Changesets
190
+
191
+ 이 repo 의 package version 은 Changesets 로 올린다. `npm version` 으로 직접 bump
192
+ 하지 않는다.
193
+
194
+ - `patch` — MCP answer bugfix, stale embed fix, doc/copy correction
195
+ - `minor` — new MCP tool, new response field, new recipe/playbook surface
196
+ - `major` — tool rename/removal, response shape breaking change, install command
197
+ breaking change
198
+
199
+ ```bash
200
+ pnpm changeset
201
+ ```
202
+
203
+ 예:
204
+
205
+ ```md
206
+ ---
207
+ '@makitt.io/mds-mcp-server': minor
208
+ '@makitt/mds': patch
209
+ ---
210
+
211
+ Add MCP codegen planning, stdio smoke, and stricter generated catalog contracts.
212
+ ```
213
+
214
+ MDS 와 MCP 는 결합되어 있다. MDS component/catalog/playbook/recipe 가 바뀌고 MCP
215
+ embedded answer 가 바뀌면 MCP changeset 도 같이 남긴다.
117
216
 
118
217
  ### Publish 흐름
119
218
 
219
+ maintainer 가 release PR/commit 에서:
220
+
120
221
  ```bash
121
- cd packages/mds-mcp-server
122
- pnpm build # tsc + copy-data (catalog.json + playbook md → dist/data/)
123
- npm publish --dry-run # tarball 검증 (file list / size / name / version)
124
- npm publish # 실제 publish (bypass 2FA token 의 자동)
222
+ pnpm version-packages # changeset version: package.json + changelog 갱신
223
+ pnpm release # packages build + changeset publish
125
224
  ```
126
225
 
127
- ### Version bump
226
+ 로컬 검증은 publish 전 항상:
128
227
 
129
228
  ```bash
130
- npm version patch # 0.1.0 → 0.1.1 (bugfix)
131
- npm version minor # 0.1.0 0.2.0 (feature)
132
- npm version major # 0.1.0 → 1.0.0 (breaking)
229
+ cd packages/mds-mcp-server
230
+ pnpm build # data/release verify + dogfood + stdio smoke + pack verify
133
231
  ```
134
232
 
135
- `package.json` 자동 bump + git tag 자동 생성. push `git push --follow-tags`.
233
+ `verify:pack` 이미 `npm pack --dry-run --json` payload 검사하므로 별도
234
+ 수동 `npm publish --dry-run` 은 보조 확인용이다.
136
235
 
137
236
  ### 보안
138
237
 
139
- - ❌ token 채팅 / git commit / chat log leak — 즉시 npmjs.com 의 settings 의 **Revoke**
238
+ - ❌ token 채팅 / git commit / chat log 등으로 leak — 즉시 npmjs.com
239
+ settings 에서 **Revoke**
140
240
  - ❌ 무한 expiration token — 1 year 이내
141
- - ❌ "Read and write" 모든 scope — `@makitt.io` specific scope 만
142
- - ✓ Bypass 2FA enable — 공용 계정 publish OTP race 의 안
241
+ - ❌ "Read and write" 모든 scope 허용 — `@makitt.io` specific scope 만 허용
242
+ - ✓ Bypass 2FA enable — 공용 계정 publish OTP race 방지
143
243
 
144
244
  ## 향후 (Step 6 follow-up)
145
245
 
146
246
  - `mds_lint_check(code)` — 사용자 코드의 mds rule 위반 자동 검출
147
- - `mds_skills_list` — AI fill skill registry (ai-fill.md)
247
+ - `mds_skills_list` — AI fill skill registry (ai-fill.md)
148
248
  - `mds_responsive_check(component, viewport)` — 컴포넌트의 responsive 동작 spec
149
- - `mds_examples_get(component)` — 컴포넌트 사용 예 (story args + apps/web 사용 모음)
249
+ - `mds_examples_get(component)` — 컴포넌트 사용 예 (story args + apps/web 실
250
+ 사용 모음)
@@ -0,0 +1,16 @@
1
+ import type { Catalog, CatalogComponent, CompoundOverview } from './types.js';
2
+ export declare function isDefaultListable(component: CatalogComponent): boolean;
3
+ export declare function findComponent(catalog: Catalog, name: string): CatalogComponent | undefined;
4
+ export declare function findExactComponent(catalog: Catalog, name: string): CatalogComponent | undefined;
5
+ export declare function componentMatchesQuery(component: CatalogComponent, queryTokens: string[]): boolean;
6
+ export declare function scoreComponent(component: CatalogComponent, query: string): number;
7
+ export declare function summarizeComponent(component: CatalogComponent, includeDescription: boolean): Record<string, unknown>;
8
+ export declare function componentNamespace(componentName: string): string;
9
+ export declare function compoundNamespaces(catalog: Catalog): string[];
10
+ export declare function collectCompoundParts(catalog: Catalog, namespace: string): CatalogComponent[];
11
+ export declare function findCompoundNamespace(catalog: Catalog, name: string): string | undefined;
12
+ export declare function buildCompoundOverview(catalog: Catalog, namespace: string): CompoundOverview;
13
+ export declare function buildComponentContract(catalog: Catalog, component: CatalogComponent): Record<string, unknown>;
14
+ export declare function componentSuggestions(catalog: Catalog, name: string): string[];
15
+ export declare function summarizeSearchMatch(component: CatalogComponent, queryTokens: string[]): Record<string, unknown>;
16
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,OAAO,EACP,gBAAgB,EAIhB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAQtE;AAgBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAK1F;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAU/F;AA0BD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAIjG;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcjF;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,gBAAgB,EAC3B,kBAAkB,EAAE,OAAO,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAM7D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA8B5F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxF;AAuMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAgC3F;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,gBAAgB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY7E;AA6BD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,gBAAgB,EAC3B,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"}