@wootsup/yt-builder-mcp 1.4.1 → 1.6.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/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +11 -0
- package/dist/auth.js.map +1 -1
- package/dist/cli/doctor-command.d.ts.map +1 -1
- package/dist/cli/doctor-command.js +96 -8
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -1
- package/dist/client.js.map +1 -1
- package/dist/clients/claude-code.d.ts.map +1 -1
- package/dist/clients/claude-code.js +5 -2
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/claude-desktop.d.ts.map +1 -1
- package/dist/clients/claude-desktop.js +5 -2
- package/dist/clients/claude-desktop.js.map +1 -1
- package/dist/clients/cline.d.ts.map +1 -1
- package/dist/clients/cline.js +5 -2
- package/dist/clients/cline.js.map +1 -1
- package/dist/clients/codex-cli.d.ts.map +1 -1
- package/dist/clients/codex-cli.js +127 -2
- package/dist/clients/codex-cli.js.map +1 -1
- package/dist/clients/continue.d.ts.map +1 -1
- package/dist/clients/continue.js +11 -2
- package/dist/clients/continue.js.map +1 -1
- package/dist/clients/cursor.d.ts.map +1 -1
- package/dist/clients/cursor.js +5 -2
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/gemini-cli.d.ts.map +1 -1
- package/dist/clients/gemini-cli.js +5 -2
- package/dist/clients/gemini-cli.js.map +1 -1
- package/dist/clients/index.d.ts +49 -0
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +79 -0
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/roo-code.d.ts.map +1 -1
- package/dist/clients/roo-code.js +5 -2
- package/dist/clients/roo-code.js.map +1 -1
- package/dist/clients/zed.d.ts.map +1 -1
- package/dist/clients/zed.js +22 -2
- package/dist/clients/zed.js.map +1 -1
- package/dist/diagnostics/doctor.d.ts +60 -2
- package/dist/diagnostics/doctor.d.ts.map +1 -1
- package/dist/diagnostics/doctor.js +185 -8
- package/dist/diagnostics/doctor.js.map +1 -1
- package/dist/diagnostics/startup-self-probe.d.ts +39 -0
- package/dist/diagnostics/startup-self-probe.d.ts.map +1 -0
- package/dist/diagnostics/startup-self-probe.js +87 -0
- package/dist/diagnostics/startup-self-probe.js.map +1 -0
- package/dist/gateway/essentials.d.ts +15 -6
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +51 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -2
- package/dist/index.js.map +1 -1
- package/dist/net/proxy-dispatcher.d.ts +7 -0
- package/dist/net/proxy-dispatcher.d.ts.map +1 -1
- package/dist/net/proxy-dispatcher.js +7 -2
- package/dist/net/proxy-dispatcher.js.map +1 -1
- package/dist/net/site-basic-auth.d.ts +65 -0
- package/dist/net/site-basic-auth.d.ts.map +1 -0
- package/dist/net/site-basic-auth.js +118 -0
- package/dist/net/site-basic-auth.js.map +1 -0
- package/dist/proxy/bridge.d.ts +18 -1
- package/dist/proxy/bridge.d.ts.map +1 -1
- package/dist/proxy/bridge.js +23 -3
- package/dist/proxy/bridge.js.map +1 -1
- package/dist/setup-wizard-types.d.ts +9 -0
- package/dist/setup-wizard-types.d.ts.map +1 -1
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +37 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/client-pool.d.ts +35 -1
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +45 -1
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +65 -8
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +45 -0
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +178 -2
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +8 -0
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/health-format.d.ts +2 -0
- package/dist/tools/format/health-format.d.ts.map +1 -1
- package/dist/tools/format/health-format.js +11 -0
- package/dist/tools/format/health-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts +42 -0
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +43 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/source-schema-format.d.ts +64 -0
- package/dist/tools/format/source-schema-format.d.ts.map +1 -0
- package/dist/tools/format/source-schema-format.js +161 -0
- package/dist/tools/format/source-schema-format.js.map +1 -0
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +31 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/multi-items/builders.js +2 -2
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts +2 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.js +9 -1
- package/dist/tools/multi-items/clean-implode-handler.js.map +1 -1
- package/dist/tools/multi-items/inspect-handler.d.ts +8 -0
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +48 -2
- 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 +126 -28
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +21 -2
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +183 -11
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +42 -1
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +114 -5
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +26 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +38 -0
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/pool-resolve-helper.d.ts +11 -26
- package/dist/tools/pool-resolve-helper.d.ts.map +1 -1
- package/dist/tools/pool-resolve-helper.js +50 -0
- package/dist/tools/pool-resolve-helper.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +258 -4
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +107 -0
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +197 -2
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +54 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +82 -0
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +37 -1
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +35 -5
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +39 -0
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/yt-builder-mcp/SKILL.md +237 -39
|
@@ -15,11 +15,20 @@
|
|
|
15
15
|
* entirely (no forward, no capture) so the
|
|
16
16
|
* SDK never sees a duplicate registration.
|
|
17
17
|
*
|
|
18
|
-
* Why this split: Cursor caps MCP servers at ~40 tools.
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* (
|
|
18
|
+
* Why this split: Cursor caps MCP servers at ~40 tools. The 3-lane shape
|
|
19
|
+
* keeps `tools/list` at 32 (L1) + 2 (L3) + 2 (gateways) = 36 entries, well
|
|
20
|
+
* under the cap, while every tool stays fully reachable (advanced tools
|
|
21
|
+
* through `yootheme_builder_advanced` / `yootheme_builder_advanced_read`).
|
|
22
|
+
* B4 (2026-06-27): element_get_binding promoted L2 → L1 (binding-read made
|
|
23
|
+
* first-class, mirroring the already-L1 element_bind_source write). L1 26 → 27.
|
|
24
|
+
* U4-L1 (Glöckle onboarding, 2026-06-27): source_get_schema promoted L2 → L1
|
|
25
|
+
* (the archive/category binding entry-point made first-class, mirroring how the
|
|
26
|
+
* bind→verify tools are already L1). L1 27 → 28.
|
|
27
|
+
* HANDOFF-4/5 L1 (Glöckle onboarding, 2026-06-28): render_preview,
|
|
28
|
+
* element_set_source, rename_source, template_set_type promoted L2 → L1 — the
|
|
29
|
+
* core write/refactor + render-verify tools the Glöckle HANDOFF-4/5 ask for,
|
|
30
|
+
* made first-class so a cold agent can discover them in tools/list (L2 was a
|
|
31
|
+
* discoverability workaround). L1 28 → 32, advanced 9 → 5.
|
|
23
32
|
*
|
|
24
33
|
* F116 (2026-06-11): the bind→save→publish chain (element_bind_source,
|
|
25
34
|
* page_save, page_publish) was promoted from the advanced lane to L1. It is
|
|
@@ -112,6 +121,16 @@ export const ESSENTIAL_TOOLS = [
|
|
|
112
121
|
'yootheme_builder_element_bind_source',
|
|
113
122
|
'yootheme_builder_page_save',
|
|
114
123
|
'yootheme_builder_page_publish',
|
|
124
|
+
// B4 (Glöckle onboarding, 2026-06-27) — promote the binding READ to L1,
|
|
125
|
+
// mirroring its already-L1 WRITE sibling element_bind_source (F116). The
|
|
126
|
+
// READ stayed behind the advanced(-read) gateway: an agent that had just
|
|
127
|
+
// bound a relation traversal could not directly confirm query.field /
|
|
128
|
+
// arguments without first discovering the gateway — a 2-call discovery tax
|
|
129
|
+
// on the verify half of the bind→verify loop. Making binding-read
|
|
130
|
+
// first-class closes the asymmetry. This is a tier-LIST move (the catalog
|
|
131
|
+
// tool already exists); sync-catalog re-run flips its tier to essential.
|
|
132
|
+
// L1 surface 26 → 27.
|
|
133
|
+
'yootheme_builder_element_get_binding',
|
|
115
134
|
// P-G (Goldstandard wave 3) — page_dynamize is THE canonical one-call
|
|
116
135
|
// path to dynamize an existing designed section (copy byte-identically,
|
|
117
136
|
// swap only mapped queries + leaf names). It MUST be L1 so an agent
|
|
@@ -126,6 +145,33 @@ export const ESSENTIAL_TOOLS = [
|
|
|
126
145
|
// directly INSTEAD of hand-building (and tripping the guard on) an
|
|
127
146
|
// invalid root/section/row placement. With the prior set L1 24 → 25.
|
|
128
147
|
'yootheme_builder_scaffold_section',
|
|
148
|
+
// U4-L1 (Glöckle onboarding, 2026-06-27) — promote source_get_schema to L1.
|
|
149
|
+
// It is THE one-call entry-point for binding on an archive/category template
|
|
150
|
+
// (introspect a source's query methods + RELATIONS + the archive-context
|
|
151
|
+
// flag — turning a ~25-call code-dive into one). It stayed behind the
|
|
152
|
+
// advanced(-read) gateway, so a cold agent orienting toward a Term→Posts
|
|
153
|
+
// bind had to discover the gateway first — a 2-call discovery tax on the
|
|
154
|
+
// very first call of the canonical archive-binding workflow, whose write
|
|
155
|
+
// sibling element_bind_source is already L1 (F116). Making source-schema
|
|
156
|
+
// discovery first-class closes that asymmetry. This is a tier-LIST move
|
|
157
|
+
// (the catalog tool already exists); sync-catalog re-run flips its tier to
|
|
158
|
+
// essential. L1 surface 27 → 28.
|
|
159
|
+
'yootheme_builder_source_get_schema',
|
|
160
|
+
// HANDOFF-4/5 L1 (Glöckle onboarding, 2026-06-28) — promote the four core
|
|
161
|
+
// write/refactor + render-verify tools the Glöckle HANDOFF-4/5 explicitly
|
|
162
|
+
// ask for to L1. They were registered + reachable only via the advanced
|
|
163
|
+
// (-read) gateway, so a cold agent could not DISCOVER them in tools/list —
|
|
164
|
+
// L2 was a discoverability workaround, not a design choice. These ARE the
|
|
165
|
+
// canonical archive-rebind/refactor surface (set a precomposed source at a
|
|
166
|
+
// pointer; render-verify the saved page is not silently blank; rename a
|
|
167
|
+
// source/field template-wide after a taxonomy/CPT rename; re-type an
|
|
168
|
+
// orphaned archive/single template). Each is a tier-LIST move (the catalog
|
|
169
|
+
// tools already exist); sync-catalog re-run flips their tier to essential.
|
|
170
|
+
// L1 surface 28 → 32.
|
|
171
|
+
'yootheme_builder_render_preview',
|
|
172
|
+
'yootheme_builder_element_set_source',
|
|
173
|
+
'yootheme_builder_rename_source',
|
|
174
|
+
'yootheme_builder_template_set_type',
|
|
129
175
|
];
|
|
130
176
|
/**
|
|
131
177
|
* L3 — Tools registered DIRECTLY on the real McpServer, BEFORE the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"essentials.js","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"essentials.js","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,6BAA6B;IAC7B,qEAAqE;IACrE,qEAAqE;IACrE,uEAAuE;IACvE,mEAAmE;IACnE,gCAAgC;IAChC,2BAA2B;IAC3B,+BAA+B;IAC/B,8BAA8B;IAC9B,0CAA0C;IAC1C,+BAA+B;IAC/B,qCAAqC;IACrC,6DAA6D;IAC7D,kEAAkE;IAClE,6DAA6D;IAC7D,yCAAyC;IACzC,8CAA8C;IAC9C,iEAAiE;IACjE,4DAA4D;IAC5D,mEAAmE;IACnE,iEAAiE;IACjE,sEAAsE;IACtE,qEAAqE;IACrE,8BAA8B;IAC9B,iCAAiC;IACjC,gCAAgC;IAChC,+BAA+B;IAC/B,kCAAkC;IAClC,oEAAoE;IACpE,sEAAsE;IACtE,mCAAmC;IACnC,iEAAiE;IACjE,iEAAiE;IACjE,iEAAiE;IACjE,4DAA4D;IAC5D,4DAA4D;IAC5D,0CAA0C;IAC1C,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,kEAAkE;IAClE,uEAAuE;IACvE,6BAA6B;IAC7B,6BAA6B;IAC7B,mEAAmE;IACnE,oEAAoE;IACpE,oEAAoE;IACpE,8DAA8D;IAC9D,+BAA+B;IAC/B,2BAA2B;IAC3B,oEAAoE;IACpE,iEAAiE;IACjE,mEAAmE;IACnE,oEAAoE;IACpE,kEAAkE;IAClE,kCAAkC;IAClC,+BAA+B;IAC/B,+BAA+B;IAC/B,8EAA8E;IAC9E,sEAAsE;IACtE,uEAAuE;IACvE,oEAAoE;IACpE,oEAAoE;IACpE,yEAAyE;IACzE,kEAAkE;IAClE,yCAAyC;IACzC,sCAAsC;IACtC,4BAA4B;IAC5B,+BAA+B;IAC/B,wEAAwE;IACxE,yEAAyE;IACzE,yEAAyE;IACzE,sEAAsE;IACtE,2EAA2E;IAC3E,kEAAkE;IAClE,0EAA0E;IAC1E,yEAAyE;IACzE,sBAAsB;IACtB,sCAAsC;IACtC,sEAAsE;IACtE,wEAAwE;IACxE,oEAAoE;IACpE,qEAAqE;IACrE,kEAAkE;IAClE,oEAAoE;IACpE,gCAAgC;IAChC,wEAAwE;IACxE,oEAAoE;IACpE,wEAAwE;IACxE,wEAAwE;IACxE,mEAAmE;IACnE,qEAAqE;IACrE,mCAAmC;IACnC,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,2EAA2E;IAC3E,iCAAiC;IACjC,oCAAoC;IACpC,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,wEAAwE;IACxE,qEAAqE;IACrE,2EAA2E;IAC3E,2EAA2E;IAC3E,sBAAsB;IACtB,iCAAiC;IACjC,qCAAqC;IACrC,gCAAgC;IAChC,oCAAoC;CAC9B,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,yBAAyB;IACzB,2BAA2B;CACrB,CAAC;AAKX,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,OAAQ,eAAqC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB,CAAC,IAAY;IACzC,OAAQ,sBAA4C,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @license MIT
|
|
13
13
|
*/
|
|
14
|
+
import { type TlsProbe } from './diagnostics/startup-self-probe.js';
|
|
14
15
|
export { createServer, SERVER_NAME, SERVER_VERSION } from './server.js';
|
|
15
16
|
export { RestClient, REST_NAMESPACE_PATH, encodeElementPath } from './client.js';
|
|
16
17
|
export { loadConfig, loadRegistry, isTestMode, ENV_SITE_URL, ENV_WP_URL, ENV_BEARER, ENV_SITES_FILE, ENV_PLATFORM, ENV_PROFILE, ENV_TEST_MODE, } from './auth.js';
|
|
@@ -25,6 +26,19 @@ export { ESSENTIAL_TOOLS, DIRECT_TOP_LEVEL_TOOLS, isEssential, isDirectTopLevel,
|
|
|
25
26
|
export { CapturingServer, type AdvancedToolEntry, type CapturedToolHandler, type ToolRegistrar, } from './gateway/capturing-server.js';
|
|
26
27
|
export { registerAdvancedTool } from './gateway/advanced-tool.js';
|
|
27
28
|
export { collectAllRegisteredTools, findTool, type CollectedTool, } from './gateway/test-support.js';
|
|
28
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Optional injection seam for {@link main} — lets the startup self-probe (P0.4)
|
|
31
|
+
* be driven deterministically in tests without a real network. Production passes
|
|
32
|
+
* nothing, so the real bounded `fetch` probe runs.
|
|
33
|
+
*/
|
|
34
|
+
export interface MainDeps {
|
|
35
|
+
/** Override the startup TLS self-probe (P0.4). Default: real bounded fetch. */
|
|
36
|
+
readonly selfProbe?: TlsProbe;
|
|
37
|
+
/** Override `process.version` for the self-probe's remedy choice. */
|
|
38
|
+
readonly nodeVersion?: string;
|
|
39
|
+
/** Override `process.exit` so a CA-trust abort is observable in tests. */
|
|
40
|
+
readonly exit?: (code: number) => never;
|
|
41
|
+
}
|
|
42
|
+
declare function main(deps?: MainDeps): Promise<void>;
|
|
29
43
|
export { main };
|
|
30
44
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAczF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACH,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,aAAa,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EACH,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,gBAAgB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EACH,yBAAyB,EACzB,QAAQ,EACR,KAAK,aAAa,GACrB,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAC3C;AAED,iBAAe,IAAI,CAAC,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJtD;AAkBD,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* @license MIT
|
|
13
13
|
*/
|
|
14
14
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
|
-
import { isTestMode, loadRegistry } from './auth.js';
|
|
15
|
+
import { ENV_SITE_URL, ENV_WP_URL, isTestMode, loadRegistry } from './auth.js';
|
|
16
|
+
import { runStartupSelfProbe } from './diagnostics/startup-self-probe.js';
|
|
16
17
|
import { ConfigError } from './errors.js';
|
|
17
18
|
import { installGlobalProxyDispatcher } from './net/proxy-dispatcher.js';
|
|
18
19
|
import { SERVER_VERSION } from './server.js';
|
|
@@ -40,7 +41,7 @@ export { ESSENTIAL_TOOLS, DIRECT_TOP_LEVEL_TOOLS, isEssential, isDirectTopLevel,
|
|
|
40
41
|
export { CapturingServer, } from './gateway/capturing-server.js';
|
|
41
42
|
export { registerAdvancedTool } from './gateway/advanced-tool.js';
|
|
42
43
|
export { collectAllRegisteredTools, findTool, } from './gateway/test-support.js';
|
|
43
|
-
async function main() {
|
|
44
|
+
async function main(deps = {}) {
|
|
44
45
|
// Honor an enterprise HTTP(S)_PROXY / NO_PROXY before any outbound call —
|
|
45
46
|
// BOTH proxy mode (below) and fat mode use Node's global fetch, which reads
|
|
46
47
|
// this global dispatcher. Unconditional + passthrough-safe (no proxy env =
|
|
@@ -55,6 +56,13 @@ async function main() {
|
|
|
55
56
|
for (const w of parseExtraHeaders().warnings) {
|
|
56
57
|
process.stderr.write(`[yt-builder-mcp] ${w}\n`);
|
|
57
58
|
}
|
|
59
|
+
// U3 — surface any YTB_MCP_SITE_BASIC_AUTH parse warning (missing colon /
|
|
60
|
+
// empty username) ONCE at startup. The warning NEVER contains the
|
|
61
|
+
// credential value (see net/site-basic-auth.ts).
|
|
62
|
+
const { parseSiteBasicAuth } = await import('./net/site-basic-auth.js');
|
|
63
|
+
for (const w of parseSiteBasicAuth().warnings) {
|
|
64
|
+
process.stderr.write(`[yt-builder-mcp] ${w}\n`);
|
|
65
|
+
}
|
|
58
66
|
}
|
|
59
67
|
// Update notice (non-blocking, cached 24h, fail-silent) — surfaces a newer
|
|
60
68
|
// npm version to stderr without ever delaying serving or breaking behind a
|
|
@@ -71,6 +79,33 @@ async function main() {
|
|
|
71
79
|
/* fail-silent — the notifier is a courtesy, never a dependency */
|
|
72
80
|
});
|
|
73
81
|
}
|
|
82
|
+
// P0.4 — bounded startup TLS self-probe. Before we open stdio (in EITHER
|
|
83
|
+
// proxy or fat mode), send ONE short HTTPS request to the configured site.
|
|
84
|
+
// If it rejects with a TLS chain-of-trust error (a corporate TLS-inspection
|
|
85
|
+
// proxy whose root CA Node doesn't trust), print the actionable
|
|
86
|
+
// --use-system-ca / NODE_EXTRA_CA_CERTS fix to stderr and exit fast (< 2s)
|
|
87
|
+
// instead of hanging until the host's ~30s /mcp connect-timeout. Skipped in
|
|
88
|
+
// test-mode (the smoke probe must not hit the network) and when no site is
|
|
89
|
+
// configured (the boot-unconfigured path must stay). Any non-CA outcome
|
|
90
|
+
// (success, 401/404/5xx, DNS, plain timeout) lets the server boot normally.
|
|
91
|
+
if (!isTestMode()) {
|
|
92
|
+
const siteUrl = process.env[ENV_SITE_URL] ?? process.env[ENV_WP_URL];
|
|
93
|
+
const probeResult = await runStartupSelfProbe(siteUrl, {
|
|
94
|
+
...(deps.selfProbe !== undefined ? { probe: deps.selfProbe } : {}),
|
|
95
|
+
...(deps.nodeVersion !== undefined ? { nodeVersion: deps.nodeVersion } : {}),
|
|
96
|
+
});
|
|
97
|
+
if (probeResult.caTrustFailure) {
|
|
98
|
+
process.stderr.write(`${probeResult.message ?? ''}\n`);
|
|
99
|
+
// Default exits the process (never returns). An injected stub in
|
|
100
|
+
// tests does NOT terminate, so we must still stop here — return
|
|
101
|
+
// BEFORE the call would be wrong (the real exit must fire), so we
|
|
102
|
+
// invoke then return. Typed `(code) => void` so the post-call return
|
|
103
|
+
// stays reachable for the stub path.
|
|
104
|
+
const doExit = deps.exit ?? ((code) => process.exit(code));
|
|
105
|
+
doExit(1);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
74
109
|
// Proxy mode: forward stdio 1:1 to the plugin-served PHP MCP endpoint and
|
|
75
110
|
// stop here — the fat catalog below is bypassed entirely. Default (fat) is
|
|
76
111
|
// unchanged. The dynamic import is gated on the env so the fat path never
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ export interface ProxyDispatcherDeps {
|
|
|
12
12
|
/** Defaults to `console.error`. */
|
|
13
13
|
stderr?: (message: string) => void;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Is any forward-proxy configured in the environment? Exported so the setup
|
|
17
|
+
* wizard's P0.1 default-on CA bake can reuse the SAME definition of "a corporate
|
|
18
|
+
* proxy is present" (one source of truth — no drift between the dispatcher and
|
|
19
|
+
* the installer).
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasProxyConfigured(env: NodeJS.ProcessEnv): boolean;
|
|
15
22
|
/**
|
|
16
23
|
* Install a process-global undici dispatcher that honors the enterprise
|
|
17
24
|
* `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` environment variables at request
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-dispatcher.d.ts","sourceRoot":"","sources":["../../src/net/proxy-dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAuE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAI9G;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvD,mDAAmD;IACnD,qBAAqB,CAAC,EAAE,MAAM,UAAU,CAAC;IACzC,mCAAmC;IACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;
|
|
1
|
+
{"version":3,"file":"proxy-dispatcher.d.ts","sourceRoot":"","sources":["../../src/net/proxy-dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAuE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAI9G;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvD,mDAAmD;IACnD,qBAAqB,CAAC,EAAE,MAAM,UAAU,CAAC;IACzC,mCAAmC;IACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAElE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAkCpF"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
// packages/mcp/src/net/proxy-dispatcher.ts
|
|
2
2
|
import { EnvHttpProxyAgent, setGlobalDispatcher as undiciSetGlobalDispatcher } from 'undici';
|
|
3
3
|
import { deriveNoProxyForInternalSite } from './internal-host.js';
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Is any forward-proxy configured in the environment? Exported so the setup
|
|
6
|
+
* wizard's P0.1 default-on CA bake can reuse the SAME definition of "a corporate
|
|
7
|
+
* proxy is present" (one source of truth — no drift between the dispatcher and
|
|
8
|
+
* the installer).
|
|
9
|
+
*/
|
|
10
|
+
export function hasProxyConfigured(env) {
|
|
6
11
|
return Boolean(env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy);
|
|
7
12
|
}
|
|
8
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-dispatcher.js","sourceRoot":"","sources":["../../src/net/proxy-dispatcher.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,IAAI,yBAAyB,EAAmB,MAAM,QAAQ,CAAC;AAE9G,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAgBlE
|
|
1
|
+
{"version":3,"file":"proxy-dispatcher.js","sourceRoot":"","sources":["../../src/net/proxy-dispatcher.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,IAAI,yBAAyB,EAAmB,MAAM,QAAQ,CAAC;AAE9G,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAgBlE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAsB;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAA4B,EAAE;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,sEAAsE;QACtE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,IAAI,yBAAyB,CAAC;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,IAAI,CAAC,GAAe,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,OAAe,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhF,4EAA4E;IAC5E,2EAA2E;IAC3E,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,OAAO,GAAG,4BAA4B,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnD,oEAAoE;QACpE,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,wCAAwC,OAAO,CAAC,SAAS,IAAI,EAAE,0DAA0D,CAAC,CAAC;IACpI,CAAC;IAED,IAAI,CAAC;QACD,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,mEAAmE;QACnE,IAAI,CAAC,wFAAwF,OAAO,EAAE,CAAC,CAAC;QACxG,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse `YTB_MCP_SITE_BASIC_AUTH` ('user:pass') into URL **userinfo** that is
|
|
3
|
+
* injected into the upstream request URL (`https://user:pass@host/…`) on BOTH
|
|
4
|
+
* transports (fat-mode {@link RestClient} base URL and proxy-mode endpoint URL).
|
|
5
|
+
*
|
|
6
|
+
* Why this exists (U3 — Glöckle post-cert QA blocker): a site fronted by a pure
|
|
7
|
+
* HTTP **Basic-Auth realm** (e.g. `qa.gloeckle.de`) requires
|
|
8
|
+
* `Authorization: Basic …`. But the plugin Bearer already owns the single
|
|
9
|
+
* `Authorization` header on every outbound request, and `YTB_MCP_EXTRA_HEADERS`
|
|
10
|
+
* HARD-FORBIDS an `Authorization` key (see {@link parseExtraHeaders}) — so Basic
|
|
11
|
+
* and the Bearer collide on the one header and the site is unreachable.
|
|
12
|
+
*
|
|
13
|
+
* The fix routes the site-level Basic credentials on a **separate transport**:
|
|
14
|
+
* URL userinfo. Userinfo and the `Authorization` header are independent — undici
|
|
15
|
+
* / fetch turn `https://user:pass@host` into an `Authorization: Basic …` toward
|
|
16
|
+
* the **gateway/realm**, while we keep emitting `Authorization: Bearer …` toward
|
|
17
|
+
* the **plugin** behind it. The Bearer is never touched; the realm and the
|
|
18
|
+
* plugin each get the credential they expect.
|
|
19
|
+
*
|
|
20
|
+
* ── Accepted format ─────────────────────────────────────────────────────────
|
|
21
|
+
* `user:pass` — split on the FIRST colon (passwords may contain colons).
|
|
22
|
+
* - The username MUST be non-empty.
|
|
23
|
+
* - The password MAY be empty (some realms use a user-only token).
|
|
24
|
+
* Both halves are percent-encoded for userinfo via the WHATWG URL encoder, so
|
|
25
|
+
* reserved chars (`@`, `/`, `:`, space, …) survive into a valid URL.
|
|
26
|
+
*
|
|
27
|
+
* ── Security invariants ─────────────────────────────────────────────────────
|
|
28
|
+
* - The credential value is **NEVER** echoed in a warning or logged. Malformed
|
|
29
|
+
* input yields a generic "missing colon / empty username" warning only.
|
|
30
|
+
* - This channel NEVER touches the `Authorization` header — it rides URL
|
|
31
|
+
* userinfo exclusively, so the Bearer always wins (orthogonal transports).
|
|
32
|
+
*
|
|
33
|
+
* Pure + deterministic. `warnings` collects non-fatal issues; the caller (the
|
|
34
|
+
* server boot path) surfaces them once to stderr.
|
|
35
|
+
*
|
|
36
|
+
* @license MIT
|
|
37
|
+
*/
|
|
38
|
+
/** Canonical env-var name for the site-level HTTP Basic-Auth feature. */
|
|
39
|
+
export declare const ENV_SITE_BASIC_AUTH = "YTB_MCP_SITE_BASIC_AUTH";
|
|
40
|
+
export interface ParsedSiteBasicAuth {
|
|
41
|
+
/**
|
|
42
|
+
* Percent-encoded `user:pass` userinfo ready to splice into a URL, or
|
|
43
|
+
* `null` when the env var is unset/blank/malformed. NEVER contains the raw
|
|
44
|
+
* (un-encoded) credential beyond what userinfo requires.
|
|
45
|
+
*/
|
|
46
|
+
readonly userinfo: string | null;
|
|
47
|
+
/** Non-fatal issues (missing colon, empty username). Never echo the secret. */
|
|
48
|
+
readonly warnings: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse `YTB_MCP_SITE_BASIC_AUTH` from `env` (default `process.env`). Returns
|
|
52
|
+
* `{ userinfo: null, warnings: [] }` when unset/blank, and a generic warning
|
|
53
|
+
* (never containing the secret) when the value is malformed.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseSiteBasicAuth(env?: NodeJS.ProcessEnv): ParsedSiteBasicAuth;
|
|
56
|
+
/**
|
|
57
|
+
* Splice `userinfo` (a percent-encoded `user:pass`) into `url`, returning the
|
|
58
|
+
* resulting href. When `userinfo` is `null`, the URL is returned unchanged
|
|
59
|
+
* (string form). Any pre-existing userinfo on the URL is overwritten.
|
|
60
|
+
*
|
|
61
|
+
* This is the ONLY mutation the site-Basic channel performs — it never adds or
|
|
62
|
+
* alters a header, so the Bearer in `Authorization` is untouched.
|
|
63
|
+
*/
|
|
64
|
+
export declare function applyUserinfoToUrl(url: string | URL, userinfo: string | null): string;
|
|
65
|
+
//# sourceMappingURL=site-basic-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-basic-auth.d.ts","sourceRoot":"","sources":["../../src/net/site-basic-auth.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAqBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,mBAAmB,CA8B5F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAgBrF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// packages/mcp/src/net/site-basic-auth.ts
|
|
2
|
+
/**
|
|
3
|
+
* Parse `YTB_MCP_SITE_BASIC_AUTH` ('user:pass') into URL **userinfo** that is
|
|
4
|
+
* injected into the upstream request URL (`https://user:pass@host/…`) on BOTH
|
|
5
|
+
* transports (fat-mode {@link RestClient} base URL and proxy-mode endpoint URL).
|
|
6
|
+
*
|
|
7
|
+
* Why this exists (U3 — Glöckle post-cert QA blocker): a site fronted by a pure
|
|
8
|
+
* HTTP **Basic-Auth realm** (e.g. `qa.gloeckle.de`) requires
|
|
9
|
+
* `Authorization: Basic …`. But the plugin Bearer already owns the single
|
|
10
|
+
* `Authorization` header on every outbound request, and `YTB_MCP_EXTRA_HEADERS`
|
|
11
|
+
* HARD-FORBIDS an `Authorization` key (see {@link parseExtraHeaders}) — so Basic
|
|
12
|
+
* and the Bearer collide on the one header and the site is unreachable.
|
|
13
|
+
*
|
|
14
|
+
* The fix routes the site-level Basic credentials on a **separate transport**:
|
|
15
|
+
* URL userinfo. Userinfo and the `Authorization` header are independent — undici
|
|
16
|
+
* / fetch turn `https://user:pass@host` into an `Authorization: Basic …` toward
|
|
17
|
+
* the **gateway/realm**, while we keep emitting `Authorization: Bearer …` toward
|
|
18
|
+
* the **plugin** behind it. The Bearer is never touched; the realm and the
|
|
19
|
+
* plugin each get the credential they expect.
|
|
20
|
+
*
|
|
21
|
+
* ── Accepted format ─────────────────────────────────────────────────────────
|
|
22
|
+
* `user:pass` — split on the FIRST colon (passwords may contain colons).
|
|
23
|
+
* - The username MUST be non-empty.
|
|
24
|
+
* - The password MAY be empty (some realms use a user-only token).
|
|
25
|
+
* Both halves are percent-encoded for userinfo via the WHATWG URL encoder, so
|
|
26
|
+
* reserved chars (`@`, `/`, `:`, space, …) survive into a valid URL.
|
|
27
|
+
*
|
|
28
|
+
* ── Security invariants ─────────────────────────────────────────────────────
|
|
29
|
+
* - The credential value is **NEVER** echoed in a warning or logged. Malformed
|
|
30
|
+
* input yields a generic "missing colon / empty username" warning only.
|
|
31
|
+
* - This channel NEVER touches the `Authorization` header — it rides URL
|
|
32
|
+
* userinfo exclusively, so the Bearer always wins (orthogonal transports).
|
|
33
|
+
*
|
|
34
|
+
* Pure + deterministic. `warnings` collects non-fatal issues; the caller (the
|
|
35
|
+
* server boot path) surfaces them once to stderr.
|
|
36
|
+
*
|
|
37
|
+
* @license MIT
|
|
38
|
+
*/
|
|
39
|
+
/** Canonical env-var name for the site-level HTTP Basic-Auth feature. */
|
|
40
|
+
export const ENV_SITE_BASIC_AUTH = 'YTB_MCP_SITE_BASIC_AUTH';
|
|
41
|
+
/**
|
|
42
|
+
* Encode a single userinfo component (username or password) exactly as the
|
|
43
|
+
* WHATWG URL serializer would. Using the URL setter (rather than
|
|
44
|
+
* `encodeURIComponent`) guarantees the result is byte-for-byte what lands on a
|
|
45
|
+
* real request URL, and is idempotent if the value is already encoded.
|
|
46
|
+
*/
|
|
47
|
+
function encodeUserinfoComponent(part, value) {
|
|
48
|
+
const u = new URL('https://x.invalid/');
|
|
49
|
+
if (part === 'username') {
|
|
50
|
+
u.username = value;
|
|
51
|
+
return u.username;
|
|
52
|
+
}
|
|
53
|
+
// A password-only set still needs a (placeholder) username for the URL to be
|
|
54
|
+
// valid; read back ONLY the password component.
|
|
55
|
+
u.username = 'x';
|
|
56
|
+
u.password = value;
|
|
57
|
+
return u.password;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse `YTB_MCP_SITE_BASIC_AUTH` from `env` (default `process.env`). Returns
|
|
61
|
+
* `{ userinfo: null, warnings: [] }` when unset/blank, and a generic warning
|
|
62
|
+
* (never containing the secret) when the value is malformed.
|
|
63
|
+
*/
|
|
64
|
+
export function parseSiteBasicAuth(env = process.env) {
|
|
65
|
+
const raw = (env[ENV_SITE_BASIC_AUTH] ?? '').trim();
|
|
66
|
+
if (raw === '') {
|
|
67
|
+
return { userinfo: null, warnings: [] };
|
|
68
|
+
}
|
|
69
|
+
const idx = raw.indexOf(':');
|
|
70
|
+
if (idx < 0) {
|
|
71
|
+
// Deliberately do NOT echo `raw` — it IS the credential.
|
|
72
|
+
return {
|
|
73
|
+
userinfo: null,
|
|
74
|
+
warnings: [
|
|
75
|
+
`${ENV_SITE_BASIC_AUTH}: ignored — expected "user:pass" (a ":" separating username from password). The credential value is not shown.`,
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const user = raw.slice(0, idx);
|
|
80
|
+
const password = raw.slice(idx + 1);
|
|
81
|
+
if (user === '') {
|
|
82
|
+
return {
|
|
83
|
+
userinfo: null,
|
|
84
|
+
warnings: [
|
|
85
|
+
`${ENV_SITE_BASIC_AUTH}: ignored — the username (before ":") is empty. Expected "user:pass". The credential value is not shown.`,
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const userinfo = `${encodeUserinfoComponent('username', user)}:${encodeUserinfoComponent('password', password)}`;
|
|
90
|
+
return { userinfo, warnings: [] };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Splice `userinfo` (a percent-encoded `user:pass`) into `url`, returning the
|
|
94
|
+
* resulting href. When `userinfo` is `null`, the URL is returned unchanged
|
|
95
|
+
* (string form). Any pre-existing userinfo on the URL is overwritten.
|
|
96
|
+
*
|
|
97
|
+
* This is the ONLY mutation the site-Basic channel performs — it never adds or
|
|
98
|
+
* alters a header, so the Bearer in `Authorization` is untouched.
|
|
99
|
+
*/
|
|
100
|
+
export function applyUserinfoToUrl(url, userinfo) {
|
|
101
|
+
const parsed = url instanceof URL ? new URL(url.href) : new URL(url);
|
|
102
|
+
if (userinfo === null) {
|
|
103
|
+
return parsed.href;
|
|
104
|
+
}
|
|
105
|
+
const sep = userinfo.indexOf(':');
|
|
106
|
+
if (sep < 0) {
|
|
107
|
+
// Defensive — parseSiteBasicAuth always produces a colon; a caller that
|
|
108
|
+
// hand-builds a userinfo without one gets username-only behaviour.
|
|
109
|
+
parsed.username = userinfo;
|
|
110
|
+
parsed.password = '';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
parsed.username = userinfo.slice(0, sep);
|
|
114
|
+
parsed.password = userinfo.slice(sep + 1);
|
|
115
|
+
}
|
|
116
|
+
return parsed.href;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=site-basic-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-basic-auth.js","sourceRoot":"","sources":["../../src/net/site-basic-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/bridge.d.ts
CHANGED
|
@@ -44,8 +44,16 @@ export declare function bridgeTransports(local: Transport, remote: Transport): v
|
|
|
44
44
|
interface ProxyConfig {
|
|
45
45
|
endpointUrl: URL;
|
|
46
46
|
token: string;
|
|
47
|
-
/** Extra headers from `YTB_MCP_EXTRA_HEADERS` (
|
|
47
|
+
/** Extra headers from `YTB_MCP_EXTRA_HEADERS` (WAF / gateway secret). */
|
|
48
48
|
extraHeaders?: Record<string, string>;
|
|
49
|
+
/**
|
|
50
|
+
* U3 — percent-encoded `user:pass` userinfo for a site-level HTTP Basic-Auth
|
|
51
|
+
* realm (`YTB_MCP_SITE_BASIC_AUTH`). Spliced into `endpointUrl`
|
|
52
|
+
* (`https://user:pass@host/…`) so the realm gets `Authorization: Basic …`
|
|
53
|
+
* while the Bearer header still reaches the plugin. Orthogonal transports —
|
|
54
|
+
* the Bearer is never overwritten.
|
|
55
|
+
*/
|
|
56
|
+
siteBasicUserinfo?: string;
|
|
49
57
|
}
|
|
50
58
|
/**
|
|
51
59
|
* Build the upstream `requestInit.headers` for proxy mode: the Bearer is
|
|
@@ -53,6 +61,15 @@ interface ProxyConfig {
|
|
|
53
61
|
* `Authorization` can NEVER be overwritten. Exported for unit tests.
|
|
54
62
|
*/
|
|
55
63
|
export declare function buildProxyRequestHeaders(config: ProxyConfig): Record<string, string>;
|
|
64
|
+
/**
|
|
65
|
+
* Resolve the upstream endpoint URL the proxy connects to, splicing in the U3
|
|
66
|
+
* site-level HTTP Basic userinfo (`https://user:pass@host/…`) when configured so
|
|
67
|
+
* the realm gets `Authorization: Basic …`. The Bearer rides the Authorization
|
|
68
|
+
* header (see {@link buildProxyRequestHeaders}) — independent transport, never
|
|
69
|
+
* clobbered. Returns the original URL unchanged when no site-Basic is set.
|
|
70
|
+
* Exported for unit tests.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveProxyEndpointUrl(config: ProxyConfig): URL;
|
|
56
73
|
/** Build the real transports + bridge them; resolves when EITHER side closes. */
|
|
57
74
|
export declare function runProxy(config: ProxyConfig, deps?: {
|
|
58
75
|
makeTransports?: (c: ProxyConfig) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/proxy/bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/proxy/bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAiE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAoC5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAuD1E;AAED;;mDAEmD;AACnD,UAAU,WAAW;IACnB,WAAW,EAAE,GAAG,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKpF;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAKhE;AAcD,iFAAiF;AACjF,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IACJ,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK;QACnC,KAAK,EAAE,SAAS,CAAC;QACjB,MAAM,EAAE,SAAS,CAAC;KACnB,CAAC;CACE,GACL,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,qFAAqF;AACrF,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GAC1D,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
|
package/dist/proxy/bridge.js
CHANGED
|
@@ -3,6 +3,7 @@ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/
|
|
|
3
3
|
import { resolveMode } from './mode.js';
|
|
4
4
|
import { diagnoseNetworkError } from '../diagnostics/diagnose-network-error.js';
|
|
5
5
|
import { mergeExtraHeaders, parseExtraHeaders } from '../net/extra-headers.js';
|
|
6
|
+
import { applyUserinfoToUrl, parseSiteBasicAuth } from '../net/site-basic-auth.js';
|
|
6
7
|
/** Narrow an unknown caught value to a human-readable message (no `any`). */
|
|
7
8
|
function errorMessage(err) {
|
|
8
9
|
if (err instanceof Error)
|
|
@@ -183,9 +184,23 @@ export function buildProxyRequestHeaders(config) {
|
|
|
183
184
|
? mergeExtraHeaders(base, config.extraHeaders)
|
|
184
185
|
: base;
|
|
185
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Resolve the upstream endpoint URL the proxy connects to, splicing in the U3
|
|
189
|
+
* site-level HTTP Basic userinfo (`https://user:pass@host/…`) when configured so
|
|
190
|
+
* the realm gets `Authorization: Basic …`. The Bearer rides the Authorization
|
|
191
|
+
* header (see {@link buildProxyRequestHeaders}) — independent transport, never
|
|
192
|
+
* clobbered. Returns the original URL unchanged when no site-Basic is set.
|
|
193
|
+
* Exported for unit tests.
|
|
194
|
+
*/
|
|
195
|
+
export function resolveProxyEndpointUrl(config) {
|
|
196
|
+
if (config.siteBasicUserinfo === undefined || config.siteBasicUserinfo === '') {
|
|
197
|
+
return config.endpointUrl;
|
|
198
|
+
}
|
|
199
|
+
return new URL(applyUserinfoToUrl(config.endpointUrl, config.siteBasicUserinfo));
|
|
200
|
+
}
|
|
186
201
|
/** Injection seam for tests — production builds the real SDK transports. */
|
|
187
202
|
function defaultTransports(config) {
|
|
188
|
-
const remote = new StreamableHTTPClientTransport(config
|
|
203
|
+
const remote = new StreamableHTTPClientTransport(resolveProxyEndpointUrl(config), {
|
|
189
204
|
requestInit: { headers: buildProxyRequestHeaders(config) },
|
|
190
205
|
});
|
|
191
206
|
const local = new StdioServerTransport();
|
|
@@ -222,13 +237,18 @@ export async function maybeRunProxy(env, deps = {}) {
|
|
|
222
237
|
if (resolved.mode !== 'proxy')
|
|
223
238
|
return false;
|
|
224
239
|
const run = deps.runProxy ?? runProxy;
|
|
225
|
-
// Glöckle gap #14 — attach corporate extra headers (
|
|
226
|
-
//
|
|
240
|
+
// Glöckle gap #14 — attach corporate extra headers (WAF / gateway secret) to
|
|
241
|
+
// every upstream request. parseExtraHeaders reads YTB_MCP_EXTRA_HEADERS.
|
|
227
242
|
const { headers: extraHeaders } = parseExtraHeaders(env);
|
|
243
|
+
// U3 — a site-level HTTP Basic-Auth realm rides URL userinfo, not a header
|
|
244
|
+
// (the Bearer owns Authorization). parseSiteBasicAuth reads
|
|
245
|
+
// YTB_MCP_SITE_BASIC_AUTH; `null` when unset/malformed → no userinfo spliced.
|
|
246
|
+
const { userinfo: siteBasicUserinfo } = parseSiteBasicAuth(env);
|
|
228
247
|
await run({
|
|
229
248
|
endpointUrl: resolved.endpointUrl,
|
|
230
249
|
token: resolved.token,
|
|
231
250
|
...(Object.keys(extraHeaders).length > 0 ? { extraHeaders } : {}),
|
|
251
|
+
...(siteBasicUserinfo !== null ? { siteBasicUserinfo } : {}),
|
|
232
252
|
});
|
|
233
253
|
return true;
|
|
234
254
|
}
|
package/dist/proxy/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/proxy/bridge.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/proxy/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -200,6 +200,15 @@ export interface WizardDeps {
|
|
|
200
200
|
* it on Node ≥ 22.15. Injectable so tests pin a version deterministically.
|
|
201
201
|
*/
|
|
202
202
|
nodeVersion?: string;
|
|
203
|
+
/**
|
|
204
|
+
* P0.1 — process environment (default `process.env`) read ONLY to detect a
|
|
205
|
+
* corporate forward-proxy (`HTTP(S)_PROXY`) for the default-on CA bake: when
|
|
206
|
+
* no explicit `--ca` was given and a proxy is configured (or the health
|
|
207
|
+
* probe reported a TLS-trust failure), the wizard auto-bakes
|
|
208
|
+
* `NODE_OPTIONS=--use-system-ca` (Node ≥ 22.15) unattended. Injectable so
|
|
209
|
+
* tests drive the proxy-present branch deterministically.
|
|
210
|
+
*/
|
|
211
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
203
212
|
/**
|
|
204
213
|
* G-D #6 — prompt the user for a corporate-CA trust strategy when a probe
|
|
205
214
|
* fails with a TLS-inspection error. `systemCaSupported` tells the prompt
|