@guardbee/mcp-security-proxy 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.
@@ -0,0 +1,9 @@
1
+ import type { AuditEvent, ProxyConfig } from "../types.js";
2
+ export declare class AuditLogger {
3
+ private config;
4
+ private stream;
5
+ constructor(config: NonNullable<ProxyConfig["audit"]>);
6
+ log(event: AuditEvent): void;
7
+ close(): void;
8
+ }
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAA+B;IAE7C,YAAY,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAKpD;IAED,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAQ3B;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AuditLogger = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ class AuditLogger {
9
+ constructor(config) {
10
+ this.stream = null;
11
+ this.config = config;
12
+ if (config.sink === "file" && config.filePath) {
13
+ this.stream = fs_1.default.createWriteStream(config.filePath, { flags: "a" });
14
+ }
15
+ }
16
+ log(event) {
17
+ if (!this.config.enabled)
18
+ return;
19
+ const line = JSON.stringify(event);
20
+ if (this.config.sink === "file" && this.stream) {
21
+ this.stream.write(line + "\n");
22
+ }
23
+ else {
24
+ process.stderr.write("[guardbee-proxy] " + line + "\n");
25
+ }
26
+ }
27
+ close() {
28
+ this.stream?.end();
29
+ }
30
+ }
31
+ exports.AuditLogger = AuditLogger;
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AAGpB;IAIE,YAAY,MAAyC;QAF7C,WAAM,GAA0B,IAAI,CAAC;QAG3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,YAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_js_1 = require("./config.js");
4
+ const proxy_js_1 = require("./proxy.js");
5
+ async function main() {
6
+ const config = (0, config_js_1.loadProxyConfig)();
7
+ await (0, proxy_js_1.startProxy)(config);
8
+ }
9
+ main().catch((err) => {
10
+ process.stderr.write(`[guardbee-proxy] Fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
11
+ process.exit(1);
12
+ });
13
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAAA,2CAA8C;AAC9C,yCAAwC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,2BAAe,GAAE,CAAC;IACjC,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACtF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProxyConfig } from "./types.js";
2
+ export declare function loadProxyConfig(): ProxyConfig;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AA0B/D,wBAAgB,eAAe,IAAI,WAAW,CAuC7C"}
package/dist/config.js ADDED
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadProxyConfig = loadProxyConfig;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function parseServerFromEnv() {
10
+ const cmd = process.env["PROXY_COMMAND"];
11
+ if (!cmd)
12
+ return null;
13
+ const args = process.env["PROXY_ARGS"]?.split(" ").filter(Boolean) ?? [];
14
+ return { command: cmd, args };
15
+ }
16
+ function parseServerFromArgs(argv) {
17
+ // guardbee-proxy -- npx @some/mcp-server --flag value
18
+ const sep = argv.indexOf("--");
19
+ if (sep === -1 || sep === argv.length - 1)
20
+ return null;
21
+ const rest = argv.slice(sep + 1);
22
+ return { command: rest[0], args: rest.slice(1) };
23
+ }
24
+ function parseConfigFile(filePath) {
25
+ try {
26
+ const raw = fs_1.default.readFileSync(filePath, "utf8");
27
+ return JSON.parse(raw);
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ function loadProxyConfig() {
34
+ // 1. Config file: GUARDBEE_PROXY_CONFIG env or ./guardbee-proxy.json
35
+ const configPath = process.env["GUARDBEE_PROXY_CONFIG"] ??
36
+ path_1.default.join(process.cwd(), "guardbee-proxy.json");
37
+ const fileConfig = parseConfigFile(configPath);
38
+ if (fileConfig)
39
+ return fileConfig;
40
+ // 2. CLI args: guardbee-proxy -- <command> [args]
41
+ const fromArgs = parseServerFromArgs(process.argv);
42
+ if (fromArgs) {
43
+ return {
44
+ server: fromArgs,
45
+ audit: { enabled: true, sink: "console" },
46
+ interceptors: {
47
+ promptInjection: { enabled: true, action: "block" },
48
+ piiMasking: { enabled: true },
49
+ },
50
+ };
51
+ }
52
+ // 3. Env vars
53
+ const fromEnv = parseServerFromEnv();
54
+ if (fromEnv) {
55
+ return {
56
+ server: fromEnv,
57
+ audit: { enabled: true, sink: "console" },
58
+ interceptors: {
59
+ promptInjection: { enabled: true, action: "block" },
60
+ piiMasking: { enabled: true },
61
+ },
62
+ };
63
+ }
64
+ throw new Error("No proxy target configured. Use: guardbee-proxy -- <command> [args]\n" +
65
+ "Or create a guardbee-proxy.json config file.");
66
+ }
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAGxB,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IACzC,sDAAsD;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;IACE,qEAAqE;IACrE,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACpC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YACzC,YAAY,EAAE;gBACZ,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;gBACnD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,cAAc;IACd,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YACzC,YAAY,EAAE;gBACZ,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;gBACnD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uEAAuE;QACrE,8CAA8C,CACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { startProxy } from "./proxy.js";
2
+ export { loadProxyConfig } from "./config.js";
3
+ export { scanForPromptInjection } from "./interceptors/prompt-injection.js";
4
+ export { maskPiiInValue, maskPiiInText } from "./interceptors/pii-masker.js";
5
+ export { AuditLogger } from "./audit/logger.js";
6
+ export type { ProxyConfig, McpServerConfig, InterceptResult, AuditEvent } from "./types.js";
7
+ //# 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,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuditLogger = exports.maskPiiInText = exports.maskPiiInValue = exports.scanForPromptInjection = exports.loadProxyConfig = exports.startProxy = void 0;
4
+ var proxy_js_1 = require("./proxy.js");
5
+ Object.defineProperty(exports, "startProxy", { enumerable: true, get: function () { return proxy_js_1.startProxy; } });
6
+ var config_js_1 = require("./config.js");
7
+ Object.defineProperty(exports, "loadProxyConfig", { enumerable: true, get: function () { return config_js_1.loadProxyConfig; } });
8
+ var prompt_injection_js_1 = require("./interceptors/prompt-injection.js");
9
+ Object.defineProperty(exports, "scanForPromptInjection", { enumerable: true, get: function () { return prompt_injection_js_1.scanForPromptInjection; } });
10
+ var pii_masker_js_1 = require("./interceptors/pii-masker.js");
11
+ Object.defineProperty(exports, "maskPiiInValue", { enumerable: true, get: function () { return pii_masker_js_1.maskPiiInValue; } });
12
+ Object.defineProperty(exports, "maskPiiInText", { enumerable: true, get: function () { return pii_masker_js_1.maskPiiInText; } });
13
+ var logger_js_1 = require("./audit/logger.js");
14
+ Object.defineProperty(exports, "AuditLogger", { enumerable: true, get: function () { return logger_js_1.AuditLogger; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAwC;AAA/B,sGAAA,UAAU,OAAA;AACnB,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,0EAA4E;AAAnE,6HAAA,sBAAsB,OAAA;AAC/B,8DAA6E;AAApE,+GAAA,cAAc,OAAA;AAAE,8GAAA,aAAa,OAAA;AACtC,+CAAgD;AAAvC,wGAAA,WAAW,OAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function maskPiiInText(text: string): string;
2
+ export declare function maskPiiInValue(value: unknown): unknown;
3
+ //# sourceMappingURL=pii-masker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-masker.d.ts","sourceRoot":"","sources":["../../src/interceptors/pii-masker.ts"],"names":[],"mappings":"AAuCA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAetD"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maskPiiInText = maskPiiInText;
4
+ exports.maskPiiInValue = maskPiiInValue;
5
+ // PII patterns for response masking
6
+ const PII_PATTERNS = [
7
+ {
8
+ name: "tc_kimlik",
9
+ pattern: /\b[1-9]\d{10}\b/g,
10
+ replacement: "[TC-KİMLİK]",
11
+ },
12
+ {
13
+ name: "iban",
14
+ pattern: /\bTR\d{2}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{2}\b/gi,
15
+ replacement: "TR**[IBAN]",
16
+ },
17
+ {
18
+ name: "credit_card",
19
+ pattern: /\b(?:\d{4}[\s-]?){3}\d{4}\b/g,
20
+ replacement: "****-****-****-[KART]",
21
+ },
22
+ {
23
+ name: "email",
24
+ pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
25
+ replacement: "***@[EMAIL]",
26
+ },
27
+ {
28
+ name: "phone_tr",
29
+ pattern: /\b(?:\+90|0090|0)?[\s-]?(?:\d{3})[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}\b/g,
30
+ replacement: "+90-***-***-**[TELEFON]",
31
+ },
32
+ {
33
+ name: "api_key",
34
+ pattern: /\b(?:sk|pk|api|key|token|secret)[-_]?[A-Za-z0-9]{16,}\b/gi,
35
+ replacement: "[API-KEY]",
36
+ },
37
+ {
38
+ name: "jwt",
39
+ pattern: /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
40
+ replacement: "[JWT-TOKEN]",
41
+ },
42
+ ];
43
+ function maskPiiInText(text) {
44
+ let result = text;
45
+ for (const { pattern, replacement } of PII_PATTERNS) {
46
+ if (typeof replacement === "string") {
47
+ result = result.replace(pattern, replacement);
48
+ }
49
+ else {
50
+ result = result.replace(pattern, replacement);
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ function maskPiiInValue(value) {
56
+ if (typeof value === "string") {
57
+ return maskPiiInText(value);
58
+ }
59
+ if (Array.isArray(value)) {
60
+ return value.map(maskPiiInValue);
61
+ }
62
+ if (typeof value === "object" && value !== null) {
63
+ const result = {};
64
+ for (const [k, v] of Object.entries(value)) {
65
+ result[k] = maskPiiInValue(v);
66
+ }
67
+ return result;
68
+ }
69
+ return value;
70
+ }
71
+ //# sourceMappingURL=pii-masker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../src/interceptors/pii-masker.ts"],"names":[],"mappings":";;;;AAAA,oCAAoC;AACpC,MAAM,YAAY,GAA6D;IAC7E;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,aAAa;KAC3B;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,iFAAiF;QAC1F,WAAW,EAAE,YAAY;KAC1B;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,sDAAsD;QAC/D,WAAW,EAAE,aAAa;KAC3B;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,uEAAuE;QAChF,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,2DAA2D;QACpE,WAAW,EAAE,WAAW;KACzB;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,wDAAwD;QACjE,WAAW,EAAE,aAAa;KAC3B;CACF,CAAC;AAEF,uBAA8B,IAAY;IACxC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,YAAY,EAAE,CAAC;QACpD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAA+B,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InterceptResult } from "../types.js";
2
+ export declare function scanForPromptInjection(input: unknown): InterceptResult;
3
+ //# sourceMappingURL=prompt-injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.d.ts","sourceRoot":"","sources":["../../src/interceptors/prompt-injection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA8BnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAatE"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanForPromptInjection = scanForPromptInjection;
4
+ // Common prompt injection patterns
5
+ const INJECTION_PATTERNS = [
6
+ /ignore\s+(all\s+)?(previous|prior|above)\s+instructions?/i,
7
+ /disregard\s+(all\s+)?(previous|prior|above)\s+instructions?/i,
8
+ /forget\s+(all\s+)?(previous|prior|above)\s+instructions?/i,
9
+ /you\s+are\s+now\s+(a\s+)?(?!an?\s+AI|a\s+language)/i,
10
+ /act\s+as\s+(if\s+you\s+are\s+)?(?!an?\s+AI|a\s+language)/i,
11
+ /pretend\s+(you\s+are|to\s+be)\s+(?!an?\s+AI|a\s+language)/i,
12
+ /jailbreak/i,
13
+ /DAN\s+mode/i,
14
+ /developer\s+mode/i,
15
+ /system\s+prompt\s*:/i,
16
+ /<\s*system\s*>/i,
17
+ /\[SYSTEM\]/i,
18
+ /bypass\s+(safety|filter|restriction|policy)/i,
19
+ /override\s+(safety|filter|restriction|policy)/i,
20
+ /reveal\s+(your\s+)?(system\s+prompt|instructions|prompt)/i,
21
+ /print\s+(your\s+)?(system\s+prompt|instructions)/i,
22
+ ];
23
+ function flattenValue(value) {
24
+ if (typeof value === "string")
25
+ return value;
26
+ if (typeof value === "object" && value !== null) {
27
+ return JSON.stringify(value);
28
+ }
29
+ return String(value ?? "");
30
+ }
31
+ function scanForPromptInjection(input) {
32
+ const text = flattenValue(input);
33
+ for (const pattern of INJECTION_PATTERNS) {
34
+ if (pattern.test(text)) {
35
+ return {
36
+ action: "block",
37
+ reason: `Prompt injection pattern detected: ${pattern.toString()}`,
38
+ };
39
+ }
40
+ }
41
+ return { action: "allow" };
42
+ }
43
+ //# sourceMappingURL=prompt-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.js","sourceRoot":"","sources":["../../src/interceptors/prompt-injection.ts"],"names":[],"mappings":";;;AAEA,mCAAmC;AACnC,MAAM,kBAAkB,GAAa;IACnC,2DAA2D;IAC3D,8DAA8D;IAC9D,2DAA2D;IAC3D,qDAAqD;IACrD,2DAA2D;IAC3D,4DAA4D;IAC5D,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,sBAAsB;IACtB,iBAAiB;IACjB,aAAa;IACb,8CAA8C;IAC9C,gDAAgD;IAChD,2DAA2D;IAC3D,mDAAmD;CACpD,CAAC;AAEF,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,gCAAuC,KAAc;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEjC,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,sCAAsC,OAAO,CAAC,QAAQ,EAAE,EAAE;aACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProxyConfig } from "./types.js";
2
+ export declare function startProxy(config: ProxyConfig): Promise<void>;
3
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8InE"}
package/dist/proxy.js ADDED
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startProxy = startProxy;
4
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
6
+ const index_js_2 = require("@modelcontextprotocol/sdk/server/index.js");
7
+ const stdio_js_2 = require("@modelcontextprotocol/sdk/server/stdio.js");
8
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
9
+ const prompt_injection_js_1 = require("./interceptors/prompt-injection.js");
10
+ const pii_masker_js_1 = require("./interceptors/pii-masker.js");
11
+ const logger_js_1 = require("./audit/logger.js");
12
+ async function startProxy(config) {
13
+ const audit = new logger_js_1.AuditLogger(config.audit ?? { enabled: true, sink: "console" });
14
+ // --- Connect to target MCP server (downstream) ---
15
+ const downstream = new index_js_1.Client({ name: "guardbee-proxy-client", version: "0.1.0" }, { capabilities: {} });
16
+ const transport = new stdio_js_1.StdioClientTransport({
17
+ command: config.server.command,
18
+ args: config.server.args ?? [],
19
+ env: { ...process.env, ...(config.server.env ?? {}) },
20
+ });
21
+ await downstream.connect(transport);
22
+ const serverInfo = downstream.getServerVersion();
23
+ // --- Start proxy MCP server (upstream, for Claude) ---
24
+ const server = new index_js_2.Server({ name: "guardbee-security-proxy", version: "0.1.0" }, {
25
+ capabilities: {
26
+ tools: {},
27
+ resources: {},
28
+ prompts: {},
29
+ },
30
+ });
31
+ // List tools → pass through from downstream
32
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
33
+ const result = await downstream.listTools();
34
+ return result;
35
+ });
36
+ // Call tool → intercept, scan, forward, mask response
37
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (req) => {
38
+ const toolName = req.params.name;
39
+ const toolInput = req.params.arguments ?? {};
40
+ // 1. Prompt injection scan on input
41
+ if (config.interceptors?.promptInjection?.enabled !== false) {
42
+ const scan = (0, prompt_injection_js_1.scanForPromptInjection)(toolInput);
43
+ if (scan.action === "block") {
44
+ audit.log({
45
+ ts: new Date().toISOString(),
46
+ type: "blocked",
47
+ tool: toolName,
48
+ server: serverInfo?.name,
49
+ input: toolInput,
50
+ reason: scan.reason,
51
+ });
52
+ return {
53
+ content: [
54
+ {
55
+ type: "text",
56
+ text: `[GuardBee Security Proxy] Tool call blocked: ${scan.reason}`,
57
+ },
58
+ ],
59
+ isError: true,
60
+ };
61
+ }
62
+ if (scan.action === "warn") {
63
+ audit.log({
64
+ ts: new Date().toISOString(),
65
+ type: "warn",
66
+ tool: toolName,
67
+ server: serverInfo?.name,
68
+ input: toolInput,
69
+ reason: scan.reason,
70
+ });
71
+ }
72
+ }
73
+ // 2. Log the call
74
+ audit.log({
75
+ ts: new Date().toISOString(),
76
+ type: "tool_call",
77
+ tool: toolName,
78
+ server: serverInfo?.name,
79
+ input: toolInput,
80
+ });
81
+ // 3. Forward to downstream
82
+ const result = await downstream.callTool({
83
+ name: toolName,
84
+ arguments: toolInput,
85
+ });
86
+ // 4. PII masking on response
87
+ let content = result.content;
88
+ if (config.interceptors?.piiMasking?.enabled !== false) {
89
+ content = (0, pii_masker_js_1.maskPiiInValue)(content);
90
+ }
91
+ // 5. Log response
92
+ audit.log({
93
+ ts: new Date().toISOString(),
94
+ type: "tool_response",
95
+ tool: toolName,
96
+ server: serverInfo?.name,
97
+ output: content,
98
+ });
99
+ return { ...result, content };
100
+ });
101
+ // Resources pass-through
102
+ server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
103
+ return await downstream.listResources();
104
+ });
105
+ server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (req) => {
106
+ return await downstream.readResource({ uri: req.params.uri });
107
+ });
108
+ // Prompts pass-through
109
+ server.setRequestHandler(types_js_1.ListPromptsRequestSchema, async () => {
110
+ return await downstream.listPrompts();
111
+ });
112
+ server.setRequestHandler(types_js_1.GetPromptRequestSchema, async (req) => {
113
+ return await downstream.getPrompt({
114
+ name: req.params.name,
115
+ arguments: req.params.arguments,
116
+ });
117
+ });
118
+ // Start upstream server
119
+ const upstreamTransport = new stdio_js_2.StdioServerTransport();
120
+ await server.connect(upstreamTransport);
121
+ process.on("SIGINT", async () => {
122
+ audit.close();
123
+ await server.close();
124
+ await downstream.close();
125
+ process.exit(0);
126
+ });
127
+ }
128
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export type McpServerConfig = {
2
+ command: string;
3
+ args?: string[];
4
+ env?: Record<string, string>;
5
+ };
6
+ export type ProxyConfig = {
7
+ server: McpServerConfig;
8
+ audit?: {
9
+ enabled: boolean;
10
+ sink: "console" | "file";
11
+ filePath?: string;
12
+ };
13
+ interceptors?: {
14
+ promptInjection?: {
15
+ enabled: boolean;
16
+ action: "block" | "warn";
17
+ };
18
+ piiMasking?: {
19
+ enabled: boolean;
20
+ patterns?: string[];
21
+ };
22
+ };
23
+ };
24
+ export type InterceptResult = {
25
+ action: "allow";
26
+ } | {
27
+ action: "block";
28
+ reason: string;
29
+ } | {
30
+ action: "warn";
31
+ reason: string;
32
+ };
33
+ export type AuditEvent = {
34
+ ts: string;
35
+ type: "tool_call" | "tool_response" | "blocked" | "warn";
36
+ tool?: string;
37
+ server?: string;
38
+ input?: unknown;
39
+ output?: unknown;
40
+ reason?: string;
41
+ };
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,eAAe,CAAC,EAAE;YAChB,OAAO,EAAE,OAAO,CAAC;YACjB,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;SAC1B,CAAC;QACF,UAAU,CAAC,EAAE;YACX,OAAO,EAAE,OAAO,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;SACrB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@guardbee/mcp-security-proxy",
3
+ "version": "0.1.0",
4
+ "description": "Security proxy for MCP servers — intercepts tool calls, detects prompt injection, masks PII, and writes audit logs",
5
+ "author": "GuardBee <hello@guardbee.ai>",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/GuardBee/guardbee-mcp-security-proxy#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/GuardBee/guardbee-mcp-security-proxy.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/GuardBee/guardbee-mcp-security-proxy/issues"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "model-context-protocol",
18
+ "security",
19
+ "proxy",
20
+ "prompt-injection",
21
+ "pii",
22
+ "audit",
23
+ "guardbee",
24
+ "llm",
25
+ "claude"
26
+ ],
27
+ "main": "dist/index.js",
28
+ "types": "dist/index.d.ts",
29
+ "bin": {
30
+ "guardbee-proxy": "dist/cli.js"
31
+ },
32
+ "files": ["dist", "README.md"],
33
+ "engines": { "node": ">=18" },
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "dev": "tsx src/cli.ts",
37
+ "start": "node dist/cli.js",
38
+ "type-check": "tsc --noEmit",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "prepublishOnly": "npm test && npm run build"
42
+ },
43
+ "dependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.30.0",
45
+ "zod": "^4.5.4"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^26.5.0",
49
+ "tsx": "^4.23.13",
50
+ "typescript": "^7.0.2",
51
+ "vitest": "^3.2.7"
52
+ }
53
+ }