@savvy-web/mcp 0.2.0 → 0.3.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/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # @savvy-web/mcp
2
+
3
+ [![npm](https://img.shields.io/npm/v/@savvy-web%2Fmcp?label=npm&color=cb3837)](https://www.npmjs.com/package/@savvy-web/mcp)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-4caf50.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ The `savvy-mcp` [Model Context Protocol](https://modelcontextprotocol.io/) server. It serves [Silk Suite](https://github.com/savvy-web/systems) tooling and library knowledge to coding agents as structured tools and a curated documentation corpus, so an agent can read workspace facts and Silk docs instead of parsing console output or guessing.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install --save-dev @savvy-web/mcp
12
+ # or
13
+ pnpm add -D @savvy-web/mcp
14
+ ```
15
+
16
+ The Silk Suite Claude Code plugins spawn this server for you, so you rarely install it directly. Installing [`@savvy-web/silk`](https://www.npmjs.com/package/@savvy-web/silk) also brings it in.
17
+
18
+ ## Quick start
19
+
20
+ The server speaks MCP over stdio and is meant to be spawned by an MCP client. A client declares it like this:
21
+
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "savvy-mcp": {
26
+ "command": "savvy-mcp",
27
+ "args": ["."]
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ The single positional argument is the project directory; if omitted, the server resolves it from `SAVVY_MCP_PROJECT_DIR`, then `CLAUDE_PROJECT_DIR`, then the current working directory.
34
+
35
+ To exercise it by hand during development, run it through the MCP inspector:
36
+
37
+ ```bash
38
+ npx @modelcontextprotocol/inspector savvy-mcp .
39
+ # opens the inspector UI against a live savvy-mcp instance
40
+ ```
41
+
42
+ ## Tools
43
+
44
+ - `workspace_info` — returns a flat, structured projection of the workspace analysis: linked and fixed package groups as name arrays plus resolved registry targets. Backed by the same `silk-effects` analyzer the `savvy` CLI uses.
45
+ - `silk_docs_search` — ranks documents in the corpus against a plain keyword or phrase query and returns hits with a normalized confidence score plus a high/medium/low label. It never returns empty: when nothing matches, it falls back to the priority-ordered top results.
46
+
47
+ ## Resources
48
+
49
+ The server exposes a curated markdown corpus behind the `silk://` URI scheme:
50
+
51
+ - `silk://catalog` — a single fixed resource listing every document grouped by tier with a "load when …" hint. The agent's mandated first read.
52
+ - `silk://{+path}` — a template resolving any document by its stable id, covering Silk development standards (`silk://standards/<topic>`), per-package API and usage docs (`silk://packages/<pkg>/<topic>`) and conceptual guides (`silk://guides/<slug>`).
53
+
54
+ Per-package API-reference docs under `silk://packages/<pkg>/api/*` are generated from API Extractor models and shipped with the package.
55
+
56
+ ## License
57
+
58
+ [MIT](LICENSE)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@savvy-web/mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "The savvy MCP server — Silk Suite tooling and library knowledge for coding agents",
6
6
  "homepage": "https://github.com/savvy-web/systems/tree/main/packages/mcp",
@@ -33,6 +33,7 @@
33
33
  "!tsconfig.json",
34
34
  "!tsdoc.json",
35
35
  "547.js",
36
+ "README.md",
36
37
  "bin/savvy-mcp.js",
37
38
  "index.d.ts",
38
39
  "index.js",
@@ -20,7 +20,7 @@
20
20
  "packages/rslib-builder/overview"
21
21
  ],
22
22
  "uri": "silk://guides/api-docs-from-api-extractor",
23
- "lastModified": "2026-06-02T07:25:00Z"
23
+ "lastModified": "2026-06-03T00:56:24-04:00"
24
24
  },
25
25
  {
26
26
  "id": "guides/building-a-github-action",
@@ -42,7 +42,7 @@
42
42
  "standards/api-model-pipeline"
43
43
  ],
44
44
  "uri": "silk://guides/building-a-github-action",
45
- "lastModified": "2026-06-02T07:25:00Z"
45
+ "lastModified": "2026-06-03T00:56:24-04:00"
46
46
  },
47
47
  {
48
48
  "id": "guides/choosing-a-builder",
@@ -62,7 +62,7 @@
62
62
  "packages/rslib-builder/overview"
63
63
  ],
64
64
  "uri": "silk://guides/choosing-a-builder",
65
- "lastModified": "2026-06-02T07:25:00Z"
65
+ "lastModified": "2026-06-03T00:56:24-04:00"
66
66
  },
67
67
  {
68
68
  "id": "guides/llm-friendly-json-schemas",
@@ -82,7 +82,7 @@
82
82
  "packages/mcp/resource-taxonomy"
83
83
  ],
84
84
  "uri": "silk://guides/llm-friendly-json-schemas",
85
- "lastModified": "2026-06-02T07:25:00Z"
85
+ "lastModified": "2026-06-03T00:56:24-04:00"
86
86
  },
87
87
  {
88
88
  "id": "packages/cli/command-tree",
@@ -103,7 +103,7 @@
103
103
  "packages/silk/install-and-setup"
104
104
  ],
105
105
  "uri": "silk://packages/cli/command-tree",
106
- "lastModified": "2026-06-02T07:25:00Z"
106
+ "lastModified": "2026-06-03T00:56:24-04:00"
107
107
  },
108
108
  {
109
109
  "id": "packages/cli/init-and-check",
@@ -125,7 +125,7 @@
125
125
  "packages/silk/install-and-setup"
126
126
  ],
127
127
  "uri": "silk://packages/cli/init-and-check",
128
- "lastModified": "2026-06-02T07:25:00Z"
128
+ "lastModified": "2026-06-03T00:56:24-04:00"
129
129
  },
130
130
  {
131
131
  "id": "packages/mcp/resource-taxonomy",
@@ -145,7 +145,7 @@
145
145
  "packages/silk-effects/"
146
146
  ],
147
147
  "uri": "silk://packages/mcp/resource-taxonomy",
148
- "lastModified": "2026-06-02T07:25:00Z"
148
+ "lastModified": "2026-06-03T00:56:24-04:00"
149
149
  },
150
150
  {
151
151
  "id": "packages/rslib-builder/overview",
@@ -166,7 +166,7 @@
166
166
  "standards/publishability"
167
167
  ],
168
168
  "uri": "silk://packages/rslib-builder/overview",
169
- "lastModified": "2026-06-02T07:25:00Z"
169
+ "lastModified": "2026-06-03T00:56:24-04:00"
170
170
  },
171
171
  {
172
172
  "id": "packages/silk/export-map",
@@ -186,7 +186,7 @@
186
186
  "packages/silk/install-and-setup"
187
187
  ],
188
188
  "uri": "silk://packages/silk/export-map",
189
- "lastModified": "2026-06-02T07:25:00Z"
189
+ "lastModified": "2026-06-03T00:56:24-04:00"
190
190
  },
191
191
  {
192
192
  "id": "packages/silk/install-and-setup",
@@ -208,7 +208,7 @@
208
208
  "packages/cli/init-and-check"
209
209
  ],
210
210
  "uri": "silk://packages/silk/install-and-setup",
211
- "lastModified": "2026-06-02T07:25:00Z"
211
+ "lastModified": "2026-06-03T00:56:24-04:00"
212
212
  },
213
213
  {
214
214
  "id": "packages/silk-effects/",
@@ -231,7 +231,7 @@
231
231
  "standards/publishability"
232
232
  ],
233
233
  "uri": "silk://packages/silk-effects/",
234
- "lastModified": "2026-06-02T07:25:00Z"
234
+ "lastModified": "2026-06-03T00:56:24-04:00"
235
235
  },
236
236
  {
237
237
  "id": "packages/silk-effects/managed-section",
@@ -253,7 +253,7 @@
253
253
  "packages/silk-effects/platform-layers"
254
254
  ],
255
255
  "uri": "silk://packages/silk-effects/managed-section",
256
- "lastModified": "2026-06-02T07:25:00Z"
256
+ "lastModified": "2026-06-03T00:56:24-04:00"
257
257
  },
258
258
  {
259
259
  "id": "packages/silk-effects/platform-layers",
@@ -275,7 +275,7 @@
275
275
  "packages/silk-effects/managed-section"
276
276
  ],
277
277
  "uri": "silk://packages/silk-effects/platform-layers",
278
- "lastModified": "2026-06-02T07:25:00Z"
278
+ "lastModified": "2026-06-03T00:56:24-04:00"
279
279
  },
280
280
  {
281
281
  "id": "standards/api-model-pipeline",
@@ -296,7 +296,7 @@
296
296
  "packages/mcp/resource-taxonomy"
297
297
  ],
298
298
  "uri": "silk://standards/api-model-pipeline",
299
- "lastModified": "2026-06-02T07:25:00Z"
299
+ "lastModified": "2026-06-03T00:56:24-04:00"
300
300
  },
301
301
  {
302
302
  "id": "standards/catalog-usage",
@@ -317,7 +317,7 @@
317
317
  "standards/publishability"
318
318
  ],
319
319
  "uri": "silk://standards/catalog-usage",
320
- "lastModified": "2026-06-02T07:25:00Z"
320
+ "lastModified": "2026-06-03T00:56:24-04:00"
321
321
  },
322
322
  {
323
323
  "id": "standards/changeset-discipline",
@@ -339,7 +339,7 @@
339
339
  "standards/publishability"
340
340
  ],
341
341
  "uri": "silk://standards/changeset-discipline",
342
- "lastModified": "2026-06-02T07:25:00Z"
342
+ "lastModified": "2026-06-03T00:56:24-04:00"
343
343
  },
344
344
  {
345
345
  "id": "standards/changeset-format",
@@ -359,7 +359,7 @@
359
359
  "standards/changeset-discipline"
360
360
  ],
361
361
  "uri": "silk://standards/changeset-format",
362
- "lastModified": "2026-06-02T07:25:00Z"
362
+ "lastModified": "2026-06-03T00:56:24-04:00"
363
363
  },
364
364
  {
365
365
  "id": "standards/commit-contract",
@@ -381,7 +381,7 @@
381
381
  "standards/changeset-discipline"
382
382
  ],
383
383
  "uri": "silk://standards/commit-contract",
384
- "lastModified": "2026-06-02T07:25:00Z"
384
+ "lastModified": "2026-06-03T00:56:24-04:00"
385
385
  },
386
386
  {
387
387
  "id": "standards/dependency-conventions",
@@ -402,7 +402,7 @@
402
402
  "standards/catalog-usage"
403
403
  ],
404
404
  "uri": "silk://standards/dependency-conventions",
405
- "lastModified": "2026-06-02T07:25:00Z"
405
+ "lastModified": "2026-06-03T00:56:24-04:00"
406
406
  },
407
407
  {
408
408
  "id": "standards/linting-conventions",
@@ -422,7 +422,7 @@
422
422
  "standards/test-classification"
423
423
  ],
424
424
  "uri": "silk://standards/linting-conventions",
425
- "lastModified": "2026-06-02T07:25:00Z"
425
+ "lastModified": "2026-06-03T00:56:24-04:00"
426
426
  },
427
427
  {
428
428
  "id": "standards/publishability",
@@ -443,7 +443,7 @@
443
443
  "standards/catalog-usage"
444
444
  ],
445
445
  "uri": "silk://standards/publishability",
446
- "lastModified": "2026-06-02T07:25:00Z"
446
+ "lastModified": "2026-06-03T00:56:24-04:00"
447
447
  },
448
448
  {
449
449
  "id": "standards/semver",
@@ -463,7 +463,7 @@
463
463
  "standards/changeset-discipline"
464
464
  ],
465
465
  "uri": "silk://standards/semver",
466
- "lastModified": "2026-06-02T07:25:00Z"
466
+ "lastModified": "2026-06-03T00:56:24-04:00"
467
467
  },
468
468
  {
469
469
  "id": "standards/test-classification",
@@ -483,7 +483,7 @@
483
483
  "standards/linting-conventions"
484
484
  ],
485
485
  "uri": "silk://standards/test-classification",
486
- "lastModified": "2026-06-02T07:25:00Z"
486
+ "lastModified": "2026-06-03T00:56:24-04:00"
487
487
  }
488
488
  ]
489
489
  }
@@ -23,8 +23,10 @@ Both orchestrators sequence the three per-tool handlers and short-circuit on the
23
23
  first failure. They live at `src/commands/init.ts` and `src/commands/check.ts`. The
24
24
  per-tool handlers are injected rather than imported inline, so the orchestration
25
25
  logic — the sequencing and short-circuit — is unit-testable without standing up the
26
- full runtime. Per-tool `init` and `check` stay reachable under their namespaces
27
- (`savvy changeset init`, `savvy lint check`, and so on).
26
+ full runtime. There is no per-tool setup or validation entry point: `savvy init`
27
+ and `savvy check` are the only ones. The namespaced groups expose the remaining
28
+ per-tool operations instead (`savvy changeset lint`, `savvy lint fmt`,
29
+ `savvy commit hook ...`, and so on).
28
30
 
29
31
  ## Layer
30
32
 
@@ -128,4 +128,5 @@ commits to changelog entries.
128
128
  The discipline rules governing when a changeset is required are at
129
129
  `silk://standards/changeset-discipline`. The `changeset-style` Claude Code skill
130
130
  carries worked examples for all three content-depth tiers. The `changeset-check`
131
- skill validates files against CSH001–CSH005 via `savvy changeset check`.
131
+ skill validates files against CSH001–CSH005 via `savvy changeset lint` (or
132
+ `savvy changeset validate-file <file>` for a single file).