wrapguard-mcp 0.1.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/LICENSE +21 -0
- package/README.md +137 -0
- package/SECURITY.md +22 -0
- package/dist/audit.d.ts +6 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +370 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/fixes.d.ts +18 -0
- package/dist/fixes.d.ts.map +1 -0
- package/dist/fixes.js +68 -0
- package/dist/fixes.js.map +1 -0
- package/dist/http.d.ts +3 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +78 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/security.d.ts +4 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +61 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +114 -0
- package/dist/server.js.map +1 -0
- package/dist/stdio.d.ts +3 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +17 -0
- package/dist/stdio.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
- package/wrapguard.config.example.json +24 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WrapGuardConfig } from "./types.js";
|
|
2
|
+
export declare function loadConfig(explicitPath?: string): Promise<WrapGuardConfig>;
|
|
3
|
+
export declare function publicConfig(config: WrapGuardConfig): Omit<WrapGuardConfig, "allowedFileRoots"> & {
|
|
4
|
+
allowedFileRoots: string[];
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmClD,wBAAsB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BhF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG;IACjG,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAEA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const configSchema = z.object({
|
|
5
|
+
serverName: z.string().trim().min(1).max(80).default("WrapGuard MCP"),
|
|
6
|
+
defaultLocale: z.enum(["auto", "ko", "en"]).default("auto"),
|
|
7
|
+
viewports: z.array(z.number().int().min(240).max(7680)).min(1).max(12).default([320, 375, 768, 1024]),
|
|
8
|
+
allowedHosts: z.array(z.string().trim().min(1)).default(["localhost", "127.0.0.1"]),
|
|
9
|
+
allowedFileRoots: z.array(z.string().trim().min(1)).default(["."]),
|
|
10
|
+
ignoreSelectors: z
|
|
11
|
+
.array(z.string().trim().min(1))
|
|
12
|
+
.default(["code", "pre", "kbd", "samp", "[data-wrapguard-ignore]"]),
|
|
13
|
+
ignorePatterns: z
|
|
14
|
+
.array(z.string())
|
|
15
|
+
.default(["https?://\\S+", "^SHA-?\\d+", "\\b[0-9a-fA-F]{32,}\\b"]),
|
|
16
|
+
timeoutMs: z.number().int().min(1000).max(180000).default(30000),
|
|
17
|
+
browserHeadless: z.boolean().default(true),
|
|
18
|
+
browserChannel: z.enum(["auto", "chromium", "chrome", "msedge"]).default("auto"),
|
|
19
|
+
allowRemoteUrls: z.boolean().default(false),
|
|
20
|
+
allowWrites: z.boolean().default(false)
|
|
21
|
+
});
|
|
22
|
+
function resolveConfigPath(explicitPath) {
|
|
23
|
+
const candidate = explicitPath ?? process.env.WRAPGUARD_CONFIG;
|
|
24
|
+
if (candidate)
|
|
25
|
+
return path.resolve(candidate);
|
|
26
|
+
const conventional = path.resolve("wrapguard.config.json");
|
|
27
|
+
return conventional;
|
|
28
|
+
}
|
|
29
|
+
function safeServerName(name) {
|
|
30
|
+
if (/\p{C}/u.test(name)) {
|
|
31
|
+
throw new Error("serverName must not contain control characters");
|
|
32
|
+
}
|
|
33
|
+
return name;
|
|
34
|
+
}
|
|
35
|
+
export async function loadConfig(explicitPath) {
|
|
36
|
+
const configPath = resolveConfigPath(explicitPath);
|
|
37
|
+
let parsed = {};
|
|
38
|
+
let baseDir = process.cwd();
|
|
39
|
+
if (configPath) {
|
|
40
|
+
try {
|
|
41
|
+
parsed = JSON.parse(await readFile(configPath, "utf8"));
|
|
42
|
+
baseDir = path.dirname(configPath);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const code = error.code;
|
|
46
|
+
if (code !== "ENOENT")
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const candidate = typeof parsed === "object" && parsed !== null ? { ...parsed } : {};
|
|
51
|
+
if (process.env.WRAPGUARD_SERVER_NAME?.trim()) {
|
|
52
|
+
Object.assign(candidate, { serverName: process.env.WRAPGUARD_SERVER_NAME.trim() });
|
|
53
|
+
}
|
|
54
|
+
const config = configSchema.parse(candidate);
|
|
55
|
+
return {
|
|
56
|
+
...config,
|
|
57
|
+
serverName: safeServerName(config.serverName),
|
|
58
|
+
viewports: [...new Set(config.viewports)].sort((a, b) => a - b),
|
|
59
|
+
allowedHosts: config.allowedHosts.map(host => host.toLowerCase()),
|
|
60
|
+
allowedFileRoots: config.allowedFileRoots.map(root => path.resolve(baseDir, root))
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function publicConfig(config) {
|
|
64
|
+
return { ...config, allowedFileRoots: [...config.allowedFileRoots] };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/fixes.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LocaleSetting, WrapGuardConfig } from "./types.js";
|
|
2
|
+
export type FixProfile = "prose-ko" | "prose-en" | "prose-mixed" | "raw-evidence" | "code-url";
|
|
3
|
+
export declare function profileFor(locale: LocaleSetting | "mixed", contentKind?: string): FixProfile;
|
|
4
|
+
export declare function cssForProfile(profile: FixProfile): string;
|
|
5
|
+
export declare function buildCssRule(selector: string, profile: FixProfile): string;
|
|
6
|
+
export declare function applyCssFix(options: {
|
|
7
|
+
cssFile: string;
|
|
8
|
+
selector: string;
|
|
9
|
+
profile: FixProfile;
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
config: WrapGuardConfig;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
changed: boolean;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
cssFile: string;
|
|
16
|
+
rule: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=fixes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixes.d.ts","sourceRoot":"","sources":["../src/fixes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGjE,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,CAAC;AAE/F,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,EAAE,WAAW,SAAU,GAAG,UAAU,CAM7F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAiCzD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAS1E;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAShF"}
|
package/dist/fixes.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { assertWritableFile } from "./security.js";
|
|
3
|
+
export function profileFor(locale, contentKind = "prose") {
|
|
4
|
+
if (contentKind === "raw-evidence")
|
|
5
|
+
return "raw-evidence";
|
|
6
|
+
if (contentKind === "code-url")
|
|
7
|
+
return "code-url";
|
|
8
|
+
if (locale === "ko")
|
|
9
|
+
return "prose-ko";
|
|
10
|
+
if (locale === "en")
|
|
11
|
+
return "prose-en";
|
|
12
|
+
return "prose-mixed";
|
|
13
|
+
}
|
|
14
|
+
export function cssForProfile(profile) {
|
|
15
|
+
switch (profile) {
|
|
16
|
+
case "prose-ko":
|
|
17
|
+
return [
|
|
18
|
+
"word-break: keep-all;",
|
|
19
|
+
"overflow-wrap: break-word;",
|
|
20
|
+
"line-break: strict;",
|
|
21
|
+
"text-wrap: pretty;"
|
|
22
|
+
].join("\n");
|
|
23
|
+
case "prose-en":
|
|
24
|
+
return [
|
|
25
|
+
"word-break: normal;",
|
|
26
|
+
"overflow-wrap: break-word;",
|
|
27
|
+
"hyphens: manual;",
|
|
28
|
+
"text-wrap: pretty;"
|
|
29
|
+
].join("\n");
|
|
30
|
+
case "prose-mixed":
|
|
31
|
+
return [
|
|
32
|
+
"word-break: keep-all;",
|
|
33
|
+
"overflow-wrap: break-word;",
|
|
34
|
+
"line-break: strict;",
|
|
35
|
+
"hyphens: manual;",
|
|
36
|
+
"text-wrap: pretty;"
|
|
37
|
+
].join("\n");
|
|
38
|
+
case "raw-evidence":
|
|
39
|
+
return [
|
|
40
|
+
"/* Preserve the immutable raw text separately. */",
|
|
41
|
+
"white-space: pre-wrap;",
|
|
42
|
+
"overflow-wrap: anywhere;"
|
|
43
|
+
].join("\n");
|
|
44
|
+
case "code-url":
|
|
45
|
+
return ["word-break: normal;", "overflow-wrap: anywhere;"].join("\n");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function buildCssRule(selector, profile) {
|
|
49
|
+
if (!selector.trim() || /[{}]/.test(selector)) {
|
|
50
|
+
throw new Error("selector must be non-empty and must not contain braces");
|
|
51
|
+
}
|
|
52
|
+
const declarations = cssForProfile(profile)
|
|
53
|
+
.split("\n")
|
|
54
|
+
.map(line => ` ${line}`)
|
|
55
|
+
.join("\n");
|
|
56
|
+
return `${selector.trim()} {\n${declarations}\n}`;
|
|
57
|
+
}
|
|
58
|
+
export async function applyCssFix(options) {
|
|
59
|
+
const rule = buildCssRule(options.selector, options.profile);
|
|
60
|
+
const current = await readFile(options.cssFile, "utf8");
|
|
61
|
+
const changed = !current.includes(rule);
|
|
62
|
+
if (!options.dryRun && changed) {
|
|
63
|
+
const file = await assertWritableFile(options.cssFile, options.config);
|
|
64
|
+
await writeFile(file, `${current.trimEnd()}\n\n/* Added by WrapGuard MCP */\n${rule}\n`, "utf8");
|
|
65
|
+
}
|
|
66
|
+
return { changed, dryRun: options.dryRun, cssFile: options.cssFile, rule };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixes.js","sourceRoot":"","sources":["../src/fixes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,UAAU,UAAU,CAAC,MAA+B,EAAE,WAAW,GAAG,OAAO;IAC/E,IAAI,WAAW,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IAC1D,IAAI,WAAW,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAmB;IAC/C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO;gBACL,uBAAuB;gBACvB,4BAA4B;gBAC5B,qBAAqB;gBACrB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,UAAU;YACb,OAAO;gBACL,qBAAqB;gBACrB,4BAA4B;gBAC5B,kBAAkB;gBAClB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,aAAa;YAChB,OAAO;gBACL,uBAAuB;gBACvB,4BAA4B;gBAC5B,qBAAqB;gBACrB,kBAAkB;gBAClB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,cAAc;YACjB,OAAO;gBACL,mDAAmD;gBACnD,wBAAwB;gBACxB,0BAA0B;aAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAmB;IAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;SACxC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAMjC;IACC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,qCAAqC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7E,CAAC"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":""}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { timingSafeEqual } from "node:crypto";
|
|
4
|
+
import { hostHeaderValidation, originValidation, toNodeHandler } from "@modelcontextprotocol/node";
|
|
5
|
+
import { createMcpHandler } from "@modelcontextprotocol/server";
|
|
6
|
+
import { loadConfig } from "./config.js";
|
|
7
|
+
import { buildMcpServer } from "./server.js";
|
|
8
|
+
const config = await loadConfig();
|
|
9
|
+
const port = Number.parseInt(process.env.PORT ?? "8787", 10);
|
|
10
|
+
const token = process.env.WRAPGUARD_HTTP_TOKEN?.trim();
|
|
11
|
+
const bindHost = process.env.HOST?.trim() || (token ? "0.0.0.0" : "127.0.0.1");
|
|
12
|
+
const allowedHttpHosts = (process.env.WRAPGUARD_HTTP_HOSTS ?? "localhost,127.0.0.1,[::1]")
|
|
13
|
+
.split(",")
|
|
14
|
+
.map(item => item.trim())
|
|
15
|
+
.filter(Boolean);
|
|
16
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
17
|
+
throw new Error("PORT must be between 1 and 65535");
|
|
18
|
+
if (bindHost !== "127.0.0.1" && bindHost !== "localhost" && bindHost !== "::1" && !token) {
|
|
19
|
+
throw new Error("WRAPGUARD_HTTP_TOKEN is required when binding beyond loopback");
|
|
20
|
+
}
|
|
21
|
+
const handler = createMcpHandler(() => buildMcpServer(config), {
|
|
22
|
+
legacy: "stateless",
|
|
23
|
+
onerror(error) {
|
|
24
|
+
process.stderr.write(`[wrapguard-http] ${error.message}\n`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const mcpHandler = toNodeHandler(handler);
|
|
28
|
+
const validateHost = hostHeaderValidation(allowedHttpHosts);
|
|
29
|
+
const validateOrigin = originValidation(allowedHttpHosts);
|
|
30
|
+
function validBearer(value) {
|
|
31
|
+
if (!token)
|
|
32
|
+
return true;
|
|
33
|
+
const prefix = "Bearer ";
|
|
34
|
+
if (!value?.startsWith(prefix))
|
|
35
|
+
return false;
|
|
36
|
+
const presented = Buffer.from(value.slice(prefix.length));
|
|
37
|
+
const expected = Buffer.from(token);
|
|
38
|
+
return presented.length === expected.length && timingSafeEqual(presented, expected);
|
|
39
|
+
}
|
|
40
|
+
const httpServer = createServer(async (req, res) => {
|
|
41
|
+
const pathname = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`).pathname;
|
|
42
|
+
if (pathname === "/health") {
|
|
43
|
+
res.writeHead(200, { "content-type": "application/json; charset=utf-8" });
|
|
44
|
+
res.end(JSON.stringify({ ok: true, name: config.serverName }));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (pathname !== "/mcp") {
|
|
48
|
+
res.writeHead(404, { "content-type": "application/json; charset=utf-8" });
|
|
49
|
+
res.end(JSON.stringify({ error: "not_found" }));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!validateHost(req, res) || !validateOrigin(req, res))
|
|
53
|
+
return;
|
|
54
|
+
if (!validBearer(req.headers.authorization)) {
|
|
55
|
+
res.writeHead(401, {
|
|
56
|
+
"content-type": "application/json; charset=utf-8",
|
|
57
|
+
"www-authenticate": "Bearer"
|
|
58
|
+
});
|
|
59
|
+
res.end(JSON.stringify({ error: "unauthorized" }));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!req.method) {
|
|
63
|
+
res.writeHead(400, { "content-type": "application/json; charset=utf-8" });
|
|
64
|
+
res.end(JSON.stringify({ error: "missing_method" }));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
await mcpHandler(req, res);
|
|
68
|
+
});
|
|
69
|
+
httpServer.listen(port, bindHost, () => {
|
|
70
|
+
process.stderr.write(`[wrapguard-http] ${config.serverName} listening on http://${bindHost}:${port}/mcp\n`);
|
|
71
|
+
});
|
|
72
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
73
|
+
process.on(signal, async () => {
|
|
74
|
+
await handler.close();
|
|
75
|
+
httpServer.close(() => process.exit(0));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
|
|
2
|
+
export { loadConfig } from "./config.js";
|
|
3
|
+
export { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
|
|
4
|
+
export { buildMcpServer } from "./server.js";
|
|
5
|
+
export type * from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,mBAAmB,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
|
|
2
|
+
export { loadConfig } from "./config.js";
|
|
3
|
+
export { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
|
|
4
|
+
export { buildMcpServer } from "./server.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WrapGuardConfig } from "./types.js";
|
|
2
|
+
export declare function resolveAuditTarget(target: string, config: WrapGuardConfig): Promise<string>;
|
|
3
|
+
export declare function assertWritableFile(filePath: string, config: WrapGuardConfig): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA0CjG;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAQnG"}
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
function isWithin(candidate, root) {
|
|
5
|
+
const relative = path.relative(root, candidate);
|
|
6
|
+
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
|
|
7
|
+
}
|
|
8
|
+
async function canonicalPath(candidate) {
|
|
9
|
+
return realpath(path.resolve(candidate));
|
|
10
|
+
}
|
|
11
|
+
export async function resolveAuditTarget(target, config) {
|
|
12
|
+
let url;
|
|
13
|
+
const windowsAbsolutePath = /^[A-Za-z]:[\\/]/.test(target) || target.startsWith("\\\\");
|
|
14
|
+
if (!windowsAbsolutePath) {
|
|
15
|
+
try {
|
|
16
|
+
url = new URL(target);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
url = undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (!url) {
|
|
23
|
+
const file = await canonicalPath(target);
|
|
24
|
+
const roots = await Promise.all(config.allowedFileRoots.map(root => canonicalPath(root).catch(() => path.resolve(root))));
|
|
25
|
+
if (!roots.some(root => isWithin(file, root))) {
|
|
26
|
+
throw new Error(`Local file is outside allowedFileRoots: ${file}`);
|
|
27
|
+
}
|
|
28
|
+
return pathToFileURL(file).href;
|
|
29
|
+
}
|
|
30
|
+
if (url.protocol === "file:") {
|
|
31
|
+
const file = await canonicalPath(decodeURIComponent(url.pathname.replace(/^\/(?:([A-Za-z]:))/, "$1")));
|
|
32
|
+
const roots = await Promise.all(config.allowedFileRoots.map(root => canonicalPath(root).catch(() => path.resolve(root))));
|
|
33
|
+
if (!roots.some(root => isWithin(file, root))) {
|
|
34
|
+
throw new Error(`Local file is outside allowedFileRoots: ${file}`);
|
|
35
|
+
}
|
|
36
|
+
return pathToFileURL(file).href;
|
|
37
|
+
}
|
|
38
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
39
|
+
throw new Error(`Unsupported protocol: ${url.protocol}`);
|
|
40
|
+
}
|
|
41
|
+
const hostname = url.hostname.toLowerCase();
|
|
42
|
+
const local = hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
|
|
43
|
+
if (!local && !config.allowRemoteUrls) {
|
|
44
|
+
throw new Error("Remote URL auditing is disabled. Set allowRemoteUrls and an explicit allowedHosts entry.");
|
|
45
|
+
}
|
|
46
|
+
if (!config.allowedHosts.includes(hostname)) {
|
|
47
|
+
throw new Error(`Host is not allowlisted: ${hostname}`);
|
|
48
|
+
}
|
|
49
|
+
return url.href;
|
|
50
|
+
}
|
|
51
|
+
export async function assertWritableFile(filePath, config) {
|
|
52
|
+
if (!config.allowWrites)
|
|
53
|
+
throw new Error("File writes are disabled by configuration");
|
|
54
|
+
const file = path.resolve(filePath);
|
|
55
|
+
const roots = config.allowedFileRoots.map(root => path.resolve(root));
|
|
56
|
+
if (!roots.some(root => isWithin(file, root))) {
|
|
57
|
+
throw new Error(`Write target is outside allowedFileRoots: ${file}`);
|
|
58
|
+
}
|
|
59
|
+
return file;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqBlD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAiIjE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
|
|
6
|
+
import { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
|
|
7
|
+
const localeSchema = z.enum(["auto", "ko", "en"]);
|
|
8
|
+
const profileSchema = z.enum(["prose-ko", "prose-en", "prose-mixed", "raw-evidence", "code-url"]);
|
|
9
|
+
const jsonResult = (value) => ({
|
|
10
|
+
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
11
|
+
structuredContent: value
|
|
12
|
+
});
|
|
13
|
+
async function guarded(operation) {
|
|
14
|
+
try {
|
|
15
|
+
return jsonResult(await operation());
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }],
|
|
20
|
+
isError: true
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function buildMcpServer(config) {
|
|
25
|
+
const server = new McpServer({ name: config.serverName, version: WRAPGUARD_VERSION }, { capabilities: { tools: {} } });
|
|
26
|
+
server.registerTool("server_info", {
|
|
27
|
+
title: "WrapGuard server information",
|
|
28
|
+
description: "Show the configured display name, safety policy, and supported languages.",
|
|
29
|
+
inputSchema: z.object({}),
|
|
30
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
31
|
+
}, async () => jsonResult({
|
|
32
|
+
name: config.serverName,
|
|
33
|
+
version: WRAPGUARD_VERSION,
|
|
34
|
+
languages: ["ko", "en"],
|
|
35
|
+
viewports: config.viewports,
|
|
36
|
+
allowRemoteUrls: config.allowRemoteUrls,
|
|
37
|
+
allowWrites: config.allowWrites
|
|
38
|
+
}));
|
|
39
|
+
const auditInput = z.object({
|
|
40
|
+
target: z.string().min(1).describe("Allowed local HTML path, file URL, or allowlisted HTTP(S) URL"),
|
|
41
|
+
viewports: z.array(z.number().int().min(240).max(7680)).min(1).max(12).optional(),
|
|
42
|
+
locale: localeSchema.optional(),
|
|
43
|
+
ignoreSelectors: z.array(z.string().min(1)).max(40).optional(),
|
|
44
|
+
screenshotDir: z.string().optional()
|
|
45
|
+
});
|
|
46
|
+
server.registerTool("audit_page", {
|
|
47
|
+
title: "Audit responsive word wrapping",
|
|
48
|
+
description: "Render a page at multiple widths and report Korean/English mid-word wraps and forced source newlines.",
|
|
49
|
+
inputSchema: auditInput,
|
|
50
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
51
|
+
}, async (input) => guarded(() => auditPage(input, config)));
|
|
52
|
+
server.registerTool("detect_midword_breaks", {
|
|
53
|
+
title: "Detect mid-word breaks",
|
|
54
|
+
description: "Return only concrete Korean/English wrap issues measured from grapheme geometry in the browser.",
|
|
55
|
+
inputSchema: auditInput,
|
|
56
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
57
|
+
}, async (input) => guarded(async () => {
|
|
58
|
+
const report = await auditPage(input, config);
|
|
59
|
+
return { passed: report.passed, counts: report.counts, issues: report.issues };
|
|
60
|
+
}));
|
|
61
|
+
server.registerTool("inspect_wrap_css", {
|
|
62
|
+
title: "Inspect wrapping CSS",
|
|
63
|
+
description: "Inspect computed wrapping properties and same-origin matching CSS rules for one element.",
|
|
64
|
+
inputSchema: z.object({
|
|
65
|
+
target: z.string().min(1),
|
|
66
|
+
selector: z.string().min(1),
|
|
67
|
+
viewport: z.number().int().min(240).max(7680).default(375)
|
|
68
|
+
}),
|
|
69
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
70
|
+
}, async ({ target, selector, viewport }) => guarded(() => inspectWrapCss(target, selector, viewport, config)));
|
|
71
|
+
server.registerTool("suggest_wrap_fix", {
|
|
72
|
+
title: "Suggest a safe wrapping fix",
|
|
73
|
+
description: "Generate a minimal CSS rule for Korean, English, mixed prose, raw evidence, or code/URL content.",
|
|
74
|
+
inputSchema: z.object({
|
|
75
|
+
selector: z.string().min(1),
|
|
76
|
+
locale: z.enum(["auto", "ko", "en", "mixed"]).default("auto"),
|
|
77
|
+
contentKind: z.enum(["prose", "raw-evidence", "code-url"]).default("prose")
|
|
78
|
+
}),
|
|
79
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
80
|
+
}, async ({ selector, locale, contentKind }) => guarded(async () => {
|
|
81
|
+
const profile = profileFor(locale, contentKind);
|
|
82
|
+
return { profile, rule: buildCssRule(selector, profile), declarations: cssForProfile(profile) };
|
|
83
|
+
}));
|
|
84
|
+
server.registerTool("verify_wrap_regression", {
|
|
85
|
+
title: "Verify wrap regression threshold",
|
|
86
|
+
description: "Audit a page and evaluate it against explicit error/warning thresholds for CI or release gates.",
|
|
87
|
+
inputSchema: auditInput.extend({
|
|
88
|
+
maxErrors: z.number().int().min(0).default(0),
|
|
89
|
+
maxWarnings: z.number().int().min(0).default(999999)
|
|
90
|
+
}),
|
|
91
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
92
|
+
}, async ({ maxErrors, maxWarnings, ...input }) => guarded(async () => {
|
|
93
|
+
const report = await auditPage(input, config);
|
|
94
|
+
const thresholdPassed = report.counts.errors <= maxErrors && report.counts.warnings <= maxWarnings;
|
|
95
|
+
return { thresholdPassed, thresholds: { maxErrors, maxWarnings }, report, markdown: formatAuditMarkdown(report) };
|
|
96
|
+
}));
|
|
97
|
+
server.registerTool("apply_wrap_fix", {
|
|
98
|
+
title: "Apply an explicit CSS wrap fix",
|
|
99
|
+
description: "Append an idempotent CSS rule. Dry-run is the default; real writes require allowWrites and an allowed root.",
|
|
100
|
+
inputSchema: z.object({
|
|
101
|
+
cssFile: z.string().min(1),
|
|
102
|
+
selector: z.string().min(1),
|
|
103
|
+
profile: profileSchema,
|
|
104
|
+
dryRun: z.boolean().default(true)
|
|
105
|
+
}),
|
|
106
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }
|
|
107
|
+
}, async ({ cssFile, selector, profile, dryRun }) => guarded(async () => {
|
|
108
|
+
const resolved = path.resolve(cssFile);
|
|
109
|
+
await readFile(resolved, "utf8");
|
|
110
|
+
return applyCssFix({ cssFile: resolved, selector, profile, dryRun, config });
|
|
111
|
+
}));
|
|
112
|
+
return server;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/stdio.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":""}
|
package/dist/stdio.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { serveStdio } from "@modelcontextprotocol/server/stdio";
|
|
3
|
+
import { loadConfig } from "./config.js";
|
|
4
|
+
import { buildMcpServer } from "./server.js";
|
|
5
|
+
try {
|
|
6
|
+
const config = await loadConfig();
|
|
7
|
+
serveStdio(() => buildMcpServer(config), {
|
|
8
|
+
onerror(error) {
|
|
9
|
+
process.stderr.write(`[wrapguard] ${error.message}\n`);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
process.stderr.write(`[wrapguard] ${error instanceof Error ? error.message : String(error)}\n`);
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvC,OAAO,CAAC,KAAK;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
|