@wootsup/yt-builder-mcp 1.2.0 → 1.4.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 +16 -12
- package/dist/catalog/build-catalog.d.ts +63 -0
- package/dist/catalog/build-catalog.d.ts.map +1 -0
- package/dist/catalog/build-catalog.js +166 -0
- package/dist/catalog/build-catalog.js.map +1 -0
- package/dist/cli/doctor-command.d.ts +21 -0
- package/dist/cli/doctor-command.d.ts.map +1 -0
- package/dist/cli/doctor-command.js +111 -0
- package/dist/cli/doctor-command.js.map +1 -0
- package/dist/cli/invocation-decision.d.ts.map +1 -1
- package/dist/cli/invocation-decision.js +2 -0
- package/dist/cli/invocation-decision.js.map +1 -1
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -1
- package/dist/diagnostics/ca-trust.d.ts +16 -0
- package/dist/diagnostics/ca-trust.d.ts.map +1 -0
- package/dist/diagnostics/ca-trust.js +54 -0
- package/dist/diagnostics/ca-trust.js.map +1 -0
- package/dist/diagnostics/diagnose-network-error.d.ts +37 -0
- package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -0
- package/dist/diagnostics/diagnose-network-error.js +158 -0
- package/dist/diagnostics/diagnose-network-error.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +62 -0
- package/dist/diagnostics/doctor.d.ts.map +1 -0
- package/dist/diagnostics/doctor.js +165 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/gateway/advanced-read-tool.d.ts +37 -0
- package/dist/gateway/advanced-read-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-read-tool.js +156 -0
- package/dist/gateway/advanced-read-tool.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +18 -3
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/domains.js +28 -9
- package/dist/gateway/advanced-tool/domains.js.map +1 -1
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/register.js +43 -11
- package/dist/gateway/advanced-tool/register.js.map +1 -1
- package/dist/gateway/essentials.d.ts +14 -4
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +46 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/gateway/test-support.d.ts +2 -2
- package/dist/gateway/test-support.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +1 -1
- package/dist/install-skill.js +2 -2
- package/dist/net/extra-headers.d.ts +66 -0
- package/dist/net/extra-headers.d.ts.map +1 -0
- package/dist/net/extra-headers.js +164 -0
- package/dist/net/extra-headers.js.map +1 -0
- package/dist/net/internal-host.d.ts +45 -0
- package/dist/net/internal-host.d.ts.map +1 -0
- package/dist/net/internal-host.js +164 -0
- package/dist/net/internal-host.js.map +1 -0
- package/dist/net/proxy-dispatcher.d.ts +40 -0
- package/dist/net/proxy-dispatcher.d.ts.map +1 -0
- package/dist/net/proxy-dispatcher.js +65 -0
- package/dist/net/proxy-dispatcher.js.map +1 -0
- package/dist/proxy/bridge.d.ts +43 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +155 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/mode.d.ts +10 -0
- package/dist/proxy/mode.d.ts.map +1 -0
- package/dist/proxy/mode.js +20 -0
- package/dist/proxy/mode.js.map +1 -0
- package/dist/server.d.ts +5 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -3
- package/dist/server.js.map +1 -1
- package/dist/setup-ca-env.d.ts +40 -0
- package/dist/setup-ca-env.d.ts.map +1 -0
- package/dist/setup-ca-env.js +58 -0
- package/dist/setup-ca-env.js.map +1 -0
- package/dist/setup-ca-reprobe.d.ts +38 -0
- package/dist/setup-ca-reprobe.d.ts.map +1 -0
- package/dist/setup-ca-reprobe.js +68 -0
- package/dist/setup-ca-reprobe.js.map +1 -0
- package/dist/setup-cli.d.ts +37 -2
- package/dist/setup-cli.d.ts.map +1 -1
- package/dist/setup-cli.js +178 -4
- package/dist/setup-cli.js.map +1 -1
- package/dist/setup-npx-spec.d.ts +44 -0
- package/dist/setup-npx-spec.d.ts.map +1 -0
- package/dist/setup-npx-spec.js +66 -0
- package/dist/setup-npx-spec.js.map +1 -0
- package/dist/setup-prompts.d.ts +14 -1
- package/dist/setup-prompts.d.ts.map +1 -1
- package/dist/setup-prompts.js +53 -1
- package/dist/setup-prompts.js.map +1 -1
- package/dist/setup-wizard-defaults.d.ts.map +1 -1
- package/dist/setup-wizard-defaults.js +29 -5
- package/dist/setup-wizard-defaults.js.map +1 -1
- package/dist/setup-wizard-handshake.d.ts +4 -4
- package/dist/setup-wizard-handshake.d.ts.map +1 -1
- package/dist/setup-wizard-handshake.js +46 -12
- package/dist/setup-wizard-handshake.js.map +1 -1
- package/dist/setup-wizard-types.d.ts +81 -0
- package/dist/setup-wizard-types.d.ts.map +1 -1
- package/dist/setup-wizard.d.ts +2 -2
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +140 -18
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/client-pool.d.ts +8 -1
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +34 -4
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/sites/registry.d.ts +30 -0
- package/dist/sites/registry.d.ts.map +1 -1
- package/dist/sites/registry.js.map +1 -1
- package/dist/sites/store.d.ts +8 -1
- package/dist/sites/store.d.ts.map +1 -1
- package/dist/sites/store.js +17 -2
- package/dist/sites/store.js.map +1 -1
- package/dist/sites/tools/use-site.d.ts.map +1 -1
- package/dist/sites/tools/use-site.js +26 -6
- package/dist/sites/tools/use-site.js.map +1 -1
- package/dist/tools/bind-guidance.d.ts +80 -0
- package/dist/tools/bind-guidance.d.ts.map +1 -0
- package/dist/tools/bind-guidance.js +95 -0
- package/dist/tools/bind-guidance.js.map +1 -0
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +63 -13
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers-write.d.ts +19 -2
- package/dist/tools/elements/handlers-write.d.ts.map +1 -1
- package/dist/tools/elements/handlers-write.js +179 -10
- package/dist/tools/elements/handlers-write.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +8 -2
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +76 -28
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/elements/layout-hierarchy-rules.d.ts +62 -0
- package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +1 -0
- package/dist/tools/elements/layout-hierarchy-rules.js +154 -0
- package/dist/tools/elements/layout-hierarchy-rules.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +35 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +124 -1
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/health-format.d.ts +3 -0
- package/dist/tools/format/health-format.d.ts.map +1 -1
- package/dist/tools/format/health-format.js +21 -4
- package/dist/tools/format/health-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +18 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +22 -1
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +7 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/sources-format.d.ts +8 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -1
- package/dist/tools/format/sources-format.js +10 -0
- package/dist/tools/format/sources-format.js.map +1 -1
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +56 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspection.d.ts +24 -0
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +140 -41
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/layout-flatten.d.ts +11 -8
- package/dist/tools/layout-flatten.d.ts.map +1 -1
- package/dist/tools/layout-flatten.js +17 -6
- package/dist/tools/layout-flatten.js.map +1 -1
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +11 -2
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/inspect-handler.d.ts +13 -0
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +147 -3
- package/dist/tools/multi-items/inspect-handler.js.map +1 -1
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +153 -39
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +40 -5
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +404 -76
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +95 -1
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +137 -8
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/index.d.ts +1 -1
- package/dist/tools/pages/index.d.ts.map +1 -1
- package/dist/tools/pages/index.js +1 -1
- package/dist/tools/pages/index.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +74 -5
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +243 -8
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/shared-schemas.d.ts +3 -0
- package/dist/tools/shared-schemas.d.ts.map +1 -1
- package/dist/tools/shared-schemas.js +43 -13
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +93 -10
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +13 -1
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +163 -1
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +12 -1
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +103 -16
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +73 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +136 -0
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/sublayout/builders.d.ts +23 -0
- package/dist/tools/sublayout/builders.d.ts.map +1 -0
- package/dist/tools/sublayout/builders.js +54 -0
- package/dist/tools/sublayout/builders.js.map +1 -0
- package/dist/tools/sublayout/index.d.ts +13 -0
- package/dist/tools/sublayout/index.d.ts.map +1 -0
- package/dist/tools/sublayout/index.js +13 -0
- package/dist/tools/sublayout/index.js.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +95 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js +181 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +31 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +95 -4
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/dist/update/update-check.d.ts +56 -0
- package/dist/update/update-check.d.ts.map +1 -0
- package/dist/update/update-check.js +155 -0
- package/dist/update/update-check.js.map +1 -0
- package/manifest.json +1 -1
- package/package.json +5 -2
- package/skills/yt-builder-mcp/SKILL.md +148 -82
package/README.md
CHANGED
|
@@ -63,22 +63,25 @@ The wizard auto-detects and configures the following clients:
|
|
|
63
63
|
|
|
64
64
|
## Tool surface (gateway model)
|
|
65
65
|
|
|
66
|
-
The server registers **
|
|
67
|
-
of which **
|
|
66
|
+
The server registers **31 domain tools + 1 gateway = 32 reachable** tools,
|
|
67
|
+
of which **27 are advertised in `tools/list`** (well under Cursor's ~40-tool
|
|
68
68
|
cap):
|
|
69
69
|
|
|
70
70
|
- **2 direct top-level tools** (always in `tools/list`):
|
|
71
71
|
`yootheme_builder_health`, `yootheme_builder_diagnose`. The
|
|
72
72
|
"the gateway itself might be broken" escape hatch.
|
|
73
|
-
- **
|
|
74
|
-
reads and writes (`pages_list`, `pages_create`, `pages_delete`,
|
|
75
|
-
`
|
|
76
|
-
`
|
|
77
|
-
`sites_list` / `sites_test
|
|
73
|
+
- **24 essential forwarded tools** (always in `tools/list`): the most-used
|
|
74
|
+
reads and writes (`pages_list`, `pages_create`, `pages_delete`,
|
|
75
|
+
`page_dynamize`, `get_etag`, `element_list`, `element_add`,
|
|
76
|
+
`element_update_settings`, `sources_list`, `element_types_list`,
|
|
77
|
+
`inspect_multi_items_binding`, the multi-site `sites_list` / `sites_test` /
|
|
78
|
+
`use_site`, and the bind→save→publish chain `element_bind_source` /
|
|
79
|
+
`page_save` / `page_publish`, among others).
|
|
78
80
|
- **1 gateway tool** (`yootheme_builder_advanced`): exposes the remaining
|
|
79
|
-
**
|
|
80
|
-
`
|
|
81
|
-
|
|
81
|
+
**5 advanced tools** behind a single entry (`page_get_schema`,
|
|
82
|
+
`element_get_binding`, `element_unbind_source`, `clean_implode_directives`,
|
|
83
|
+
`inspect_sublayout`). Call `yootheme_builder_advanced({ tool: "<name>" })`
|
|
84
|
+
for discovery (returns the schema) or `({ tool, arguments })` to execute.
|
|
82
85
|
|
|
83
86
|
See `skills/yt-builder-mcp/SKILL.md` for the full catalog and canonical
|
|
84
87
|
workflows, and `docs/TOOL-CATALOG.md` for an auto-generated reference.
|
|
@@ -93,6 +96,7 @@ workflows, and `docs/TOOL-CATALOG.md` for an auto-generated reference.
|
|
|
93
96
|
| Elements | 7 | `element_list`, `element_get`, `element_add`, `element_update_settings`, `element_move`, `element_clone`, `element_delete` |
|
|
94
97
|
| Sources | 5 | `sources_list`, `element_get_binding`, `element_bind_source`, `element_unbind_source`, `inspect_multi_items_binding` |
|
|
95
98
|
| Inspection | 3 | `element_types_list`, `element_type_get_schema`, `clean_implode_directives` |
|
|
99
|
+
| Sublayout | 1 | `inspect_sublayout` (F154 — fragment subtree + render-time inner-grid gate; advanced/gateway-routed) |
|
|
96
100
|
| Gateway | 1 | `advanced` |
|
|
97
101
|
|
|
98
102
|
All tool names are prefixed with `yootheme_builder_` at the MCP server boundary.
|
|
@@ -113,14 +117,14 @@ Copies the bundled `skills/yootheme-builder/` folder into
|
|
|
113
117
|
other AI clients pick it up automatically.
|
|
114
118
|
|
|
115
119
|
`~/.claude/skills/` is the **universal marker path** recognised by
|
|
116
|
-
Claude Desktop and (per the same convention as `@wootsup/mcp`) other
|
|
120
|
+
Claude Desktop and (per the same convention as `@wootsup/apimapper-mcp`) other
|
|
117
121
|
AI clients that follow the `~/AGENTS.md` discovery protocol. The
|
|
118
122
|
single location keeps the skill discoverable across every supported
|
|
119
123
|
client without per-client write logic.
|
|
120
124
|
|
|
121
125
|
The skill ships with the 5 canonical workflows (build hero, bind
|
|
122
126
|
source, clone section, diagnose 401, add custom element) plus a
|
|
123
|
-
|
|
127
|
+
26-tool auto-generated catalog appendix.
|
|
124
128
|
|
|
125
129
|
## DXT bundle (Claude Desktop one-click install)
|
|
126
130
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* packages/mcp/src/catalog/build-catalog.ts — net-new (Slice 0b Task 12).
|
|
3
|
+
*
|
|
4
|
+
* Builds the machine-readable tool catalogue (SSOT for the PHP-served MCP
|
|
5
|
+
* surface). Modelled on API Mapper's
|
|
6
|
+
* `packages/apimapper-mcp/src/catalog/build-catalog.ts`, adapted to yt-builder's
|
|
7
|
+
* `buildAllTools(pool)` entrypoint:
|
|
8
|
+
*
|
|
9
|
+
* - yt-builder's tools carry `inputSchema` as a RAW Zod shape (ZodRawShape,
|
|
10
|
+
* no `_zod` marker), so `toJsonSchema` always takes the raw-shape branch
|
|
11
|
+
* (`z.object(inputSchema)`).
|
|
12
|
+
* - `tier` is derived per-name from the gateway essentials lists
|
|
13
|
+
* (`isEssential || isDirectTopLevel` ⇒ essential, else advanced). There is
|
|
14
|
+
* NO separate advanced registry to query.
|
|
15
|
+
* - The 32 catalogued tools are exactly what `buildAllTools` returns; the two
|
|
16
|
+
* top-level gateways are registered at server level (server.ts), not here.
|
|
17
|
+
*
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Convert a tool inputSchema to JSON Schema. yt-builder tools yield a RAW Zod
|
|
22
|
+
* shape (ZodRawShape) — the `_zod` guard keeps this a faithful port of the
|
|
23
|
+
* API Mapper utility, but for this server the raw-shape branch
|
|
24
|
+
* (`z.object(inputSchema)`) is the one that always fires. Native
|
|
25
|
+
* `z.toJSONSchema` (zod 4).
|
|
26
|
+
*/
|
|
27
|
+
export declare function toJsonSchema(inputSchema: unknown): object;
|
|
28
|
+
/**
|
|
29
|
+
* Post-process a generated JSON Schema for MCP-client compatibility + semantic
|
|
30
|
+
* correctness, recursively at EVERY schema node. Two structural fixes:
|
|
31
|
+
*
|
|
32
|
+
* A1 (#4): drop from a node's `required` array any property that carries a
|
|
33
|
+
* `default`. Zod `.default()` lands the key in `required` (a zod4 toJSONSchema
|
|
34
|
+
* quirk), but a field WITH a default is semantically OPTIONAL — advertising it
|
|
35
|
+
* as required makes a strict client (and the PHP gateway validator) reject a
|
|
36
|
+
* call that legitimately omits it.
|
|
37
|
+
*
|
|
38
|
+
* A2 (#1): replace an EMPTY-object `additionalProperties: {}` (what
|
|
39
|
+
* z.record(z.string(), z.unknown()) emits) with `true`. The Anthropic client
|
|
40
|
+
* rejects an empty `{}` schema for additionalProperties; `true` is the
|
|
41
|
+
* faithful "any value" equivalent. A boolean `false`
|
|
42
|
+
* (z.object().strict()) is left untouched.
|
|
43
|
+
*
|
|
44
|
+
* Recurses through every schema-bearing position zod4 emits: `properties`
|
|
45
|
+
* values, `items` (object or tuple array), an object-valued
|
|
46
|
+
* `additionalProperties`, and the `oneOf`/`anyOf`/`allOf`/`prefixItems` branch
|
|
47
|
+
* arrays.
|
|
48
|
+
*/
|
|
49
|
+
export declare function normalizeJsonSchema(node: unknown): void;
|
|
50
|
+
export interface CatalogTool {
|
|
51
|
+
name: string;
|
|
52
|
+
description: string;
|
|
53
|
+
jsonSchema: object;
|
|
54
|
+
annotations: Record<string, unknown>;
|
|
55
|
+
tier: 'essential' | 'advanced';
|
|
56
|
+
}
|
|
57
|
+
export interface Catalog {
|
|
58
|
+
version: string;
|
|
59
|
+
generatedFrom: 'zod';
|
|
60
|
+
tools: CatalogTool[];
|
|
61
|
+
}
|
|
62
|
+
export declare function buildCatalog(): Promise<Catalog>;
|
|
63
|
+
//# sourceMappingURL=build-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-catalog.d.ts","sourceRoot":"","sources":["../../src/catalog/build-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAezD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA+CvD;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC;CAClC;AACD,MAAM,WAAW,OAAO;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,KAAK,CAAC;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;CACxB;AA6BD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAiBrD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* packages/mcp/src/catalog/build-catalog.ts — net-new (Slice 0b Task 12).
|
|
3
|
+
*
|
|
4
|
+
* Builds the machine-readable tool catalogue (SSOT for the PHP-served MCP
|
|
5
|
+
* surface). Modelled on API Mapper's
|
|
6
|
+
* `packages/apimapper-mcp/src/catalog/build-catalog.ts`, adapted to yt-builder's
|
|
7
|
+
* `buildAllTools(pool)` entrypoint:
|
|
8
|
+
*
|
|
9
|
+
* - yt-builder's tools carry `inputSchema` as a RAW Zod shape (ZodRawShape,
|
|
10
|
+
* no `_zod` marker), so `toJsonSchema` always takes the raw-shape branch
|
|
11
|
+
* (`z.object(inputSchema)`).
|
|
12
|
+
* - `tier` is derived per-name from the gateway essentials lists
|
|
13
|
+
* (`isEssential || isDirectTopLevel` ⇒ essential, else advanced). There is
|
|
14
|
+
* NO separate advanced registry to query.
|
|
15
|
+
* - The 32 catalogued tools are exactly what `buildAllTools` returns; the two
|
|
16
|
+
* top-level gateways are registered at server level (server.ts), not here.
|
|
17
|
+
*
|
|
18
|
+
* @license MIT
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import { buildAllTools } from '../tools/index.js';
|
|
22
|
+
import { isEssential, isDirectTopLevel } from '../gateway/essentials.js';
|
|
23
|
+
import { SiteRegistry } from '../sites/registry.js';
|
|
24
|
+
import { ClientPool } from '../sites/client-pool.js';
|
|
25
|
+
import { PlainSecretResolver } from '../sites/secret-resolver.js';
|
|
26
|
+
/**
|
|
27
|
+
* Convert a tool inputSchema to JSON Schema. yt-builder tools yield a RAW Zod
|
|
28
|
+
* shape (ZodRawShape) — the `_zod` guard keeps this a faithful port of the
|
|
29
|
+
* API Mapper utility, but for this server the raw-shape branch
|
|
30
|
+
* (`z.object(inputSchema)`) is the one that always fires. Native
|
|
31
|
+
* `z.toJSONSchema` (zod 4).
|
|
32
|
+
*/
|
|
33
|
+
export function toJsonSchema(inputSchema) {
|
|
34
|
+
try {
|
|
35
|
+
if (inputSchema && typeof inputSchema === 'object') {
|
|
36
|
+
const isZodObject = '_zod' in inputSchema;
|
|
37
|
+
const schema = isZodObject
|
|
38
|
+
? inputSchema
|
|
39
|
+
: z.object(inputSchema);
|
|
40
|
+
const json = z.toJSONSchema(schema);
|
|
41
|
+
normalizeJsonSchema(json);
|
|
42
|
+
return json;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* malformed/unsupported shape → safe fallback */
|
|
47
|
+
}
|
|
48
|
+
return { type: 'object' };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Post-process a generated JSON Schema for MCP-client compatibility + semantic
|
|
52
|
+
* correctness, recursively at EVERY schema node. Two structural fixes:
|
|
53
|
+
*
|
|
54
|
+
* A1 (#4): drop from a node's `required` array any property that carries a
|
|
55
|
+
* `default`. Zod `.default()` lands the key in `required` (a zod4 toJSONSchema
|
|
56
|
+
* quirk), but a field WITH a default is semantically OPTIONAL — advertising it
|
|
57
|
+
* as required makes a strict client (and the PHP gateway validator) reject a
|
|
58
|
+
* call that legitimately omits it.
|
|
59
|
+
*
|
|
60
|
+
* A2 (#1): replace an EMPTY-object `additionalProperties: {}` (what
|
|
61
|
+
* z.record(z.string(), z.unknown()) emits) with `true`. The Anthropic client
|
|
62
|
+
* rejects an empty `{}` schema for additionalProperties; `true` is the
|
|
63
|
+
* faithful "any value" equivalent. A boolean `false`
|
|
64
|
+
* (z.object().strict()) is left untouched.
|
|
65
|
+
*
|
|
66
|
+
* Recurses through every schema-bearing position zod4 emits: `properties`
|
|
67
|
+
* values, `items` (object or tuple array), an object-valued
|
|
68
|
+
* `additionalProperties`, and the `oneOf`/`anyOf`/`allOf`/`prefixItems` branch
|
|
69
|
+
* arrays.
|
|
70
|
+
*/
|
|
71
|
+
export function normalizeJsonSchema(node) {
|
|
72
|
+
if (Array.isArray(node)) {
|
|
73
|
+
for (const child of node)
|
|
74
|
+
normalizeJsonSchema(child);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!node || typeof node !== 'object')
|
|
78
|
+
return;
|
|
79
|
+
const obj = node;
|
|
80
|
+
// A2: empty-object additionalProperties → true (recurse into a non-empty one).
|
|
81
|
+
if ('additionalProperties' in obj) {
|
|
82
|
+
const ap = obj.additionalProperties;
|
|
83
|
+
if (ap &&
|
|
84
|
+
typeof ap === 'object' &&
|
|
85
|
+
!Array.isArray(ap) &&
|
|
86
|
+
Object.keys(ap).length === 0) {
|
|
87
|
+
obj.additionalProperties = true;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
normalizeJsonSchema(ap);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// A1: drop default-bearing keys from THIS node's `required`.
|
|
94
|
+
const props = obj.properties;
|
|
95
|
+
if (Array.isArray(obj.required) && props && typeof props === 'object') {
|
|
96
|
+
const propMap = props;
|
|
97
|
+
const kept = obj.required.filter((key) => {
|
|
98
|
+
if (typeof key !== 'string')
|
|
99
|
+
return true;
|
|
100
|
+
const p = propMap[key];
|
|
101
|
+
return !(p && typeof p === 'object' && 'default' in p);
|
|
102
|
+
});
|
|
103
|
+
// An emptied required array is dropped (zod itself omits an empty `required`).
|
|
104
|
+
if (kept.length === 0)
|
|
105
|
+
delete obj.required;
|
|
106
|
+
else
|
|
107
|
+
obj.required = kept;
|
|
108
|
+
}
|
|
109
|
+
// Recurse into the standard schema-bearing positions.
|
|
110
|
+
if (props && typeof props === 'object') {
|
|
111
|
+
for (const v of Object.values(props)) {
|
|
112
|
+
normalizeJsonSchema(v);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if ('items' in obj)
|
|
116
|
+
normalizeJsonSchema(obj.items);
|
|
117
|
+
for (const kw of ['oneOf', 'anyOf', 'allOf', 'prefixItems']) {
|
|
118
|
+
if (kw in obj)
|
|
119
|
+
normalizeJsonSchema(obj[kw]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* One-site, in-memory, zero-IO {@link ClientPool}. Mirrors the stub
|
|
124
|
+
* `scripts/extract-tools.mjs` wires (a single `wordpress` site with an inline
|
|
125
|
+
* stub bearer), but importing the classes from `src/sites/*` rather than the
|
|
126
|
+
* compiled `dist/index.js` barrel. `buildAllTools` only reads `pool.registry`
|
|
127
|
+
* for tool registration and never resolves a bearer or hits the network at
|
|
128
|
+
* catalogue-build time.
|
|
129
|
+
*/
|
|
130
|
+
function stubPool() {
|
|
131
|
+
const stubFile = {
|
|
132
|
+
schema_version: 1,
|
|
133
|
+
default_site_id: 'build-catalog-stub',
|
|
134
|
+
sites: [
|
|
135
|
+
{
|
|
136
|
+
site_id: 'build-catalog-stub',
|
|
137
|
+
url: 'https://example.com',
|
|
138
|
+
platform: 'wordpress',
|
|
139
|
+
bearer: 'build-catalog-stub',
|
|
140
|
+
is_default: true,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
const registry = new SiteRegistry(stubFile);
|
|
145
|
+
const resolver = new PlainSecretResolver();
|
|
146
|
+
return new ClientPool(registry, resolver);
|
|
147
|
+
}
|
|
148
|
+
export async function buildCatalog() {
|
|
149
|
+
const tools = buildAllTools(stubPool()); // flat AnyToolDefinition[] — 32 entries
|
|
150
|
+
const catalogTools = tools.map((t) => ({
|
|
151
|
+
name: t.name,
|
|
152
|
+
description: t.description ?? '',
|
|
153
|
+
jsonSchema: toJsonSchema(t.inputSchema),
|
|
154
|
+
annotations: t.annotations ?? {},
|
|
155
|
+
tier: isEssential(t.name) || isDirectTopLevel(t.name) ? 'essential' : 'advanced',
|
|
156
|
+
}));
|
|
157
|
+
if (catalogTools.length === 0) {
|
|
158
|
+
throw new Error('buildCatalog produced 0 tools — registration likely failed');
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
version: process.env.npm_package_version ?? '0.0.0',
|
|
162
|
+
generatedFrom: 'zod',
|
|
163
|
+
tools: catalogTools,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=build-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-catalog.js","sourceRoot":"","sources":["../../src/catalog/build-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC7C,IAAI,CAAC;QACD,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,MAAM,IAAK,WAAuC,CAAC;YACvE,MAAM,MAAM,GAAG,WAAW;gBACtB,CAAC,CAAE,WAA4B;gBAC/B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAA4B,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAW,CAAC;YAC9C,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,iDAAiD;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO;IACX,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,+EAA+E;IAC/E,IAAI,sBAAsB,IAAI,GAAG,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,GAAG,CAAC,oBAAoB,CAAC;QACpC,IACI,EAAE;YACF,OAAO,EAAE,KAAK,QAAQ;YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EACxC,CAAC;YACC,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,6DAA6D;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,KAAgC,CAAC;QACjD,MAAM,IAAI,GAAI,GAAG,CAAC,QAAsB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACpD,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACzC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAK,CAAY,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,+EAA+E;QAC/E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;;YACtC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,sDAAsD;IACtD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC9D,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IACD,IAAI,OAAO,IAAI,GAAG;QAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAU,EAAE,CAAC;QACnE,IAAI,EAAE,IAAI,GAAG;YAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;AACL,CAAC;AAeD;;;;;;;GAOG;AACH,SAAS,QAAQ;IACb,MAAM,QAAQ,GAAG;QACb,cAAc,EAAE,CAAU;QAC1B,eAAe,EAAE,oBAAoB;QACrC,KAAK,EAAE;YACH;gBACI,OAAO,EAAE,oBAAoB;gBAC7B,GAAG,EAAE,qBAAqB;gBAC1B,QAAQ,EAAE,WAAoB;gBAC9B,MAAM,EAAE,oBAAoB;gBAC5B,UAAU,EAAE,IAAI;aACnB;SACJ;KACJ,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC3C,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,wCAAwC;IACjF,MAAM,YAAY,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QACvC,WAAW,EAAG,CAAC,CAAC,WAAuC,IAAI,EAAE;QAC7D,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;KACnF,CAAC,CAAC,CAAC;IACJ,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO;QACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO;QACnD,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,YAAY;KACtB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type DoctorDeps } from '../diagnostics/doctor.js';
|
|
2
|
+
interface ParsedDoctorArgs {
|
|
3
|
+
url?: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
}
|
|
6
|
+
/** Parse `--url <x> --token <y>` from the doctor argv tail. */
|
|
7
|
+
export declare function parseDoctorArgs(argv: readonly string[]): ParsedDoctorArgs;
|
|
8
|
+
export interface DoctorCommandDeps {
|
|
9
|
+
deps?: DoctorDeps;
|
|
10
|
+
log?: (line: string) => void;
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* `yt-builder-mcp doctor [--url <site> --token <key>]` — run the self-diagnostic
|
|
15
|
+
* and print an actionable report. Falls back to YTB_MCP_SITE_URL /
|
|
16
|
+
* YTB_MCP_BEARER_TOKEN when the flags are omitted (so it works against an
|
|
17
|
+
* already-configured server entry). Returns 0 when all critical checks pass.
|
|
18
|
+
*/
|
|
19
|
+
export declare function doctorCommand(argv: readonly string[], overrides?: DoctorCommandDeps): Promise<number>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=doctor-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-command.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAa1F,UAAU,gBAAgB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAczE;AA4DD,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB/G"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// packages/mcp/src/cli/doctor-command.ts
|
|
2
|
+
import { installGlobalProxyDispatcher } from '../net/proxy-dispatcher.js';
|
|
3
|
+
import { SERVER_VERSION } from '../server.js';
|
|
4
|
+
import { fetchLatestFromNpm } from '../update/update-check.js';
|
|
5
|
+
import { runDoctor, formatDoctorReport } from '../diagnostics/doctor.js';
|
|
6
|
+
const MCP_PACKAGE_NAME = '@wootsup/yt-builder-mcp';
|
|
7
|
+
const PROBE_TIMEOUT_MS = 8_000;
|
|
8
|
+
/** WP + Joomla health endpoints — doctor is platform-agnostic. */
|
|
9
|
+
const HEALTH_PATHS = ['/wp-json/yt-builder-mcp/v1/health', '/api/index.php/v1/yt-builder-mcp/health'];
|
|
10
|
+
const BEARER_PATHS = ['/wp-json/yt-builder-mcp/v1/etag', '/api/index.php/v1/yt-builder-mcp/etag'];
|
|
11
|
+
function joinUrl(base, path) {
|
|
12
|
+
return base.replace(/\/+$/, '') + path;
|
|
13
|
+
}
|
|
14
|
+
/** Parse `--url <x> --token <y>` from the doctor argv tail. */
|
|
15
|
+
export function parseDoctorArgs(argv) {
|
|
16
|
+
const parsed = {};
|
|
17
|
+
for (let i = 0; i < argv.length; i++) {
|
|
18
|
+
const flag = argv[i];
|
|
19
|
+
const next = argv[i + 1];
|
|
20
|
+
if (flag === '--url' && next !== undefined) {
|
|
21
|
+
parsed.url = next;
|
|
22
|
+
i++;
|
|
23
|
+
}
|
|
24
|
+
else if (flag === '--token' && next !== undefined) {
|
|
25
|
+
parsed.token = next;
|
|
26
|
+
i++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
/** Real network probes — try the WP path, then the Joomla path. */
|
|
32
|
+
function defaultDoctorDeps() {
|
|
33
|
+
return {
|
|
34
|
+
async probeHealth(url) {
|
|
35
|
+
let lastError = null;
|
|
36
|
+
for (const path of HEALTH_PATHS) {
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(joinUrl(url, path), { signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
|
|
39
|
+
if (res.ok) {
|
|
40
|
+
const body = await res.json().catch(() => ({}));
|
|
41
|
+
const pluginVersion = body !== null && typeof body === 'object' && typeof body.plugin_version === 'string'
|
|
42
|
+
? body.plugin_version
|
|
43
|
+
: undefined;
|
|
44
|
+
return { ok: true, pluginVersion };
|
|
45
|
+
}
|
|
46
|
+
lastError = { status: res.status };
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
lastError = err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { ok: false, error: lastError };
|
|
53
|
+
},
|
|
54
|
+
async probeBearer(url, token) {
|
|
55
|
+
let lastError = null;
|
|
56
|
+
let lastStatus;
|
|
57
|
+
for (const path of BEARER_PATHS) {
|
|
58
|
+
try {
|
|
59
|
+
const res = await fetch(joinUrl(url, path), {
|
|
60
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
61
|
+
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
|
|
62
|
+
});
|
|
63
|
+
if (res.ok)
|
|
64
|
+
return { ok: true };
|
|
65
|
+
lastStatus = res.status;
|
|
66
|
+
// A 404 just means "wrong platform path" — keep trying.
|
|
67
|
+
if (res.status !== 404)
|
|
68
|
+
return { ok: false, status: res.status };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
lastError = err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { ok: false, status: lastStatus, error: lastError };
|
|
75
|
+
},
|
|
76
|
+
// G-D #10 — surface the RAW registry error (not swallowed) so doctor can
|
|
77
|
+
// run the CA classifier on a TLS-inspection failure of the npm registry.
|
|
78
|
+
async probeRegistry() {
|
|
79
|
+
try {
|
|
80
|
+
const res = await fetch('https://registry.npmjs.org/-/ping', {
|
|
81
|
+
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
|
|
82
|
+
});
|
|
83
|
+
return res.ok ? { ok: true } : { ok: false, error: { status: res.status } };
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return { ok: false, error: err };
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
fetchLatest: (pkg) => fetchLatestFromNpm(pkg),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* `yt-builder-mcp doctor [--url <site> --token <key>]` — run the self-diagnostic
|
|
94
|
+
* and print an actionable report. Falls back to YTB_MCP_SITE_URL /
|
|
95
|
+
* YTB_MCP_BEARER_TOKEN when the flags are omitted (so it works against an
|
|
96
|
+
* already-configured server entry). Returns 0 when all critical checks pass.
|
|
97
|
+
*/
|
|
98
|
+
export async function doctorCommand(argv, overrides = {}) {
|
|
99
|
+
const env = overrides.env ?? process.env;
|
|
100
|
+
const log = overrides.log ?? ((line) => process.stdout.write(`${line}\n`));
|
|
101
|
+
const deps = overrides.deps ?? defaultDoctorDeps();
|
|
102
|
+
// Honor a corporate proxy for doctor's own probes (CA via NODE_EXTRA_CA_CERTS).
|
|
103
|
+
installGlobalProxyDispatcher({ env });
|
|
104
|
+
const parsed = parseDoctorArgs(argv);
|
|
105
|
+
const url = parsed.url ?? env.YTB_MCP_SITE_URL ?? env.YTB_MCP_WP_URL;
|
|
106
|
+
const token = parsed.token ?? env.YTB_MCP_BEARER_TOKEN;
|
|
107
|
+
const report = await runDoctor({ url, token, env, currentVersion: SERVER_VERSION, packageName: MCP_PACKAGE_NAME }, deps);
|
|
108
|
+
log(formatDoctorReport(report));
|
|
109
|
+
return report.ok ? 0 : 1;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=doctor-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation-decision.d.ts","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"invocation-decision.d.ts","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAsBjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAKxB,CAAC;AAEZ,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,OAAO,GAAG,SAAS,GAChC,gBAAgB,CAMlB"}
|
|
@@ -31,6 +31,8 @@ export const KNOWN_SUBCOMMANDS = Object.freeze(new Set([
|
|
|
31
31
|
'setup',
|
|
32
32
|
'install-skill',
|
|
33
33
|
'install',
|
|
34
|
+
// Self-diagnostic: Node version, TLS chain, proxy, reachability, bearer.
|
|
35
|
+
'doctor',
|
|
34
36
|
// Reverse-of-setup: remove our server entry + optional skill.
|
|
35
37
|
'uninstall',
|
|
36
38
|
'remove',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation-decision.js","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,MAAM,CAAC,MAAM,CAC/D,IAAI,GAAG,CAAS;IACZ,OAAO;IACP,eAAe;IACf,SAAS;IACT,8DAA8D;IAC9D,WAAW;IACX,QAAQ;IACR,iCAAiC;IACjC,UAAU;IACV,YAAY;IACZ,aAAa;IACb,aAAa;IACb,WAAW;IACX,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,IAAI;CACP,CAAC,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW;IACxC,sEAAsE;IACtE,oDAAoD;IACpD,sDAAsD;IACtD,4BAA4B;CAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAKZ;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACrD,OAAO,GAAG,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC5B,UAA8B,EAC9B,UAA+B;IAE/B,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,oEAAoE;IACpE,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
|
|
1
|
+
{"version":3,"file":"invocation-decision.js","sourceRoot":"","sources":["../../src/cli/invocation-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,MAAM,CAAC,MAAM,CAC/D,IAAI,GAAG,CAAS;IACZ,OAAO;IACP,eAAe;IACf,SAAS;IACT,yEAAyE;IACzE,QAAQ;IACR,8DAA8D;IAC9D,WAAW;IACX,QAAQ;IACR,iCAAiC;IACjC,UAAU;IACV,YAAY;IACZ,aAAa;IACb,aAAa;IACb,WAAW;IACX,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,WAAW;IACX,IAAI;CACP,CAAC,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW;IACxC,sEAAsE;IACtE,oDAAoD;IACpD,sDAAsD;IACtD,4BAA4B;CAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAKZ;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACrD,OAAO,GAAG,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC5B,UAA8B,EAC9B,UAA+B;IAE/B,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,oEAAoE;IACpE,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -31,6 +31,13 @@ export interface LegacyRestClientOptions {
|
|
|
31
31
|
readonly timeoutMs?: number;
|
|
32
32
|
/** Injected for tests. Defaults to `globalThis.fetch`. */
|
|
33
33
|
readonly fetch?: typeof fetch;
|
|
34
|
+
/**
|
|
35
|
+
* Extra headers merged into EVERY outbound request (Glöckle gap #14 —
|
|
36
|
+
* HTTP Basic-Auth / WAF cookie / corporate gateway secret). The Bearer
|
|
37
|
+
* (and any per-request header) always wins on collision; these only fill
|
|
38
|
+
* gaps. Source: `YTB_MCP_EXTRA_HEADERS` (see `net/extra-headers.ts`).
|
|
39
|
+
*/
|
|
40
|
+
readonly extraHeaders?: Record<string, string>;
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
36
43
|
* Platform-aware options shape (Wave G.0+).
|
|
@@ -43,6 +50,12 @@ export interface PlatformRestClientOptions {
|
|
|
43
50
|
readonly timeoutMs?: number;
|
|
44
51
|
/** Injected for tests. Defaults to `globalThis.fetch`. */
|
|
45
52
|
readonly fetch?: typeof fetch;
|
|
53
|
+
/**
|
|
54
|
+
* Extra headers merged into EVERY outbound request (Glöckle gap #14).
|
|
55
|
+
* Bearer + per-request headers always win on collision. Source:
|
|
56
|
+
* `YTB_MCP_EXTRA_HEADERS` (see `net/extra-headers.ts`).
|
|
57
|
+
*/
|
|
58
|
+
readonly extraHeaders?: Record<string, string>;
|
|
46
59
|
}
|
|
47
60
|
/** Discriminated union: callers pick whichever shape suits them. */
|
|
48
61
|
export type RestClientOptions = LegacyRestClientOptions | PlatformRestClientOptions;
|
|
@@ -62,6 +75,7 @@ export declare class RestClient {
|
|
|
62
75
|
private readonly bearerToken;
|
|
63
76
|
private readonly timeoutMs;
|
|
64
77
|
private readonly fetchImpl;
|
|
78
|
+
private readonly extraHeaders;
|
|
65
79
|
constructor(options: RestClientOptions);
|
|
66
80
|
/** Expose the underlying platform (used by tools that need restNamespacePath/kind). */
|
|
67
81
|
getPlatform(): Platform;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* @license MIT
|
|
17
17
|
*/
|
|
18
18
|
import { NetworkError, RestError } from './errors.js';
|
|
19
|
+
import { mergeExtraHeaders } from './net/extra-headers.js';
|
|
19
20
|
import { WordPressPlatform, WORDPRESS_REST_NAMESPACE_PATH } from './platform/index.js';
|
|
20
21
|
/**
|
|
21
22
|
* Canonical WordPress REST-namespace path. Re-exported for backward
|
|
@@ -28,6 +29,7 @@ export class RestClient {
|
|
|
28
29
|
bearerToken;
|
|
29
30
|
timeoutMs;
|
|
30
31
|
fetchImpl;
|
|
32
|
+
extraHeaders;
|
|
31
33
|
constructor(options) {
|
|
32
34
|
// Dual-form: accept either a `Platform` or a legacy `baseUrl`.
|
|
33
35
|
const platform = isPlatformOptions(options)
|
|
@@ -38,6 +40,7 @@ export class RestClient {
|
|
|
38
40
|
this.bearerToken = options.bearerToken;
|
|
39
41
|
this.timeoutMs = options.timeoutMs ?? 15_000;
|
|
40
42
|
this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
43
|
+
this.extraHeaders = options.extraHeaders ?? {};
|
|
41
44
|
}
|
|
42
45
|
/** Expose the underlying platform (used by tools that need restNamespacePath/kind). */
|
|
43
46
|
getPlatform() {
|
|
@@ -70,6 +73,12 @@ export class RestClient {
|
|
|
70
73
|
headers['Content-Type'] = 'application/json';
|
|
71
74
|
init.body = JSON.stringify(options.body);
|
|
72
75
|
}
|
|
76
|
+
// Glöckle gap #14 — merge corporate extra headers UNDER the
|
|
77
|
+
// authoritative set so the Bearer (and every header above) always wins
|
|
78
|
+
// on collision; extras only fill gaps (Basic-Auth / WAF cookie / etc.).
|
|
79
|
+
if (Object.keys(this.extraHeaders).length > 0) {
|
|
80
|
+
init.headers = mergeExtraHeaders(headers, this.extraHeaders);
|
|
81
|
+
}
|
|
73
82
|
const controller = new AbortController();
|
|
74
83
|
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
75
84
|
if (options.signal !== undefined) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when `err` (or anything in its `.cause` / `AggregateError.errors`
|
|
3
|
+
* chain) carries a TLS chain-of-trust failure code — the signature of a
|
|
4
|
+
* corporate TLS-inspection proxy injecting its own root CA. Pure; reuses the
|
|
5
|
+
* same walker + code set as {@link diagnoseNetworkError}.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isCaTrustError(err: unknown): boolean;
|
|
8
|
+
/** Node version that first reads the OS trust store via `--use-system-ca`. */
|
|
9
|
+
export declare const SYSTEM_CA_NODE_FLOOR: readonly [number, number, number];
|
|
10
|
+
/**
|
|
11
|
+
* Does `nodeVersion` (default `process.version`) support `--use-system-ca`?
|
|
12
|
+
* A real numeric triple compare against {@link SYSTEM_CA_NODE_FLOOR} —
|
|
13
|
+
* fail-closed (`false`) on unparseable input.
|
|
14
|
+
*/
|
|
15
|
+
export declare function supportsSystemCa(nodeVersion?: string): boolean;
|
|
16
|
+
//# sourceMappingURL=ca-trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ca-trust.d.ts","sourceRoot":"","sources":["../../src/diagnostics/ca-trust.ts"],"names":[],"mappings":"AAqBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAe,CAAC;AAQnF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,GAAE,MAAwB,GAAG,OAAO,CAS/E"}
|