@ng-solid/mcp 22.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 (47) hide show
  1. package/GUIDE.md +292 -0
  2. package/README.md +159 -0
  3. package/data/design-system.json +24204 -0
  4. package/data/icons.json +1 -0
  5. package/data/skills/ns-solid-components/SKILL.md +140 -0
  6. package/data/skills/ns-solid-forms/SKILL.md +183 -0
  7. package/data/skills/ns-solid-icons/SKILL.md +95 -0
  8. package/data/skills/ns-solid-install/SKILL.md +120 -0
  9. package/data/skills/ns-solid-style-contract/SKILL.md +84 -0
  10. package/data/skills/ns-solid-theming/SKILL.md +123 -0
  11. package/index.d.ts +3 -0
  12. package/index.js +38 -0
  13. package/lib/data.d.ts +26 -0
  14. package/lib/data.js +51 -0
  15. package/lib/install-skills.d.ts +1 -0
  16. package/lib/install-skills.js +159 -0
  17. package/lib/preset-validator.d.ts +44 -0
  18. package/lib/preset-validator.js +172 -0
  19. package/lib/prompts.d.ts +2 -0
  20. package/lib/prompts.js +173 -0
  21. package/lib/resources.d.ts +2 -0
  22. package/lib/resources.js +328 -0
  23. package/lib/server.d.ts +3 -0
  24. package/lib/server.js +31 -0
  25. package/lib/style-contract.d.ts +37 -0
  26. package/lib/style-contract.js +167 -0
  27. package/lib/template-parser.d.ts +29 -0
  28. package/lib/template-parser.js +230 -0
  29. package/lib/tools.components.d.ts +44 -0
  30. package/lib/tools.components.js +836 -0
  31. package/lib/tools.d.ts +9 -0
  32. package/lib/tools.guides.d.ts +15 -0
  33. package/lib/tools.guides.js +103 -0
  34. package/lib/tools.icons.d.ts +7 -0
  35. package/lib/tools.icons.js +106 -0
  36. package/lib/tools.js +18 -0
  37. package/lib/tools.tokens.d.ts +7 -0
  38. package/lib/tools.tokens.js +278 -0
  39. package/lib/types.d.ts +349 -0
  40. package/lib/types.js +11 -0
  41. package/package.json +52 -0
  42. package/skills/ns-solid-components/SKILL.md +77 -0
  43. package/skills/ns-solid-forms/SKILL.md +166 -0
  44. package/skills/ns-solid-icons/SKILL.md +95 -0
  45. package/skills/ns-solid-install/SKILL.md +119 -0
  46. package/skills/ns-solid-style-contract/SKILL.md +84 -0
  47. package/skills/ns-solid-theming/SKILL.md +123 -0
package/GUIDE.md ADDED
@@ -0,0 +1,292 @@
1
+ # Guía de `@ng-solid/mcp`
2
+
3
+ Arquitectura, pipeline de datos y mantenimiento del servidor MCP del design
4
+ system Arvisfy. Para instalación y uso como consumidor, ver
5
+ [`README.md`](./README.md).
6
+
7
+ > Resumen rápido: este paquete genera en build un snapshot JSON a partir del
8
+ > **AST real** de `@ng-solid/design-system` (Compiler API de TypeScript), del
9
+ > preset Arvisfy, del catálogo de iconos `@ng-solid/icons` y de las 6 skills
10
+ > en `packages/mcp/skills/`. El servidor MCP sólo lee ese snapshot por
11
+ > stdio — nunca ejecuta Angular ni analiza código en runtime.
12
+
13
+ ## 1. Primera librería no-Angular del workspace
14
+
15
+ `@ng-solid/mcp` es la **primera** librería de `packages/*` que no es una
16
+ librería Angular. Eso tiene consecuencias que no aplican al resto del
17
+ workspace:
18
+
19
+ - **`@nx/dependency-checks` no aplica.** El resto de `packages/*` usa
20
+ `@nx/eslint-plugin`'s dependency-checks rule para validar que
21
+ `package.json` liste exactamente lo que el código importa; `eslint.config.mjs`
22
+ de este paquete no extiende esa regla porque no hay un `ng-package.json`
23
+ que la alimente.
24
+ - **`flat/angular` y `flat/angular-template` no aplican.** `eslint.config.mjs`
25
+ extiende `../../eslint.config.mjs` explícitamente sin esos presets ni
26
+ `@angular-eslint/component-selector` — no hay componentes ni templates
27
+ Angular en este paquete.
28
+ - **El preset de Jest del workspace no aplica.** El target `test` es
29
+ `nx:run-commands` puro (`node --test tests/*.test.mjs` + `node
30
+ scripts/smoke.mjs`), usando el test runner nativo de Node 24. No hay
31
+ `jest.config.ts` ni `ts-jest`.
32
+ - **El build no usa `ng-packagr`.** Es `nx:run-commands` →
33
+ `node scripts/prebuild.mjs && tsc -p tsconfig.lib.json && node
34
+ scripts/postbuild.mjs`. `tsc` compila `src/` a JS plano (`module`/`moduleResolution:
35
+ NodeNext`), y `postbuild.mjs` copia los assets (`data/`, `skills/`,
36
+ `README.md`, `GUIDE.md`) y escribe un `package.json` saneado en
37
+ `dist/packages/mcp`.
38
+ - **No hay dependencia de código hacia `design-system`/`icons`.** El
39
+ prebuild lee sus ficheros fuente directamente por ruta, sin importar
40
+ ningún paquete `@ng-solid/*` en tiempo de build. Por eso `project.json`
41
+ declara `implicitDependencies: ["design-system", "icons"]` — sin eso,
42
+ `nx affected` nunca dispararía la regeneración del snapshot cuando esos
43
+ paquetes cambian.
44
+
45
+ ## 2. Arquitectura del pipeline de datos
46
+
47
+ ```text
48
+ packages/design-system/src/** ─┐
49
+ packages/icons/src/lib/generated/** ├─► scripts/prebuild.mjs ─► data/design-system.json
50
+ apps/demo/src/app/docs.registry.ts │ data/icons.json
51
+ tools/scripts/check-design-system-styles.mjs data/skills/<name>/SKILL.md
52
+ packages/mcp/skills/<name>/SKILL.md ─┘
53
+ packages/mcp/overrides/component-notes.json
54
+
55
+ data/*.json ─► src/lib/data.ts (loadSnapshot/loadIcons) ─► src/lib/{tools,resources,prompts}.ts ─► server.ts ─► stdio
56
+ ```
57
+
58
+ `scripts/prebuild.mjs` orquesta un único `ts.Program` (`ts-program.mjs`,
59
+ rooteado en `packages/design-system/src/index.ts`) y ejecuta cada extractor
60
+ de `scripts/lib/` sobre él:
61
+
62
+ | Extractor | Lee | Produce |
63
+ | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | `extract-components.mjs` (+ `extract-members.mjs`, `extract-host.mjs`, `extract-template.mjs`) | AST de cada `@Component`/`@Directive` bajo `design-system/src/lib` | `ComponentDoc[]` — un doc por selector, con herencia de inputs resuelta, BEM parseado y `visibility` derivada del cierre de exports público |
65
+ | `extract-services.mjs` | AST de servicios `@Injectable` y providers de función exportados | `ServiceDoc[]`, `ProviderDoc[]` |
66
+ | `extract-tokens.mjs` | `arvisfy.preset.ts` + `theme.utils.ts` (transpilados en memoria) + SCSS de componente | `ThemeDoc` — 3 tiers, `resolved.{light,dark}` por token de componente, `drift` |
67
+ | `extract-registry.mjs` | `apps/demo/src/app/docs.registry.ts` | Join `slug ↔ selector` que añade `category`/`summary`/`variants`/`snippet` a los `ComponentDoc` del registro |
68
+ | `extract-icons.mjs` | `packages/icons/src/lib/generated/{catalog.json,index.ts,metadata.ts}` | `IconDoc[]` (name ↔ symbol, sin cuerpos SVG) |
69
+ | `extract-guides.mjs` (Fase 5, este paquete) | `packages/mcp/skills/<name>/SKILL.md` + el resto de extractores (para interpolar) | `GuideDoc[]` embebido en el snapshot, y el `Map` de ficheros resueltos que `prebuild.mjs` escribe en `data/skills/` |
70
+
71
+ `overrides/component-notes.json` inyecta `pitfalls`/`relatedComponents`
72
+ escritos a mano por selector — lo único que ningún AST puede producir.
73
+
74
+ `scripts/lib/snapshot.mjs` ensambla ambos ficheros finales
75
+ (`buildSnapshot`/`buildIconsSnapshot`), aplica `sanitizePaths` (ninguna ruta
76
+ absoluta del checkout sobrevive al JSON) y fija `generatedAt: "snapshot"` —
77
+ nunca una fecha real — para que dos ejecuciones sucesivas sean
78
+ byte-idénticas.
79
+
80
+ ### Regenerar el snapshot
81
+
82
+ ```bash
83
+ pnpm exec nx run mcp:build-data # escribe packages/mcp/data/*.json y data/skills/**
84
+ ```
85
+
86
+ Regenera cuando cambie cualquiera de las fuentes de la tabla anterior:
87
+ un input()/output()/model() en design-system, el preset Arvisfy, el
88
+ catálogo de iconos, el registro de docs de la demo, el script de
89
+ estilos, o una `SKILL.md`.
90
+
91
+ ### `--check` — el gate de CI
92
+
93
+ ```bash
94
+ pnpm exec nx run mcp:check-data
95
+ ```
96
+
97
+ Genera el mismo snapshot **en memoria** (nunca escribe a disco) y lo
98
+ compara byte a byte contra `data/design-system.json` / `data/icons.json`.
99
+ Si difiere, sale con código 1 y un resumen legible (selectores
100
+ añadidos/eliminados, inputs que cambiaron, conteo de iconos) — el mismo
101
+ contrato que `pnpm icons:check` para el catálogo de iconos del propio
102
+ `@ng-solid/icons`. Como `guides` vive dentro de `design-system.json`, un
103
+ cambio no regenerado en cualquier `SKILL.md` (incluida una interpolación de
104
+ marcador desactualizada) también hace fallar `--check`, sin lógica
105
+ adicional: no hay un `--check` separado para `data/skills/`.
106
+
107
+ ### Por qué se publica desde `dist/packages/mcp`
108
+
109
+ `nx.json` fija `nx-release-publish.packageRoot =
110
+ "dist/packages/{projectName}"`, y `tools/scripts/publish.mjs` hace `chdir`
111
+ al primer `build.outputs` del proyecto antes de `npm publish`.
112
+ `project.json` de este paquete declara
113
+ `build.outputs: ["{workspaceRoot}/dist/packages/mcp"]` precisamente para
114
+ encajar en ese contrato **sin modificar** `publish.mjs` — la alternativa
115
+ (publicar desde `packages/mcp`, como hace el blueprint de BHD) exigiría un
116
+ override del publish script y versionar `dist/` en git.
117
+
118
+ ## 3. El resolutor de 3 fallbacks (`data.ts`)
119
+
120
+ `src/lib/data.ts#resolveSnapshotPath` no puede usar
121
+ `new URL('../../data/…', import.meta.url)` a secas (el truco de BHD) porque
122
+ la ruta relativa entre el módulo compilado y `data/` **cambia** según dónde
123
+ corra el código:
124
+
125
+ 1. `process.env.NG_SOLID_MCP_DATA` — override explícito (tests, debugging).
126
+ 2. `../data/<fichero>` relativo al propio módulo — layout publicado:
127
+ `dist/packages/mcp/lib/data.js` → `dist/packages/mcp/data/<fichero>`.
128
+ 3. `../../data/<fichero>` — layout de desarrollo:
129
+ `packages/mcp/src/lib/data.ts` → `packages/mcp/data/<fichero>`.
130
+
131
+ Gana el primer candidato para el que `existsSync` es verdadero; si ninguno
132
+ existe, lanza un error listando las tres rutas probadas (nunca falla en
133
+ silencio). `src/lib/install-skills.ts#resolveSkillsSourceDir` replica
134
+ exactamente la misma cadena para `data/skills/`, y
135
+ `GuideDoc.skillPath` (`data/skills/<name>/SKILL.md`, relativo a la raíz del
136
+ paquete) es lo que `resources.ts`'s `ns://skill/{slug}` resuelve con la
137
+ misma lógica de dos niveles (`../` publicado, `../../` dev) — **no** apunta
138
+ al `SKILL.md` autoral bajo `skills/`, que puede tener marcadores sin
139
+ resolver.
140
+
141
+ ## 4. El guardarraíl de `transpileModule` en `extract-tokens.mjs`
142
+
143
+ `extract-tokens.mjs` no reimplementa `flattenTokens` /
144
+ `tokenPathToCssVariable` / `validateNsPreset`: los importa **en caliente**
145
+ desde el código de producción, transpilando `theme.utils.ts` y
146
+ `arvisfy.preset.ts` con `ts.transpileModule(...)` y cargando el resultado
147
+ vía `import('data:text/javascript;base64,' + …)`. Esto sólo es seguro
148
+ porque ambos ficheros hoy únicamente tienen imports **de tipo**
149
+ (`import type` o imports erasados por `isolatedModules`); un import de
150
+ **valor** (por ejemplo, si `arvisfy.preset.ts` empezara a importar una
151
+ utilidad en runtime) rompería el resultado transpilado, porque ese import
152
+ no puede resolverse desde un data URI.
153
+
154
+ El prebuild debe detectar un import de valor en esos ficheros y abortar con
155
+ un mensaje explícito en vez de producir un snapshot silenciosamente
156
+ incorrecto. Si eso ocurre, el fallback documentado es dejar de transpilar en
157
+ memoria y ejecutar Node directamente sobre TypeScript con
158
+ `node --experimental-strip-types`, aceptando que entonces sólo se admiten
159
+ anotaciones de tipo _erasables_ (sin decoradores, sin enums no-const) en
160
+ esos dos ficheros.
161
+
162
+ ## 5. Skills: fuente única, dos vehículos, un solo punto de interpolación
163
+
164
+ `packages/mcp/skills/<name>/SKILL.md` es la única fuente de verdad para:
165
+
166
+ 1. **`guides` en el snapshot** (`list_guides`/`get_guide`, resource
167
+ `ns://guide/{slug}`).
168
+ 2. **Los ficheros distribuibles** que copia `install-skills` (resource
169
+ `ns://skill/{slug}` sirve el mismo fichero).
170
+
171
+ Cada `SKILL.md` es front-matter mínimo (`name`, `description` — sin
172
+ dependencia de YAML, parseo manual de esas dos claves en
173
+ `extract-guides.mjs`) más un cuerpo Markdown troceado por headings `## ` en
174
+ `sections: [{ id: slugify(title), title, content }]`.
175
+
176
+ ### Marcadores de datos vivos
177
+
178
+ Un `SKILL.md` puede embeber `<!-- ns:<marcador> -->` en cualquier punto del
179
+ cuerpo; `extract-guides.mjs` los reemplaza con datos derivados de los mismos
180
+ extractores que alimentan el resto del snapshot, para que la skill nunca
181
+ pueda desincronizarse del código real:
182
+
183
+ | Marcador | Contenido |
184
+ | ---------------------------- | --------------------------------------------------------------------------------------------- |
185
+ | `<!-- ns:component-list -->` | Tabla markdown de todos los componentes públicos (selector, clase, familia, categoría) |
186
+ | `<!-- ns:icon-count -->` | El conteo real de `NS_ICON_COUNT` + licencia |
187
+ | `<!-- ns:versions -->` | Versiones publicadas de `@ng-solid/design-system` / `@ng-solid/icons` + rango peer de Angular |
188
+ | `<!-- ns:token-count -->` | Conteo de tokens por tier + número de grupos de componente |
189
+ | `<!-- ns:form-controls -->` | Tabla de los controles `ControlValueAccessor` públicos bajo `form/`, con sus inputs propios |
190
+
191
+ Un marcador desconocido (typo) hace que `extract-guides.mjs` lance una
192
+ excepción — falla el build en vez de publicar un comentario HTML literal.
193
+
194
+ ### Dónde se materializa la interpolación (decisión de diseño)
195
+
196
+ `extract-guides.mjs` es **puro**: no escribe a disco, sólo devuelve
197
+ `{ guides, resolvedFiles }` (`resolvedFiles` es un `Map<"<name>/SKILL.md",
198
+ string>` con el markdown ya resuelto). `scripts/prebuild.mjs` decide qué
199
+ hacer con eso:
200
+
201
+ - `guides` se embebe directamente en `data/design-system.json` — así
202
+ `list_guides`/`get_guide` no tocan el filesystem en runtime, sólo leen el
203
+ snapshot ya cargado en memoria.
204
+ - `resolvedFiles` se escribe, uno por skill, en
205
+ `data/skills/<name>/SKILL.md` — **regenerando el directorio completo en
206
+ cada build** (`rmSync` + recreación) para que una skill renombrada o
207
+ eliminada nunca deje un fichero huérfano.
208
+
209
+ `install-skills` copia siempre desde `data/skills/`, nunca desde `skills/`
210
+ directamente — así el consumidor final recibe el mismo markdown, con los
211
+ marcadores ya resueltos, sin importar si llegó por MCP (`get_guide`,
212
+ `ns://guide/{slug}`, `ns://skill/{slug}`) o por fichero
213
+ (`install-skills`). El directorio autoral `skills/` (con marcadores sin
214
+ resolver) también viaja en el tarball npm porque `postbuild.mjs` lo copia
215
+ tal cual a `dist/packages/mcp/skills/` — eso es intencional (permite
216
+ inspeccionar la fuente), pero ningún tool ni el comando `install-skills`
217
+ deben leer de ahí.
218
+
219
+ ### Gobierno: no se duplican en `.agents/skills/` de este repo
220
+
221
+ `.agents/skills/local-package-publish/` es workflow **interno** del
222
+ workspace (cómo publicar un paquete cambiado a Verdaccio); no tiene
223
+ relación con el design system. `packages/mcp/skills/` es **producto**: lo
224
+ que un consumidor externo instala con `install-skills`. No mezclar ambos
225
+ directorios ni copiar contenido de uno a otro.
226
+
227
+ ## 6. Superficie MCP (32 tools, 10 resources, 6 prompts)
228
+
229
+ Ver el detalle completo, agrupado, en el [`README.md`](./README.md#tools-por-grupo-32).
230
+ Convenciones que aplican a toda la superficie:
231
+
232
+ - Todo output que incluya markup respeta el invariante de standalone:
233
+ `selector` + `importStatement` + `imports: [NsXComponent]` siempre juntos
234
+ (`get_component_import`, `generate_component_template`,
235
+ `export_component_docs`).
236
+ - Los resources usan el namespace `ns://` (nunca `bhd://`, que era el del
237
+ blueprint): `component/{selector}`, `component/{selector}/markdown`,
238
+ `guide/{slug}`, `skill/{slug}`, `tokens/{tier}`,
239
+ `tokens/component/{group}`, `preset/arvisfy`, `icons/catalog`,
240
+ `contract/style`, `snapshot/stats`.
241
+ - Los prompts (`build_ns_ui`, `review_ns_usage`, `choose_ns_component`,
242
+ `build_ns_form`, `theme_ns_app`, `migrate_to_ns`) comparten un bloque de
243
+ invariantes no negociables (entrypoint único, `imports` obligatorio, BEM
244
+ sin Tailwind en markup, valores de union cerrados, `--ns-component-*`
245
+ únicamente, `provideNsTheme` una sola vez) y terminan pidiendo al agente
246
+ que valide su propio resultado con `validate_component_usage`/
247
+ `validate_style_contract` antes de darlo por terminado.
248
+
249
+ ## 7. Cómo agregar o mejorar una guía
250
+
251
+ 1. Edita el `SKILL.md` correspondiente bajo `packages/mcp/skills/<name>/` —
252
+ nunca escribas markdown de guía a mano en TypeScript.
253
+ 2. Si necesitas un dato vivo nuevo, añade un `MARKER_BUILDERS['mi-marcador']`
254
+ en `extract-guides.mjs` y documenta el marcador en la tabla de la
255
+ sección 5 de esta guía.
256
+ 3. Regenera y valida:
257
+
258
+ ```bash
259
+ pnpm exec nx run mcp:build-data
260
+ pnpm exec nx run mcp:check-data
261
+ ```
262
+
263
+ 4. Si es una skill completamente nueva, crea el directorio
264
+ `packages/mcp/skills/<name>/SKILL.md` con front-matter `name`/`description`
265
+ (el `name` debe coincidir con el nombre del directorio — `extract-guides.mjs`
266
+ lo valida y falla si no coinciden) y al menos una sección `## `.
267
+
268
+ ## 8. Cómo agregar una tool/resource/prompt nuevos
269
+
270
+ No es responsabilidad de esta guía duplicar las convenciones de
271
+ `src/lib/tools*.ts`/`resources.ts`/`prompts.ts` (ver esos ficheros
272
+ directamente), pero en resumen:
273
+
274
+ - Reusa `loadSnapshot()`/`loadIcons()` de `data.ts`; no leas `data/*.json`
275
+ por tu cuenta.
276
+ - Da errores accionables con sugerencias (ver `resolveComponent`/
277
+ `resolveGuide` en `tools.components.ts`/`tools.guides.ts`) en vez de un
278
+ simple "not found".
279
+ - No dupliques snapshot completo en una respuesta si un subconjunto basta.
280
+ - Mantén los nombres de tools/resources/prompts estables una vez publicados
281
+ — un cliente MCP puede tenerlos cacheados.
282
+
283
+ ## 9. Publicación — configurada, no ejecutada en esta tanda
284
+
285
+ ```bash
286
+ pnpm exec nx run mcp:publish:local # build + bump patch + publish a Verdaccio (localhost:4873)
287
+ pnpm view @ng-solid/mcp version --registry=http://localhost:4873
288
+ ```
289
+
290
+ Antes del primer publish real, `pnpm pack --dry-run` desde
291
+ `dist/packages/mcp` confirma que `data/**` y `skills/**` viajan en el
292
+ tarball (ambos están en `files` de `package.json`).
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # @ng-solid/mcp
2
+
3
+ Servidor [MCP](https://modelcontextprotocol.io) que expone por stdio un snapshot
4
+ generado en build del design system Arvisfy (`@ng-solid/design-system` +
5
+ `@ng-solid/icons`): componentes (props/eventos/modelos, con herencia
6
+ resuelta), tokens de tema con resolución de contraste `light`/`dark`,
7
+ servicios, providers, el catálogo de 1790 iconos Lucide, el contrato de
8
+ estilos y 6 guías de uso. Pensado para que un agente de IA que consuma
9
+ `@ng-solid/design-system` en un proyecto externo trabaje con la API real en
10
+ vez de inventarla — ver la arquitectura completa y el pipeline de datos en
11
+ [`GUIDE.md`](./GUIDE.md).
12
+
13
+ > **Estado de publicación**: este paquete todavía no se publica a npm público
14
+ > ni a Verdaccio (ver `GUIDE.md` § publicación). Los bloques de configuración
15
+ > de abajo describen el consumo objetivo una vez publicado
16
+ > (`npx -y @ng-solid/mcp`); mientras tanto, usa el build local — ver
17
+ > "Desarrollo local" más abajo, o el `.mcp.json` en la raíz de este
18
+ > monorepo, que ya apunta a `dist/packages/mcp/index.js` para dogfooding.
19
+
20
+ ## Instalación por cliente MCP
21
+
22
+ ### Claude Code
23
+
24
+ ```bash
25
+ claude mcp add ng-solid -- npx -y @ng-solid/mcp
26
+ ```
27
+
28
+ O en `.mcp.json` (raíz del proyecto consumidor):
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "ng-solid": {
34
+ "command": "npx",
35
+ "args": ["-y", "@ng-solid/mcp"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ### OpenAI Codex
42
+
43
+ ```bash
44
+ codex mcp add ng-solid -- npx -y @ng-solid/mcp
45
+ ```
46
+
47
+ O en `~/.codex/config.toml`:
48
+
49
+ ```toml
50
+ [mcp_servers.ng-solid]
51
+ command = "npx"
52
+ args = ["-y", "@ng-solid/mcp"]
53
+ ```
54
+
55
+ ### Cursor
56
+
57
+ Crea o edita `.cursor/mcp.json`:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "ng-solid": {
63
+ "command": "npx",
64
+ "args": ["-y", "@ng-solid/mcp"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### VS Code
71
+
72
+ 1. Paleta de comandos (`Cmd+Shift+P` / `Ctrl+Shift+P`) → `MCP: Add Server`.
73
+ 2. Selecciona `Command (stdio)`.
74
+ 3. Comando: `npx`. Argumentos: `-y @ng-solid/mcp`.
75
+ 4. Nombre del servidor: `ng-solid`.
76
+
77
+ O edita `.vscode/mcp.json`:
78
+
79
+ ```json
80
+ {
81
+ "servers": {
82
+ "ng-solid": {
83
+ "command": "npx",
84
+ "args": ["-y", "@ng-solid/mcp"]
85
+ }
86
+ }
87
+ }
88
+ ```
89
+
90
+ ## `install-skills` — distribuir las guías como ficheros
91
+
92
+ El mismo binario copia las 6 guías (`packages/mcp/skills/*/SKILL.md`,
93
+ ya resueltas — sin marcadores `<!-- ns:… -->` pendientes) a un directorio de
94
+ skills local, útil para agentes que leen ficheros `SKILL.md` en vez de
95
+ consultar el MCP por stdio:
96
+
97
+ ```bash
98
+ npx -y @ng-solid/mcp install-skills # copia a ./.agents/skills/
99
+ npx -y @ng-solid/mcp install-skills --list # lista las skills sin copiar
100
+ npx -y @ng-solid/mcp install-skills --dir ./docs/skills --force
101
+ ```
102
+
103
+ - `--dir <ruta>` — directorio destino (default `./.agents/skills`).
104
+ - `--list` — enumera las skills disponibles sin copiar nada.
105
+ - `--force` — sobreescribe skills ya presentes en el destino; sin ella, una
106
+ skill existente se salta con un aviso.
107
+
108
+ ## Tools por grupo (32)
109
+
110
+ **Descubrimiento** — `list_components`, `get_component`,
111
+ `search_components`, `search_all`, `suggest_component`,
112
+ `get_related_components`, `get_categories`.
113
+
114
+ **API de componentes** — `get_component_api`, `get_component_import`,
115
+ `generate_component_template`, `get_usage_example`, `export_component_docs`.
116
+
117
+ **Formularios** — `get_form_control_contract`, `list_form_controls`.
118
+
119
+ **Servicios y providers** — `list_services`, `get_service`, `get_provider`.
120
+
121
+ **Tokens/tema** — `get_component_tokens`, `list_theme_tokens`,
122
+ `resolve_token`, `get_token_scope`, `validate_theme_preset`,
123
+ `get_token_drift`.
124
+
125
+ **Contrato de estilos** — `get_style_contract`, `validate_style_contract`,
126
+ `validate_component_usage`.
127
+
128
+ **Iconos** — `search_icons`, `get_icon`, `get_icons_setup`.
129
+
130
+ **Guías/meta** — `list_guides`, `get_guide`, `get_version_info`.
131
+
132
+ ## Resources y prompts
133
+
134
+ Ver el detalle de URIs `ns://…` y de los prompts (`build_ns_ui`,
135
+ `review_ns_usage`, `choose_ns_component`, `build_ns_form`, `theme_ns_app`,
136
+ `migrate_to_ns`) en [`GUIDE.md`](./GUIDE.md).
137
+
138
+ ## Desarrollo local
139
+
140
+ Desde la raíz del monorepo:
141
+
142
+ ```bash
143
+ pnpm exec nx run mcp:build # prebuild + tsc + postbuild -> dist/packages/mcp
144
+ node dist/packages/mcp/index.js # servidor por stdio
145
+ ```
146
+
147
+ Regenerar sólo el snapshot de datos:
148
+
149
+ ```bash
150
+ pnpm exec nx run mcp:build-data # escribe packages/mcp/data/*.json y data/skills/
151
+ pnpm exec nx run mcp:check-data # falla si el snapshot en disco quedó desactualizado
152
+ ```
153
+
154
+ Inspector MCP contra el build compilado:
155
+
156
+ ```bash
157
+ cd packages/mcp
158
+ pnpm run inspect
159
+ ```