@wootsup/yt-builder-mcp 1.3.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 +1 -1
- 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/essentials.d.ts +1 -1
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +5 -0
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +1 -1
- package/dist/install-skill.js +1 -1
- 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 +18 -11
- package/dist/proxy/bridge.d.ts.map +1 -1
- package/dist/proxy/bridge.js +30 -4
- package/dist/proxy/bridge.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 +133 -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 +13 -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 +4 -2
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +2 -1
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +3 -22
- package/dist/tools/elements/handlers.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/health.d.ts.map +1 -1
- package/dist/tools/health.js +32 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +78 -27
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +36 -5
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +217 -34
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +20 -5
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +44 -6
- 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 +28 -0
- 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 +30 -5
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +9 -1
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +62 -12
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +50 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +107 -0
- package/dist/tools/sparse-fields.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 +2 -1
- package/skills/yt-builder-mcp/SKILL.md +13 -12
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type DoctorStatus = 'ok' | 'warn' | 'fail' | 'info';
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly status: DoctorStatus;
|
|
6
|
+
readonly detail: string;
|
|
7
|
+
/** Actionable fix when status is warn/fail. */
|
|
8
|
+
readonly fix?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DoctorReport {
|
|
11
|
+
readonly checks: readonly DoctorCheck[];
|
|
12
|
+
/** True when no check failed (warnings are tolerated). */
|
|
13
|
+
readonly ok: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface DoctorConfig {
|
|
16
|
+
readonly url?: string;
|
|
17
|
+
readonly token?: string;
|
|
18
|
+
/** Defaults to `process.version`. */
|
|
19
|
+
readonly nodeVersion?: string;
|
|
20
|
+
/** Defaults to `process.env`. */
|
|
21
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
22
|
+
readonly currentVersion: string;
|
|
23
|
+
readonly packageName: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DoctorDeps {
|
|
26
|
+
/** Probe `<url>/wp-json/yt-builder-mcp/v1/health`. */
|
|
27
|
+
probeHealth: (url: string) => Promise<{
|
|
28
|
+
ok: true;
|
|
29
|
+
pluginVersion?: string;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
error: unknown;
|
|
33
|
+
}>;
|
|
34
|
+
/** Probe an authenticated endpoint with the bearer. */
|
|
35
|
+
probeBearer: (url: string, token: string) => Promise<{
|
|
36
|
+
ok: boolean;
|
|
37
|
+
status?: number;
|
|
38
|
+
error?: unknown;
|
|
39
|
+
}>;
|
|
40
|
+
/** Latest version on npm, or null. */
|
|
41
|
+
fetchLatest: (packageName: string) => Promise<string | null>;
|
|
42
|
+
/**
|
|
43
|
+
* G-D #10 — probe `registry.npmjs.org` reachability + TLS chain. Optional
|
|
44
|
+
* for back-compat (older deps bags / tests). When wired, doctor runs the
|
|
45
|
+
* network-error classifier on a failure and surfaces the SAME CA fix as the
|
|
46
|
+
* site check — a corporate TLS-inspection CA usually breaks BOTH the site
|
|
47
|
+
* and the npm registry, but the old code swallowed the registry error into
|
|
48
|
+
* a generic "could not reach npm".
|
|
49
|
+
*/
|
|
50
|
+
probeRegistry?: () => Promise<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
error?: unknown;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run the self-diagnostic. Pure decision core — all network probes are
|
|
57
|
+
* injected via {@link DoctorDeps}, so the logic is fully testable offline.
|
|
58
|
+
*/
|
|
59
|
+
export declare function runDoctor(config: DoctorConfig, deps: DoctorDeps): Promise<DoctorReport>;
|
|
60
|
+
/** Render a {@link DoctorReport} as a readable, fixed-width-ish text block. */
|
|
61
|
+
export declare function formatDoctorReport(report: DoctorReport): string;
|
|
62
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/diagnostics/doctor.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACvB,sDAAsD;IACtD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5G,uDAAuD;IACvD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACxG,sCAAsC;IACtC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE;AAsBD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAiI7F;AAID,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAS/D"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// packages/mcp/src/diagnostics/doctor.ts
|
|
2
|
+
import { diagnoseNetworkError } from './diagnose-network-error.js';
|
|
3
|
+
import { isVersionNewer } from '../update/update-check.js';
|
|
4
|
+
/** Minimum supported Node — must match package.json engines.node. */
|
|
5
|
+
const NODE_FLOOR = [18, 17, 0];
|
|
6
|
+
function parseNodeVersion(v) {
|
|
7
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v);
|
|
8
|
+
return m === null ? null : [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
9
|
+
}
|
|
10
|
+
function meetsFloor(v, floor) {
|
|
11
|
+
for (let i = 0; i < 3; i++) {
|
|
12
|
+
if (v[i] > floor[i])
|
|
13
|
+
return true;
|
|
14
|
+
if (v[i] < floor[i])
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function proxyOf(env) {
|
|
20
|
+
return env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy ?? null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run the self-diagnostic. Pure decision core — all network probes are
|
|
24
|
+
* injected via {@link DoctorDeps}, so the logic is fully testable offline.
|
|
25
|
+
*/
|
|
26
|
+
export async function runDoctor(config, deps) {
|
|
27
|
+
const env = config.env ?? process.env;
|
|
28
|
+
const nodeVersion = config.nodeVersion ?? process.version;
|
|
29
|
+
const checks = [];
|
|
30
|
+
// 1. Node version vs the engines floor.
|
|
31
|
+
const parsed = parseNodeVersion(nodeVersion);
|
|
32
|
+
if (parsed !== null && meetsFloor(parsed, NODE_FLOOR)) {
|
|
33
|
+
checks.push({ name: 'node', label: 'Node.js', status: 'ok', detail: `${nodeVersion} (≥ 18.17.0)` });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
checks.push({
|
|
37
|
+
name: 'node',
|
|
38
|
+
label: 'Node.js',
|
|
39
|
+
status: 'fail',
|
|
40
|
+
detail: `${nodeVersion} is below the required 18.17.0`,
|
|
41
|
+
fix: 'Install Node.js 18.17+ (LTS recommended) and re-run your AI client.',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// 2. Proxy env (informational).
|
|
45
|
+
const proxy = proxyOf(env);
|
|
46
|
+
checks.push(proxy !== null
|
|
47
|
+
? { name: 'proxy', label: 'Proxy', status: 'info', detail: `Forward proxy configured: ${proxy}` }
|
|
48
|
+
: { name: 'proxy', label: 'Proxy', status: 'info', detail: 'No proxy configured (direct connection).' });
|
|
49
|
+
// 3. Config presence — without url+token we cannot probe the site.
|
|
50
|
+
const url = config.url;
|
|
51
|
+
const token = config.token;
|
|
52
|
+
if (url === undefined || url === '' || token === undefined || token === '') {
|
|
53
|
+
checks.push({
|
|
54
|
+
name: 'config',
|
|
55
|
+
label: 'Configuration',
|
|
56
|
+
status: 'fail',
|
|
57
|
+
detail: 'Missing site URL and/or bearer token.',
|
|
58
|
+
fix: 'Pass --url <site> --token <key>, or run `npx -y @wootsup/yt-builder-mcp setup` first.',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
checks.push({ name: 'config', label: 'Configuration', status: 'ok', detail: `Target: ${url}` });
|
|
63
|
+
// 4. Reachability + TLS.
|
|
64
|
+
const health = await deps.probeHealth(url);
|
|
65
|
+
if (health.ok) {
|
|
66
|
+
checks.push({
|
|
67
|
+
name: 'reachability',
|
|
68
|
+
label: 'Plugin reachable',
|
|
69
|
+
status: 'ok',
|
|
70
|
+
detail: health.pluginVersion !== undefined ? `OK — plugin ${health.pluginVersion}` : 'OK',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const diag = diagnoseNetworkError(health.error, env);
|
|
75
|
+
checks.push({
|
|
76
|
+
name: 'reachability',
|
|
77
|
+
label: 'Plugin reachable',
|
|
78
|
+
status: 'fail',
|
|
79
|
+
detail: diag !== null ? diag.summary : 'Could not reach the plugin health endpoint.',
|
|
80
|
+
fix: diag !== null ? diag.fix : 'Verify the site URL and that the yt-builder-mcp plugin is active.',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// 5. Bearer validity (only meaningful if the site was reachable).
|
|
84
|
+
if (health.ok) {
|
|
85
|
+
const bearer = await deps.probeBearer(url, token);
|
|
86
|
+
if (bearer.ok) {
|
|
87
|
+
checks.push({ name: 'bearer', label: 'Bearer key', status: 'ok', detail: 'Accepted.' });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const diag = diagnoseNetworkError(bearer.error ?? { status: bearer.status }, env);
|
|
91
|
+
checks.push({
|
|
92
|
+
name: 'bearer',
|
|
93
|
+
label: 'Bearer key',
|
|
94
|
+
status: 'fail',
|
|
95
|
+
detail: bearer.status !== undefined ? `Rejected (HTTP ${bearer.status}).` : 'Rejected.',
|
|
96
|
+
fix: diag !== null && diag.fix.toLowerCase().includes('key')
|
|
97
|
+
? diag.fix
|
|
98
|
+
: 'Re-issue an MCP key in the plugin admin (YT Builder MCP → Keys) and update the token.',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 6. npm registry reachability + cert chain (G-D #10). Run the same
|
|
104
|
+
// classifier as the site check: a corporate TLS-inspection CA breaks the
|
|
105
|
+
// registry too, and the operator must see that fix here, not a generic
|
|
106
|
+
// "could not reach npm". A CA error FAILS (it blocks `npx` upgrades and
|
|
107
|
+
// self-serve); any other failure is a soft WARN (update-check is a
|
|
108
|
+
// courtesy). Skipped entirely when no probeRegistry dep is wired.
|
|
109
|
+
if (deps.probeRegistry !== undefined) {
|
|
110
|
+
const reg = await deps.probeRegistry();
|
|
111
|
+
if (reg.ok) {
|
|
112
|
+
checks.push({ name: 'registry', label: 'npm registry', status: 'ok', detail: 'registry.npmjs.org reachable (TLS chain verified).' });
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const diag = diagnoseNetworkError(reg.error, env);
|
|
116
|
+
const isCa = diag !== null && diag.fix.includes('NODE_EXTRA_CA_CERTS');
|
|
117
|
+
checks.push({
|
|
118
|
+
name: 'registry',
|
|
119
|
+
label: 'npm registry',
|
|
120
|
+
status: isCa ? 'fail' : 'warn',
|
|
121
|
+
detail: diag !== null ? `registry.npmjs.org: ${diag.summary}` : 'Could not reach registry.npmjs.org.',
|
|
122
|
+
fix: diag !== null
|
|
123
|
+
? diag.fix
|
|
124
|
+
: 'Check network/proxy access to registry.npmjs.org (npx pulls @latest from there).',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// 7. Update status (fail-silent — never a hard failure).
|
|
129
|
+
const latest = await deps.fetchLatest(config.packageName).catch(() => null);
|
|
130
|
+
if (latest === null) {
|
|
131
|
+
checks.push({
|
|
132
|
+
name: 'update',
|
|
133
|
+
label: 'Version',
|
|
134
|
+
status: 'info',
|
|
135
|
+
detail: `Running ${config.currentVersion} (could not reach npm to check for updates).`,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else if (isVersionNewer(latest, config.currentVersion)) {
|
|
139
|
+
checks.push({
|
|
140
|
+
name: 'update',
|
|
141
|
+
label: 'Version',
|
|
142
|
+
status: 'warn',
|
|
143
|
+
detail: `Update available: ${config.currentVersion} → ${latest}.`,
|
|
144
|
+
fix: 'Restart your AI client (npx pulls @latest), or `npm i -g @wootsup/yt-builder-mcp@latest`.',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
checks.push({ name: 'update', label: 'Version', status: 'ok', detail: `${config.currentVersion} (latest).` });
|
|
149
|
+
}
|
|
150
|
+
return { checks, ok: !checks.some((c) => c.status === 'fail') };
|
|
151
|
+
}
|
|
152
|
+
const GLYPH = { ok: '✓', warn: '!', fail: '✗', info: 'ℹ' };
|
|
153
|
+
/** Render a {@link DoctorReport} as a readable, fixed-width-ish text block. */
|
|
154
|
+
export function formatDoctorReport(report) {
|
|
155
|
+
const lines = ['yt-builder-mcp doctor', ''];
|
|
156
|
+
for (const c of report.checks) {
|
|
157
|
+
lines.push(` ${GLYPH[c.status]} ${c.label}: ${c.detail}`);
|
|
158
|
+
if (c.fix !== undefined)
|
|
159
|
+
lines.push(` → ${c.fix}`);
|
|
160
|
+
}
|
|
161
|
+
lines.push('');
|
|
162
|
+
lines.push(report.ok ? '✓ All critical checks passed.' : '✗ One or more checks failed — see the fixes above.');
|
|
163
|
+
return lines.join('\n');
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/diagnostics/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
* L1 — Tools kept as first-class entries in `tools/list`.
|
|
43
43
|
* Forwarded by the CapturingServer to the real McpServer.
|
|
44
44
|
*/
|
|
45
|
-
export declare const ESSENTIAL_TOOLS: readonly ["yootheme_builder_pages_list", "yootheme_builder_get_etag", "yootheme_builder_element_list", "yootheme_builder_element_add", "yootheme_builder_element_update_settings", "yootheme_builder_sources_list", "yootheme_builder_element_types_list", "yootheme_builder_inspect_multi_items_binding", "yootheme_builder_element_get", "yootheme_builder_element_delete", "yootheme_builder_element_clone", "yootheme_builder_element_move", "yootheme_builder_page_get_layout", "yootheme_builder_template_summary", "yootheme_builder_element_type_get_schema", "yootheme_builder_sites_list", "yootheme_builder_sites_test", "yootheme_builder_use_site", "yootheme_builder_pages_create", "yootheme_builder_pages_delete", "yootheme_builder_element_bind_source", "yootheme_builder_page_save", "yootheme_builder_page_publish", "yootheme_builder_page_dynamize", "yootheme_builder_scaffold_section"];
|
|
45
|
+
export declare const ESSENTIAL_TOOLS: readonly ["yootheme_builder_pages_list", "yootheme_builder_pages_resolve", "yootheme_builder_get_etag", "yootheme_builder_element_list", "yootheme_builder_element_add", "yootheme_builder_element_update_settings", "yootheme_builder_sources_list", "yootheme_builder_element_types_list", "yootheme_builder_inspect_multi_items_binding", "yootheme_builder_element_get", "yootheme_builder_element_delete", "yootheme_builder_element_clone", "yootheme_builder_element_move", "yootheme_builder_page_get_layout", "yootheme_builder_template_summary", "yootheme_builder_element_type_get_schema", "yootheme_builder_sites_list", "yootheme_builder_sites_test", "yootheme_builder_use_site", "yootheme_builder_pages_create", "yootheme_builder_pages_delete", "yootheme_builder_element_bind_source", "yootheme_builder_page_save", "yootheme_builder_page_publish", "yootheme_builder_page_dynamize", "yootheme_builder_scaffold_section"];
|
|
46
46
|
/**
|
|
47
47
|
* L3 — Tools registered DIRECTLY on the real McpServer, BEFORE the
|
|
48
48
|
* CapturingServer wraps it. The CapturingServer treats these names as a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"essentials.d.ts","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"essentials.d.ts","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe,o5BAoFlB,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mEAGzB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -44,6 +44,11 @@
|
|
|
44
44
|
*/
|
|
45
45
|
export const ESSENTIAL_TOOLS = [
|
|
46
46
|
'yootheme_builder_pages_list',
|
|
47
|
+
// G-A (Track-C URL→layout): pages_resolve is THE core "paste a URL →
|
|
48
|
+
// reach a layout in ≤1 MCP call" tool. It MUST be L1 so a cold agent
|
|
49
|
+
// handed only a frontend URL reaches it directly (the gap fix would be
|
|
50
|
+
// moot if it were hidden behind the advanced gateway). L1 25 → 26.
|
|
51
|
+
'yootheme_builder_pages_resolve',
|
|
47
52
|
'yootheme_builder_get_etag',
|
|
48
53
|
'yootheme_builder_element_list',
|
|
49
54
|
'yootheme_builder_element_add',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"essentials.js","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,6BAA6B;IAC7B,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,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;CAC7B,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"}
|
|
1
|
+
{"version":3,"file":"essentials.js","sourceRoot":"","sources":["../../src/gateway/essentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;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,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;CAC7B,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.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;AAkBH,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,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiHnC;AAkBD,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
15
|
import { isTestMode, loadRegistry } from './auth.js';
|
|
16
16
|
import { ConfigError } from './errors.js';
|
|
17
|
+
import { installGlobalProxyDispatcher } from './net/proxy-dispatcher.js';
|
|
18
|
+
import { SERVER_VERSION } from './server.js';
|
|
19
|
+
import { checkForUpdate, formatUpdateNotice } from './update/update-check.js';
|
|
20
|
+
/** npm package name — used by the startup update-notice + the diagnose tool. */
|
|
21
|
+
const MCP_PACKAGE_NAME = '@wootsup/yt-builder-mcp';
|
|
17
22
|
import { bootstrapActiveSite } from './sites/bootstrap.js';
|
|
18
23
|
import { ClientPool } from './sites/client-pool.js';
|
|
19
24
|
import { SiteRegistry } from './sites/registry.js';
|
|
@@ -36,6 +41,36 @@ export { CapturingServer, } from './gateway/capturing-server.js';
|
|
|
36
41
|
export { registerAdvancedTool } from './gateway/advanced-tool.js';
|
|
37
42
|
export { collectAllRegisteredTools, findTool, } from './gateway/test-support.js';
|
|
38
43
|
async function main() {
|
|
44
|
+
// Honor an enterprise HTTP(S)_PROXY / NO_PROXY before any outbound call —
|
|
45
|
+
// BOTH proxy mode (below) and fat mode use Node's global fetch, which reads
|
|
46
|
+
// this global dispatcher. Unconditional + passthrough-safe (no proxy env =
|
|
47
|
+
// direct). Also auto-derives NO_PROXY for an internal site host (gap #9).
|
|
48
|
+
// See net/proxy-dispatcher.ts.
|
|
49
|
+
installGlobalProxyDispatcher();
|
|
50
|
+
// Gap #14 — surface any YTB_MCP_EXTRA_HEADERS parse warnings ONCE at startup
|
|
51
|
+
// (dropped lines / a forbidden Authorization key) so a misconfigured corp
|
|
52
|
+
// header isn't silently ignored. stderr only — stdout is the JSON-RPC channel.
|
|
53
|
+
if (!isTestMode()) {
|
|
54
|
+
const { parseExtraHeaders } = await import('./net/extra-headers.js');
|
|
55
|
+
for (const w of parseExtraHeaders().warnings) {
|
|
56
|
+
process.stderr.write(`[yt-builder-mcp] ${w}\n`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Update notice (non-blocking, cached 24h, fail-silent) — surfaces a newer
|
|
60
|
+
// npm version to stderr without ever delaying serving or breaking behind a
|
|
61
|
+
// corporate proxy. Skipped in test-mode (the smoke probe must not hit the
|
|
62
|
+
// network). stderr only — stdout is the JSON-RPC channel.
|
|
63
|
+
if (!isTestMode()) {
|
|
64
|
+
void checkForUpdate({ currentVersion: SERVER_VERSION, packageName: MCP_PACKAGE_NAME })
|
|
65
|
+
.then((status) => {
|
|
66
|
+
const notice = formatUpdateNotice(status);
|
|
67
|
+
if (notice !== null)
|
|
68
|
+
console.error(notice);
|
|
69
|
+
})
|
|
70
|
+
.catch(() => {
|
|
71
|
+
/* fail-silent — the notifier is a courtesy, never a dependency */
|
|
72
|
+
});
|
|
73
|
+
}
|
|
39
74
|
// Proxy mode: forward stdio 1:1 to the plugin-served PHP MCP endpoint and
|
|
40
75
|
// stop here — the fat catalog below is bypassed entirely. Default (fat) is
|
|
41
76
|
// 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":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/install-skill.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Idempotent: re-running overwrites existing skill files and skips the
|
|
9
9
|
* AGENTS.md append when the marker is already present.
|
|
10
10
|
*
|
|
11
|
-
* Mirrors the pattern from `@wootsup/mcp install-skill` so users on both
|
|
11
|
+
* Mirrors the pattern from `@wootsup/apimapper-mcp install-skill` so users on both
|
|
12
12
|
* products get the same workflow.
|
|
13
13
|
*
|
|
14
14
|
* @license MIT
|
package/dist/install-skill.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Idempotent: re-running overwrites existing skill files and skips the
|
|
9
9
|
* AGENTS.md append when the marker is already present.
|
|
10
10
|
*
|
|
11
|
-
* Mirrors the pattern from `@wootsup/mcp install-skill` so users on both
|
|
11
|
+
* Mirrors the pattern from `@wootsup/apimapper-mcp install-skill` so users on both
|
|
12
12
|
* products get the same workflow.
|
|
13
13
|
*
|
|
14
14
|
* @license MIT
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse `YTB_MCP_EXTRA_HEADERS` into a header map that is merged into EVERY
|
|
3
|
+
* outbound request on BOTH transports (fat-mode {@link RestClient} and
|
|
4
|
+
* proxy-mode `StreamableHTTPClientTransport`).
|
|
5
|
+
*
|
|
6
|
+
* Why this exists (Glöckle gap #14): a WordPress/Joomla site fronted by HTTP
|
|
7
|
+
* Basic-Auth, a WAF cookie, or a custom required header (e.g. a corporate
|
|
8
|
+
* gateway secret) cannot be reached — the only header we ever send is
|
|
9
|
+
* `Authorization: Bearer …`. This env var lets the operator attach the extra
|
|
10
|
+
* header(s) the gateway demands WITHOUT us inventing per-provider knobs.
|
|
11
|
+
*
|
|
12
|
+
* ── Accepted formats (auto-detected) ───────────────────────────────────────
|
|
13
|
+
* The value is read as ONE of two shapes, in this precedence:
|
|
14
|
+
*
|
|
15
|
+
* 1. **JSON object** — `{"X-WAF-Token":"abc","Cookie":"sid=42"}`.
|
|
16
|
+
* Used when the trimmed value starts with `{` AND parses as a non-array
|
|
17
|
+
* object. Non-string values are coerced via String(); null/array values
|
|
18
|
+
* are dropped (with a warning).
|
|
19
|
+
*
|
|
20
|
+
* 2. **`Name: value` lines** — one header per line, first `:` splits:
|
|
21
|
+
*
|
|
22
|
+
* X-WAF-Token: abc
|
|
23
|
+
* Cookie: sid=42
|
|
24
|
+
*
|
|
25
|
+
* Blank lines and lines starting with `#` (comments) are ignored. A line
|
|
26
|
+
* with no `:` is dropped with a warning.
|
|
27
|
+
*
|
|
28
|
+
* ── Hard invariants ─────────────────────────────────────────────────────────
|
|
29
|
+
* - **`Authorization` can NEVER be set here.** Any `Authorization` key (case-
|
|
30
|
+
* insensitive) in the parsed map is dropped with a warning — the Bearer is
|
|
31
|
+
* owned by the auth layer and an extra header must never overwrite it. This
|
|
32
|
+
* is the parse-side half of "Bearer always wins"; the merge-side half lives
|
|
33
|
+
* in {@link mergeExtraHeaders}.
|
|
34
|
+
* - Empty header NAMES are dropped. Empty VALUES are kept (a deliberately
|
|
35
|
+
* blank header is a legitimate, if rare, gateway requirement).
|
|
36
|
+
*
|
|
37
|
+
* Pure + deterministic. `warn` collects non-fatal issues; the caller decides
|
|
38
|
+
* whether to surface them (the server logs them once to stderr at startup).
|
|
39
|
+
*
|
|
40
|
+
* @license MIT
|
|
41
|
+
*/
|
|
42
|
+
/** Canonical env-var name for the extra-headers feature. */
|
|
43
|
+
export declare const ENV_EXTRA_HEADERS = "YTB_MCP_EXTRA_HEADERS";
|
|
44
|
+
export interface ParsedExtraHeaders {
|
|
45
|
+
/** The accepted header map (never contains `Authorization`). */
|
|
46
|
+
readonly headers: Record<string, string>;
|
|
47
|
+
/** Non-fatal issues (dropped lines, forbidden keys, bad JSON shape). */
|
|
48
|
+
readonly warnings: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse `YTB_MCP_EXTRA_HEADERS` from `env` (default `process.env`). Returns an
|
|
52
|
+
* empty map (no warnings) when the var is unset/blank.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseExtraHeaders(env?: NodeJS.ProcessEnv): ParsedExtraHeaders;
|
|
55
|
+
/**
|
|
56
|
+
* Merge extra headers UNDER an existing header set so the caller's headers
|
|
57
|
+
* (which always include `Authorization: Bearer …`) win on collision. Extra
|
|
58
|
+
* headers fill gaps; they never overwrite. Case-insensitive collision check so
|
|
59
|
+
* a `authorization` extra can never shadow a real `Authorization`.
|
|
60
|
+
*
|
|
61
|
+
* @param base Authoritative headers (Bearer, Accept, Content-Type, If-Match…).
|
|
62
|
+
* @param extra Parsed extra headers to merge underneath `base`.
|
|
63
|
+
* @returns A fresh record; inputs are not mutated.
|
|
64
|
+
*/
|
|
65
|
+
export declare function mergeExtraHeaders(base: Record<string, string>, extra: Record<string, string>): Record<string, string>;
|
|
66
|
+
//# sourceMappingURL=extra-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extra-headers.d.ts","sourceRoot":"","sources":["../../src/net/extra-headers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,4DAA4D;AAC5D,eAAO,MAAM,iBAAiB,0BAA0B,CAAC;AAKzD,MAAM,WAAW,kBAAkB;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAwED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAiB1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// packages/mcp/src/net/extra-headers.ts
|
|
2
|
+
/**
|
|
3
|
+
* Parse `YTB_MCP_EXTRA_HEADERS` into a header map that is merged into EVERY
|
|
4
|
+
* outbound request on BOTH transports (fat-mode {@link RestClient} and
|
|
5
|
+
* proxy-mode `StreamableHTTPClientTransport`).
|
|
6
|
+
*
|
|
7
|
+
* Why this exists (Glöckle gap #14): a WordPress/Joomla site fronted by HTTP
|
|
8
|
+
* Basic-Auth, a WAF cookie, or a custom required header (e.g. a corporate
|
|
9
|
+
* gateway secret) cannot be reached — the only header we ever send is
|
|
10
|
+
* `Authorization: Bearer …`. This env var lets the operator attach the extra
|
|
11
|
+
* header(s) the gateway demands WITHOUT us inventing per-provider knobs.
|
|
12
|
+
*
|
|
13
|
+
* ── Accepted formats (auto-detected) ───────────────────────────────────────
|
|
14
|
+
* The value is read as ONE of two shapes, in this precedence:
|
|
15
|
+
*
|
|
16
|
+
* 1. **JSON object** — `{"X-WAF-Token":"abc","Cookie":"sid=42"}`.
|
|
17
|
+
* Used when the trimmed value starts with `{` AND parses as a non-array
|
|
18
|
+
* object. Non-string values are coerced via String(); null/array values
|
|
19
|
+
* are dropped (with a warning).
|
|
20
|
+
*
|
|
21
|
+
* 2. **`Name: value` lines** — one header per line, first `:` splits:
|
|
22
|
+
*
|
|
23
|
+
* X-WAF-Token: abc
|
|
24
|
+
* Cookie: sid=42
|
|
25
|
+
*
|
|
26
|
+
* Blank lines and lines starting with `#` (comments) are ignored. A line
|
|
27
|
+
* with no `:` is dropped with a warning.
|
|
28
|
+
*
|
|
29
|
+
* ── Hard invariants ─────────────────────────────────────────────────────────
|
|
30
|
+
* - **`Authorization` can NEVER be set here.** Any `Authorization` key (case-
|
|
31
|
+
* insensitive) in the parsed map is dropped with a warning — the Bearer is
|
|
32
|
+
* owned by the auth layer and an extra header must never overwrite it. This
|
|
33
|
+
* is the parse-side half of "Bearer always wins"; the merge-side half lives
|
|
34
|
+
* in {@link mergeExtraHeaders}.
|
|
35
|
+
* - Empty header NAMES are dropped. Empty VALUES are kept (a deliberately
|
|
36
|
+
* blank header is a legitimate, if rare, gateway requirement).
|
|
37
|
+
*
|
|
38
|
+
* Pure + deterministic. `warn` collects non-fatal issues; the caller decides
|
|
39
|
+
* whether to surface them (the server logs them once to stderr at startup).
|
|
40
|
+
*
|
|
41
|
+
* @license MIT
|
|
42
|
+
*/
|
|
43
|
+
/** Canonical env-var name for the extra-headers feature. */
|
|
44
|
+
export const ENV_EXTRA_HEADERS = 'YTB_MCP_EXTRA_HEADERS';
|
|
45
|
+
/** Header names that may never be supplied via the extra-headers env var. */
|
|
46
|
+
const FORBIDDEN_HEADER_NAMES = new Set(['authorization']);
|
|
47
|
+
/** Is `name` a header we refuse to let the env var set? Case-insensitive. */
|
|
48
|
+
function isForbidden(name) {
|
|
49
|
+
return FORBIDDEN_HEADER_NAMES.has(name.trim().toLowerCase());
|
|
50
|
+
}
|
|
51
|
+
/** Coerce a JSON value to a string, or null when it cannot sanely become one. */
|
|
52
|
+
function coerceValue(value) {
|
|
53
|
+
if (typeof value === 'string')
|
|
54
|
+
return value;
|
|
55
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
56
|
+
return String(value);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/** Parse the JSON-object form. Returns null when `raw` is not a JSON object. */
|
|
60
|
+
function parseJsonObject(raw, warnings) {
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = JSON.parse(raw);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const out = {};
|
|
72
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
73
|
+
const name = key.trim();
|
|
74
|
+
if (name === '') {
|
|
75
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: dropped an entry with an empty header name.`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (isForbidden(name)) {
|
|
79
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: "${name}" is ignored — the Bearer token is set automatically and can never be overridden here.`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const coerced = coerceValue(value);
|
|
83
|
+
if (coerced === null) {
|
|
84
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: dropped header "${name}" — its value is not a string/number/boolean.`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
out[name] = coerced;
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
/** Parse the `Name: value` line form. */
|
|
92
|
+
function parseLines(raw, warnings) {
|
|
93
|
+
const out = {};
|
|
94
|
+
for (const lineRaw of raw.split(/\r?\n/)) {
|
|
95
|
+
const line = lineRaw.trim();
|
|
96
|
+
if (line === '' || line.startsWith('#'))
|
|
97
|
+
continue;
|
|
98
|
+
const idx = line.indexOf(':');
|
|
99
|
+
if (idx < 0) {
|
|
100
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: dropped line with no ":" separator — "${line}".`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const name = line.slice(0, idx).trim();
|
|
104
|
+
const value = line.slice(idx + 1).trim();
|
|
105
|
+
if (name === '') {
|
|
106
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: dropped a line with an empty header name.`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (isForbidden(name)) {
|
|
110
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: "${name}" is ignored — the Bearer token is set automatically and can never be overridden here.`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
out[name] = value;
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse `YTB_MCP_EXTRA_HEADERS` from `env` (default `process.env`). Returns an
|
|
119
|
+
* empty map (no warnings) when the var is unset/blank.
|
|
120
|
+
*/
|
|
121
|
+
export function parseExtraHeaders(env = process.env) {
|
|
122
|
+
const raw = (env[ENV_EXTRA_HEADERS] ?? '').trim();
|
|
123
|
+
if (raw === '') {
|
|
124
|
+
return { headers: {}, warnings: [] };
|
|
125
|
+
}
|
|
126
|
+
const warnings = [];
|
|
127
|
+
// JSON-object form wins when the value looks like an object literal.
|
|
128
|
+
if (raw.startsWith('{')) {
|
|
129
|
+
const obj = parseJsonObject(raw, warnings);
|
|
130
|
+
if (obj !== null) {
|
|
131
|
+
return { headers: obj, warnings };
|
|
132
|
+
}
|
|
133
|
+
// Looked like JSON but didn't parse — fall back to line-parsing rather
|
|
134
|
+
// than silently dropping everything, and say so.
|
|
135
|
+
warnings.push(`${ENV_EXTRA_HEADERS}: value started with "{" but is not valid JSON — falling back to "Name: value" line parsing.`);
|
|
136
|
+
}
|
|
137
|
+
return { headers: parseLines(raw, warnings), warnings };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Merge extra headers UNDER an existing header set so the caller's headers
|
|
141
|
+
* (which always include `Authorization: Bearer …`) win on collision. Extra
|
|
142
|
+
* headers fill gaps; they never overwrite. Case-insensitive collision check so
|
|
143
|
+
* a `authorization` extra can never shadow a real `Authorization`.
|
|
144
|
+
*
|
|
145
|
+
* @param base Authoritative headers (Bearer, Accept, Content-Type, If-Match…).
|
|
146
|
+
* @param extra Parsed extra headers to merge underneath `base`.
|
|
147
|
+
* @returns A fresh record; inputs are not mutated.
|
|
148
|
+
*/
|
|
149
|
+
export function mergeExtraHeaders(base, extra) {
|
|
150
|
+
const lowerBaseKeys = new Set(Object.keys(base).map((k) => k.toLowerCase()));
|
|
151
|
+
const merged = {};
|
|
152
|
+
// Extra first, so a same-name base key overwrites it below.
|
|
153
|
+
for (const [name, value] of Object.entries(extra)) {
|
|
154
|
+
// Never let an extra header shadow a base header (esp. Authorization).
|
|
155
|
+
if (lowerBaseKeys.has(name.toLowerCase()))
|
|
156
|
+
continue;
|
|
157
|
+
merged[name] = value;
|
|
158
|
+
}
|
|
159
|
+
for (const [name, value] of Object.entries(base)) {
|
|
160
|
+
merged[name] = value;
|
|
161
|
+
}
|
|
162
|
+
return merged;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=extra-headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extra-headers.js","sourceRoot":"","sources":["../../src/net/extra-headers.ts"],"names":[],"mappings":"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"}
|