@guardion/guardion 0.3.0 → 0.4.1

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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +590 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/connectors/claude-code/hooks/enforce.cjs +58 -0
  7. package/{hooks → dist/connectors/claude-code/hooks}/guardion-hook.cjs +123 -1
  8. package/dist/connectors/claude-code/hooks/tool-scanner.cjs +272 -0
  9. package/dist/connectors/claude-code/src/collect.d.ts +5 -0
  10. package/dist/connectors/claude-code/src/collect.d.ts.map +1 -0
  11. package/dist/connectors/claude-code/src/collect.js +17 -0
  12. package/dist/connectors/claude-code/src/collect.js.map +1 -0
  13. package/dist/{installer.d.ts → connectors/claude-code/src/installer.d.ts} +1 -1
  14. package/dist/connectors/claude-code/src/installer.d.ts.map +1 -0
  15. package/dist/{installer.js → connectors/claude-code/src/installer.js} +2 -2
  16. package/dist/connectors/claude-code/src/installer.js.map +1 -0
  17. package/dist/connectors/claude-code/src/scanner.d.ts.map +1 -0
  18. package/dist/{scanner.js → connectors/claude-code/src/scanner.js} +1 -1
  19. package/dist/connectors/claude-code/src/scanner.js.map +1 -0
  20. package/dist/{config.d.ts → core/config.d.ts} +96 -0
  21. package/dist/core/config.d.ts.map +1 -0
  22. package/dist/{config.js → core/config.js} +44 -0
  23. package/dist/core/config.js.map +1 -0
  24. package/dist/{constants.d.ts → core/constants.d.ts} +1 -1
  25. package/dist/core/constants.d.ts.map +1 -0
  26. package/dist/{constants.js → core/constants.js} +1 -1
  27. package/dist/core/constants.js.map +1 -0
  28. package/dist/core/discover.d.ts +36 -0
  29. package/dist/core/discover.d.ts.map +1 -0
  30. package/dist/core/discover.js +154 -0
  31. package/dist/core/discover.js.map +1 -0
  32. package/dist/core/fingerprint.cjs +84 -0
  33. package/dist/core/inventory.d.ts +35 -0
  34. package/dist/core/inventory.d.ts.map +1 -0
  35. package/dist/core/inventory.js +69 -0
  36. package/dist/core/inventory.js.map +1 -0
  37. package/dist/core/keychain.d.ts.map +1 -0
  38. package/dist/core/keychain.js.map +1 -0
  39. package/dist/core/mcp/guard-client.cjs +86 -0
  40. package/dist/core/mcp/interceptor.cjs +238 -0
  41. package/dist/core/mcp/jsonrpc.cjs +194 -0
  42. package/dist/core/mcp/transport/http-server-side.cjs +89 -0
  43. package/dist/core/mcp/transport/http-upstream.cjs +111 -0
  44. package/dist/core/mcp/transport/http_forward.cjs +40 -0
  45. package/dist/core/mcp/transport/http_input.cjs +46 -0
  46. package/dist/core/mcp/transport/http_reverse.cjs +33 -0
  47. package/dist/core/mcp/transport/index.cjs +32 -0
  48. package/dist/core/mcp/transport/sse_bridge.cjs +101 -0
  49. package/dist/core/mcp/transport/stdio.cjs +60 -0
  50. package/dist/core/mcp-interpose.cjs +141 -0
  51. package/dist/core/mcp-protect.d.ts +69 -0
  52. package/dist/core/mcp-protect.d.ts.map +1 -0
  53. package/dist/core/mcp-protect.js +205 -0
  54. package/dist/core/mcp-protect.js.map +1 -0
  55. package/dist/core/mcp-scan.d.ts +40 -0
  56. package/dist/core/mcp-scan.d.ts.map +1 -0
  57. package/dist/core/mcp-scan.js +201 -0
  58. package/dist/core/mcp-scan.js.map +1 -0
  59. package/dist/core/mock-server.d.ts.map +1 -0
  60. package/dist/{mock-server.js → core/mock-server.js} +41 -0
  61. package/dist/core/mock-server.js.map +1 -0
  62. package/package.json +10 -10
  63. package/config.yaml.example +0 -84
  64. package/dist/cli.d.ts.map +0 -1
  65. package/dist/cli.js +0 -298
  66. package/dist/cli.js.map +0 -1
  67. package/dist/config.d.ts.map +0 -1
  68. package/dist/config.js.map +0 -1
  69. package/dist/constants.d.ts.map +0 -1
  70. package/dist/constants.js.map +0 -1
  71. package/dist/installer.d.ts.map +0 -1
  72. package/dist/installer.js.map +0 -1
  73. package/dist/keychain.d.ts.map +0 -1
  74. package/dist/keychain.js.map +0 -1
  75. package/dist/mock-server.d.ts.map +0 -1
  76. package/dist/mock-server.js.map +0 -1
  77. package/dist/scanner.d.ts.map +0 -1
  78. package/dist/scanner.js.map +0 -1
  79. /package/dist/{cli.d.ts → bin/cli.d.ts} +0 -0
  80. /package/dist/{scanner.d.ts → connectors/claude-code/src/scanner.d.ts} +0 -0
  81. /package/dist/{keychain.d.ts → core/keychain.d.ts} +0 -0
  82. /package/dist/{keychain.js → core/keychain.js} +0 -0
  83. /package/{hooks → dist/core}/metadata.cjs +0 -0
  84. /package/dist/{mock-server.d.ts → core/mock-server.d.ts} +0 -0
@@ -0,0 +1,69 @@
1
+ export interface McpServerCfg {
2
+ command?: string;
3
+ args?: string[];
4
+ env?: Record<string, string>;
5
+ url?: string;
6
+ type?: string;
7
+ headers?: Record<string, string>;
8
+ [k: string]: unknown;
9
+ }
10
+ /** npm package that ships the `guardion mcp` wrapper (used in the injected npx prefix). */
11
+ export declare const NPX_PKG = "@guardion/guardion";
12
+ /** Absolute path to the interposer script (lives beside this core module; dist mirrors source). */
13
+ export declare function interposerPath(): string;
14
+ /** Known agent-app MCP config locations (existing ones are acted on). */
15
+ export declare function knownAppConfigs(home?: string, cwd?: string): Array<{
16
+ app: string;
17
+ path: string;
18
+ }>;
19
+ /** The key under which a given config object holds its MCP servers. */
20
+ export declare function serversKey(obj: any): 'mcpServers' | 'servers' | null;
21
+ /** True if a server entry is already pointing at our wrapper (idempotency). Detects
22
+ * both the npx form (`npx -y @guardion/guardion mcp …`) and the local node form. */
23
+ export declare function isWrapped(cfg: McpServerCfg, interposer?: string): boolean;
24
+ /** Pick the interposer transport for a URL server: legacy SSE vs streamable HTTP. */
25
+ export declare function urlTransport(cfg: McpServerCfg): 'sse_bridge' | 'http_forward';
26
+ export interface WrapOpts {
27
+ /** DLP mode baked into the prefix: dlp (default) | enforce | monitor */
28
+ mode?: string;
29
+ /** Optional policy slug for this server */
30
+ policy?: string;
31
+ /** Dev: inject `node <abs>/mcp-interpose.cjs` instead of the npx form */
32
+ local?: boolean;
33
+ nodeBin?: string;
34
+ interposer?: string;
35
+ }
36
+ /** Wrap one MCP server config so the host launches `guardion mcp` + the real server.
37
+ * By default the prefix is the npx form (`npx -y @guardion/guardion mcp …`) so no
38
+ * global install is needed; `--local` injects the repo's interposer directly. stdio
39
+ * servers keep the `-- cmd args` form; URL servers bridge over http_forward / sse_bridge
40
+ * so they get the same governance instead of being skipped. */
41
+ export declare function wrapServer(name: string, original: McpServerCfg, opts?: WrapOpts): McpServerCfg;
42
+ export interface RewriteResult {
43
+ obj: any;
44
+ wrapped: string[];
45
+ skipped: string[];
46
+ }
47
+ /** Pure: rewrite all MCP servers in a parsed config object. Both stdio (command)
48
+ * and URL (http/sse) servers are wrapped — URL servers bridge through the
49
+ * interposer over http_forward / sse_bridge. Idempotent. */
50
+ export declare function rewriteServers(obj: any, opts?: WrapOpts): RewriteResult;
51
+ /** Restore a config object: unwrap any interposer-wrapped servers back to original. */
52
+ export declare function unwrapServers(obj: any, interposer?: string): RewriteResult;
53
+ export interface ProtectFileResult {
54
+ app: string;
55
+ path: string;
56
+ wrapped: string[];
57
+ skipped: string[];
58
+ error?: string;
59
+ }
60
+ /** Protect a single config file (backup + rewrite). Best-effort; never throws. */
61
+ export declare function protectFile(app: string, file: string, dryRun?: boolean, opts?: WrapOpts): ProtectFileResult;
62
+ /** Revert a single config file from its backup (or unwrap in place). */
63
+ export declare function revertFile(app: string, file: string): ProtectFileResult;
64
+ /** Protect (or --revert) every discovered agent-app MCP config. */
65
+ export declare function protectAll(opts?: {
66
+ revert?: boolean;
67
+ dryRun?: boolean;
68
+ } & WrapOpts): ProtectFileResult[];
69
+ //# sourceMappingURL=mcp-protect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protect.d.ts","sourceRoot":"","sources":["../../core/mcp-protect.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,2FAA2F;AAC3F,eAAO,MAAM,OAAO,uBAAuB,CAAC;AAE5C,mGAAmG;AACnG,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,SAAe,EAAE,GAAG,SAAgB,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9G;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,CAIpE;AAED;qFACqF;AACrF,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,SAAmB,GAAG,OAAO,CAKnF;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY,GAAG,cAAc,CAK7E;AAUD,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;gEAIgE;AAChE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,GAAE,QAAa,GAAG,YAAY,CAalG;AAED,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAEjF;;6DAE6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,QAAa,GAAG,aAAa,CAc3E;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,SAAmB,GAAG,aAAa,CA+BpF;AAID,MAAM,WAAW,iBAAiB;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAEtH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,EAAE,IAAI,GAAE,QAAa,GAAG,iBAAiB,CAa7G;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAevE;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAa,GAC3D,iBAAiB,EAAE,CAIrB"}
@@ -0,0 +1,205 @@
1
+ // `guardion mcp-protect` — universal MCP interposition install. Discovers the MCP
2
+ // config of every agent app on this machine (Claude Desktop, ChatGPT Desktop,
3
+ // Cursor, Cline, Windsurf, VS Code, Claude Code, project .mcp.json) and rewrites
4
+ // each stdio MCP server so the host launches the Guardion interposer
5
+ // (hooks/mcp-interpose.cjs) wrapping the real server — so every MCP tool
6
+ // input/output is scanned for ANY host, no per-app hook required.
7
+ import fs from 'node:fs';
8
+ import os from 'node:os';
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ /** npm package that ships the `guardion mcp` wrapper (used in the injected npx prefix). */
12
+ export const NPX_PKG = '@guardion/guardion';
13
+ /** Absolute path to the interposer script (lives beside this core module; dist mirrors source). */
14
+ export function interposerPath() {
15
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'mcp-interpose.cjs');
16
+ }
17
+ /** Known agent-app MCP config locations (existing ones are acted on). */
18
+ export function knownAppConfigs(home = os.homedir(), cwd = process.cwd()) {
19
+ const appSup = path.join(home, 'Library', 'Application Support'); // macOS
20
+ return [
21
+ { app: 'Claude Desktop', path: path.join(appSup, 'Claude', 'claude_desktop_config.json') },
22
+ { app: 'ChatGPT Desktop', path: path.join(appSup, 'ChatGPT', 'mcp.json') },
23
+ { app: 'Cursor', path: path.join(home, '.cursor', 'mcp.json') },
24
+ { app: 'Windsurf', path: path.join(home, '.codeium', 'windsurf', 'mcp_config.json') },
25
+ { app: 'Cline', path: path.join(appSup, 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json') },
26
+ { app: 'Claude Code', path: path.join(home, '.claude.json') },
27
+ { app: 'VS Code (project)', path: path.join(cwd, '.vscode', 'mcp.json') },
28
+ { app: 'Project .mcp.json', path: path.join(cwd, '.mcp.json') },
29
+ ];
30
+ }
31
+ /** The key under which a given config object holds its MCP servers. */
32
+ export function serversKey(obj) {
33
+ if (obj && typeof obj.mcpServers === 'object')
34
+ return 'mcpServers';
35
+ if (obj && typeof obj.servers === 'object')
36
+ return 'servers';
37
+ return null;
38
+ }
39
+ /** True if a server entry is already pointing at our wrapper (idempotency). Detects
40
+ * both the npx form (`npx -y @guardion/guardion mcp …`) and the local node form. */
41
+ export function isWrapped(cfg, interposer = interposerPath()) {
42
+ if (!cfg || !Array.isArray(cfg.args))
43
+ return false;
44
+ return cfg.args.includes(interposer)
45
+ || cfg.args.includes(NPX_PKG)
46
+ || cfg.args.some((a) => typeof a === 'string' && a.endsWith('mcp-interpose.cjs'));
47
+ }
48
+ /** Pick the interposer transport for a URL server: legacy SSE vs streamable HTTP. */
49
+ export function urlTransport(cfg) {
50
+ const t = String(cfg.type || '').toLowerCase();
51
+ const url = String(cfg.url || '');
52
+ if (t === 'sse' || /\/sse(\b|\/|\?|$)/.test(url))
53
+ return 'sse_bridge';
54
+ return 'http_forward';
55
+ }
56
+ /** Header config (object) → repeated `--header 'K: V'` interposer flags. */
57
+ function headerFlags(headers) {
58
+ if (!headers || typeof headers !== 'object')
59
+ return [];
60
+ const out = [];
61
+ for (const [k, v] of Object.entries(headers))
62
+ out.push('--header', `${k}: ${v}`);
63
+ return out;
64
+ }
65
+ /** Wrap one MCP server config so the host launches `guardion mcp` + the real server.
66
+ * By default the prefix is the npx form (`npx -y @guardion/guardion mcp …`) so no
67
+ * global install is needed; `--local` injects the repo's interposer directly. stdio
68
+ * servers keep the `-- cmd args` form; URL servers bridge over http_forward / sse_bridge
69
+ * so they get the same governance instead of being skipped. */
70
+ export function wrapServer(name, original, opts = {}) {
71
+ const mode = opts.mode || 'dlp';
72
+ const wrapArgs = ['--mode', mode, '--server', name];
73
+ if (opts.policy)
74
+ wrapArgs.push('--policy', opts.policy);
75
+ if (original.url) {
76
+ wrapArgs.push('--transport', urlTransport(original), '--url', String(original.url), ...headerFlags(original.headers));
77
+ }
78
+ else {
79
+ wrapArgs.push('--', original.command, ...(original.args || []));
80
+ }
81
+ const launch = opts.local
82
+ ? { command: opts.nodeBin || process.execPath, args: [opts.interposer || interposerPath(), ...wrapArgs] }
83
+ : { command: 'npx', args: ['-y', NPX_PKG, 'mcp', ...wrapArgs] };
84
+ return { ...launch, ...(original.env ? { env: original.env } : {}) };
85
+ }
86
+ /** Pure: rewrite all MCP servers in a parsed config object. Both stdio (command)
87
+ * and URL (http/sse) servers are wrapped — URL servers bridge through the
88
+ * interposer over http_forward / sse_bridge. Idempotent. */
89
+ export function rewriteServers(obj, opts = {}) {
90
+ const key = serversKey(obj);
91
+ const wrapped = [];
92
+ const skipped = [];
93
+ if (!key)
94
+ return { obj, wrapped, skipped };
95
+ const servers = obj[key];
96
+ const out = {};
97
+ for (const [name, cfg] of Object.entries(servers)) {
98
+ if (!cfg || typeof cfg !== 'object') {
99
+ out[name] = cfg;
100
+ continue;
101
+ }
102
+ if (isWrapped(cfg)) {
103
+ out[name] = cfg;
104
+ continue;
105
+ } // already protected
106
+ if (!cfg.command && !cfg.url) {
107
+ out[name] = cfg;
108
+ skipped.push(name);
109
+ continue;
110
+ }
111
+ out[name] = wrapServer(name, cfg, opts);
112
+ wrapped.push(name);
113
+ }
114
+ return { obj: { ...obj, [key]: out }, wrapped, skipped };
115
+ }
116
+ /** Restore a config object: unwrap any interposer-wrapped servers back to original. */
117
+ export function unwrapServers(obj, interposer = interposerPath()) {
118
+ const key = serversKey(obj);
119
+ const wrapped = [];
120
+ const skipped = [];
121
+ if (!key)
122
+ return { obj, wrapped, skipped };
123
+ const servers = obj[key];
124
+ const out = {};
125
+ for (const [name, cfg] of Object.entries(servers)) {
126
+ if (isWrapped(cfg, interposer)) {
127
+ const a = cfg.args || [];
128
+ const urlIdx = a.indexOf('--url');
129
+ if (urlIdx >= 0) { // URL server (http_forward / sse_bridge)
130
+ const tIdx = a.indexOf('--transport');
131
+ const kind = tIdx >= 0 ? a[tIdx + 1] : 'http_forward';
132
+ const headers = {};
133
+ for (let j = 0; j < a.length - 1; j++) {
134
+ if (a[j] === '--header') {
135
+ const h = a[j + 1];
136
+ const c = h.indexOf(':');
137
+ if (c > 0)
138
+ headers[h.slice(0, c).trim()] = h.slice(c + 1).trim();
139
+ }
140
+ }
141
+ out[name] = {
142
+ type: kind === 'sse_bridge' ? 'sse' : 'http', url: a[urlIdx + 1],
143
+ ...(Object.keys(headers).length ? { headers } : {}),
144
+ ...(cfg.env ? { env: cfg.env } : {}),
145
+ };
146
+ }
147
+ else { // stdio server
148
+ const i = a.indexOf('--');
149
+ const realArgs = i >= 0 ? a.slice(i + 1) : [];
150
+ out[name] = { command: realArgs[0], ...(realArgs.length > 1 ? { args: realArgs.slice(1) } : {}), ...(cfg.env ? { env: cfg.env } : {}) };
151
+ }
152
+ wrapped.push(name);
153
+ }
154
+ else {
155
+ out[name] = cfg;
156
+ }
157
+ }
158
+ return { obj: { ...obj, [key]: out }, wrapped, skipped };
159
+ }
160
+ const BACKUP = '.guardion.bak';
161
+ /** Protect a single config file (backup + rewrite). Best-effort; never throws. */
162
+ export function protectFile(app, file, dryRun = false, opts = {}) {
163
+ try {
164
+ if (!fs.existsSync(file))
165
+ return { app, path: file, wrapped: [], skipped: [], error: 'not found' };
166
+ const obj = JSON.parse(fs.readFileSync(file, 'utf8'));
167
+ const { obj: next, wrapped, skipped } = rewriteServers(obj, opts);
168
+ if (wrapped.length && !dryRun) {
169
+ if (!fs.existsSync(file + BACKUP))
170
+ fs.copyFileSync(file, file + BACKUP);
171
+ fs.writeFileSync(file, JSON.stringify(next, null, 2) + '\n');
172
+ }
173
+ return { app, path: file, wrapped, skipped };
174
+ }
175
+ catch (e) {
176
+ return { app, path: file, wrapped: [], skipped: [], error: e.message };
177
+ }
178
+ }
179
+ /** Revert a single config file from its backup (or unwrap in place). */
180
+ export function revertFile(app, file) {
181
+ try {
182
+ if (fs.existsSync(file + BACKUP)) {
183
+ fs.copyFileSync(file + BACKUP, file);
184
+ fs.unlinkSync(file + BACKUP);
185
+ return { app, path: file, wrapped: ['(restored from backup)'], skipped: [] };
186
+ }
187
+ if (!fs.existsSync(file))
188
+ return { app, path: file, wrapped: [], skipped: [], error: 'not found' };
189
+ const obj = JSON.parse(fs.readFileSync(file, 'utf8'));
190
+ const { obj: next, wrapped } = unwrapServers(obj);
191
+ if (wrapped.length)
192
+ fs.writeFileSync(file, JSON.stringify(next, null, 2) + '\n');
193
+ return { app, path: file, wrapped, skipped: [] };
194
+ }
195
+ catch (e) {
196
+ return { app, path: file, wrapped: [], skipped: [], error: e.message };
197
+ }
198
+ }
199
+ /** Protect (or --revert) every discovered agent-app MCP config. */
200
+ export function protectAll(opts = {}) {
201
+ return knownAppConfigs()
202
+ .filter((c) => fs.existsSync(c.path))
203
+ .map((c) => (opts.revert ? revertFile(c.app, c.path) : protectFile(c.app, c.path, opts.dryRun, opts)));
204
+ }
205
+ //# sourceMappingURL=mcp-protect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protect.js","sourceRoot":"","sources":["../../core/mcp-protect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type ScannedTool } from './inventory.js';
2
+ export interface McpServerConfig {
3
+ type?: string;
4
+ command?: string;
5
+ args?: string[];
6
+ env?: Record<string, string>;
7
+ url?: string;
8
+ headers?: Record<string, string>;
9
+ }
10
+ interface McpTool {
11
+ name: string;
12
+ description?: string;
13
+ inputSchema?: any;
14
+ }
15
+ /** Read configured MCP servers (name → raw config) from settings.json / .mcp.json. */
16
+ export declare function discoverMcpServers(cwd: string): Record<string, McpServerConfig>;
17
+ /** JSON-Schema inputSchema → our {name,type,description} param list (for schema_hash). */
18
+ export declare function inputSchemaToParams(schema: any): Array<{
19
+ name: string;
20
+ type?: string;
21
+ description?: string;
22
+ }>;
23
+ /** stdio MCP client: spawn the server, handshake, tools/list. Never throws. */
24
+ export declare function fetchToolsStdio(cfg: McpServerConfig, timeoutMs?: number): Promise<McpTool[]>;
25
+ /** http (Streamable HTTP) MCP client — best-effort JSON; handles SSE-wrapped replies. */
26
+ export declare function fetchToolsHttp(cfg: McpServerConfig, timeoutMs?: number): Promise<McpTool[]>;
27
+ export interface McpScanResult {
28
+ server: string;
29
+ tools: ScannedTool[];
30
+ error?: string;
31
+ }
32
+ /** Connect to every configured MCP server and collect its live tools as ScannedTool[]. */
33
+ export declare function mcpScan(cwd: string, timeoutMs?: number): Promise<McpScanResult[]>;
34
+ /** Fingerprint+pin (P1) and submit the live tools to Guard for poisoning/rug-pull. */
35
+ export declare function submitMcpScan(apiUrl: string, token: string, results: McpScanResult[], policy?: string, application?: string): Promise<{
36
+ status: number;
37
+ count: number;
38
+ }>;
39
+ export {};
40
+ //# sourceMappingURL=mcp-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-scan.d.ts","sourceRoot":"","sources":["../../core/mcp-scan.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,WAAW,EAAiC,MAAM,gBAAgB,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,UAAU,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,GAAG,CAAA;CAAE;AAE3E,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAmB/E;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAO7G;AASD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkC1F;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA0CzF;AAQD,MAAM,WAAW,aAAa;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAEvF,0FAA0F;AAC1F,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAiBrF;AAED,sFAAsF;AACtF,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAC7F,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAK5C"}
@@ -0,0 +1,201 @@
1
+ // `guardion mcp-scan` — connect to each configured MCP server, fetch its LIVE
2
+ // tool definitions (tools/list), and submit them to Guard for tool-poisoning +
3
+ // rug-pull (P1 fingerprint) scanning. This is the one thing the PreToolUse/
4
+ // PostToolUse hooks can't see (they get calls, not the server's declared tools),
5
+ // and is the mcp-scan / AGT-SDK static-scan equivalent — no proxy.
6
+ import fs from 'node:fs';
7
+ import os from 'node:os';
8
+ import path from 'node:path';
9
+ import http from 'node:http';
10
+ import https from 'node:https';
11
+ import { spawn } from 'node:child_process';
12
+ import { pinInventory, submitInventory } from './inventory.js';
13
+ /** Read configured MCP servers (name → raw config) from settings.json / .mcp.json. */
14
+ export function discoverMcpServers(cwd) {
15
+ const out = {};
16
+ const paths = [
17
+ path.join(os.homedir(), '.claude', 'settings.json'),
18
+ path.join(cwd, '.mcp.json'),
19
+ path.join(cwd, '.claude', 'settings.json'),
20
+ ];
21
+ for (const p of paths) {
22
+ try {
23
+ const json = JSON.parse(fs.readFileSync(p, 'utf8'));
24
+ const servers = json.mcpServers || (p.endsWith('.mcp.json') ? json : null);
25
+ if (servers && typeof servers === 'object') {
26
+ for (const [name, cfg] of Object.entries(servers)) {
27
+ if (!out[name] && cfg && typeof cfg === 'object')
28
+ out[name] = cfg;
29
+ }
30
+ }
31
+ }
32
+ catch { /* skip missing/invalid */ }
33
+ }
34
+ return out;
35
+ }
36
+ /** JSON-Schema inputSchema → our {name,type,description} param list (for schema_hash). */
37
+ export function inputSchemaToParams(schema) {
38
+ const props = schema && schema.properties && typeof schema.properties === 'object' ? schema.properties : {};
39
+ return Object.keys(props).map((k) => ({
40
+ name: k,
41
+ type: typeof props[k]?.type === 'string' ? props[k].type : (Array.isArray(props[k]?.type) ? props[k].type.join('|') : ''),
42
+ description: typeof props[k]?.description === 'string' ? props[k].description : '',
43
+ }));
44
+ }
45
+ const INIT = {
46
+ jsonrpc: '2.0', id: 1, method: 'initialize',
47
+ params: { protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'guardion-mcp-scan', version: '0.3.0' } },
48
+ };
49
+ const INITED = { jsonrpc: '2.0', method: 'notifications/initialized' };
50
+ const LIST = { jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} };
51
+ /** stdio MCP client: spawn the server, handshake, tools/list. Never throws. */
52
+ export function fetchToolsStdio(cfg, timeoutMs = 8000) {
53
+ return new Promise((resolve) => {
54
+ let child;
55
+ try {
56
+ child = spawn(cfg.command, cfg.args || [], { env: { ...process.env, ...(cfg.env || {}) }, stdio: ['pipe', 'pipe', 'ignore'] });
57
+ }
58
+ catch {
59
+ return resolve([]);
60
+ }
61
+ let buf = '';
62
+ let done = false;
63
+ const finish = (tools) => {
64
+ if (done)
65
+ return;
66
+ done = true;
67
+ clearTimeout(timer);
68
+ try {
69
+ child.kill();
70
+ }
71
+ catch { /* ignore */ }
72
+ resolve(tools);
73
+ };
74
+ const timer = setTimeout(() => finish([]), timeoutMs);
75
+ const send = (o) => { try {
76
+ child.stdin.write(JSON.stringify(o) + '\n');
77
+ }
78
+ catch { /* ignore */ } };
79
+ child.stdout.setEncoding('utf8');
80
+ child.stdout.on('data', (d) => {
81
+ buf += d;
82
+ let nl;
83
+ while ((nl = buf.indexOf('\n')) >= 0) {
84
+ const line = buf.slice(0, nl).trim();
85
+ buf = buf.slice(nl + 1);
86
+ if (!line)
87
+ continue;
88
+ let msg;
89
+ try {
90
+ msg = JSON.parse(line);
91
+ }
92
+ catch {
93
+ continue;
94
+ }
95
+ if (msg.id === 1 && msg.result) {
96
+ send(INITED);
97
+ send(LIST);
98
+ }
99
+ if (msg.id === 2 && msg.result && Array.isArray(msg.result.tools))
100
+ finish(msg.result.tools);
101
+ }
102
+ });
103
+ child.on('error', () => finish([]));
104
+ send(INIT);
105
+ });
106
+ }
107
+ /** http (Streamable HTTP) MCP client — best-effort JSON; handles SSE-wrapped replies. */
108
+ export function fetchToolsHttp(cfg, timeoutMs = 8000) {
109
+ const post = (body, sessionId) => new Promise((resolve) => {
110
+ let url;
111
+ try {
112
+ url = new URL(cfg.url);
113
+ }
114
+ catch {
115
+ return resolve({ json: null });
116
+ }
117
+ const transport = url.protocol === 'https:' ? https : http;
118
+ const data = JSON.stringify(body);
119
+ const req = transport.request({
120
+ hostname: url.hostname, port: url.port, path: url.pathname + url.search, method: 'POST',
121
+ timeout: timeoutMs,
122
+ headers: {
123
+ 'Content-Type': 'application/json',
124
+ 'Accept': 'application/json, text/event-stream',
125
+ 'Content-Length': Buffer.byteLength(data),
126
+ ...(cfg.headers || {}),
127
+ ...(sessionId ? { 'Mcp-Session-Id': sessionId } : {}),
128
+ },
129
+ }, (res) => {
130
+ const sid = res.headers['mcp-session-id'] || sessionId;
131
+ let raw = '';
132
+ res.setEncoding('utf8');
133
+ res.on('data', (c) => { raw += c; });
134
+ res.on('end', () => {
135
+ // SSE frames: take the last `data:` line; else parse as JSON.
136
+ let json = null;
137
+ const sse = raw.split('\n').filter((l) => l.startsWith('data:')).map((l) => l.slice(5).trim());
138
+ const candidate = sse.length ? sse[sse.length - 1] : raw;
139
+ try {
140
+ json = JSON.parse(candidate);
141
+ }
142
+ catch {
143
+ json = null;
144
+ }
145
+ resolve({ json, sessionId: sid });
146
+ });
147
+ });
148
+ req.on('error', () => resolve({ json: null }));
149
+ req.on('timeout', () => { req.destroy(); resolve({ json: null }); });
150
+ req.write(data);
151
+ req.end();
152
+ });
153
+ return (async () => {
154
+ const init = await post(INIT);
155
+ const sid = init.sessionId;
156
+ await post(INITED, sid);
157
+ const list = await post(LIST, sid);
158
+ const tools = list.json && list.json.result && Array.isArray(list.json.result.tools) ? list.json.result.tools : [];
159
+ return tools;
160
+ })();
161
+ }
162
+ function fetchTools(cfg, timeoutMs) {
163
+ if (cfg.url)
164
+ return fetchToolsHttp(cfg, timeoutMs);
165
+ if (cfg.command)
166
+ return fetchToolsStdio(cfg, timeoutMs);
167
+ return Promise.resolve([]);
168
+ }
169
+ /** Connect to every configured MCP server and collect its live tools as ScannedTool[]. */
170
+ export async function mcpScan(cwd, timeoutMs = 8000) {
171
+ const servers = discoverMcpServers(cwd);
172
+ const results = [];
173
+ for (const [server, cfg] of Object.entries(servers)) {
174
+ let live = [];
175
+ try {
176
+ live = await fetchTools(cfg, timeoutMs);
177
+ }
178
+ catch {
179
+ live = [];
180
+ }
181
+ const tools = live.map((t) => ({
182
+ name: t.name,
183
+ description: t.description || '',
184
+ server,
185
+ source: 'mcp',
186
+ snapshot_source: 'mcp_scan',
187
+ parameters: inputSchemaToParams(t.inputSchema),
188
+ }));
189
+ results.push({ server, tools, error: live.length === 0 ? 'no tools (unreachable or empty)' : undefined });
190
+ }
191
+ return results;
192
+ }
193
+ /** Fingerprint+pin (P1) and submit the live tools to Guard for poisoning/rug-pull. */
194
+ export async function submitMcpScan(apiUrl, token, results, policy, application) {
195
+ const tools = pinInventory(results.flatMap((r) => r.tools));
196
+ if (tools.length === 0)
197
+ return { status: 0, count: 0 };
198
+ const res = await submitInventory({ apiUrl, token, tools, policy, application });
199
+ return { status: res.status, count: tools.length };
200
+ }
201
+ //# sourceMappingURL=mcp-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-scan.js","sourceRoot":"","sources":["../../core/mcp-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../core/mock-server.ts"],"names":[],"mappings":"AA2DA,wBAAgB,eAAe,CAAC,IAAI,SAAe,QAwJlD"}
@@ -2,7 +2,17 @@ import express from 'express';
2
2
  import chalk from 'chalk';
3
3
  const DEFAULT_PORT = 4100;
4
4
  const EVENTS_PATH = '/v1/hooks/events'; // matches real Guard API — fixed from v1
5
+ const GUARD_PATH = '/v1/guard'; // policy evaluation (DLP / interposer)
5
6
  const HEALTH_PATH = '/health';
7
+ // Mirror Guard's MessagesRole enum (guard/guard/core/schemas.py) so the mock
8
+ // rejects an invalid role exactly like real Guard would (422). This is what
9
+ // catches the `tool_output` (should be `tool_response`) class of contract bug —
10
+ // the unit suite hits fakes, but anything pointed at the mock is held to the
11
+ // real role contract.
12
+ const VALID_ROLES = new Set([
13
+ 'user', 'assistant', 'system', 'developer', 'context',
14
+ 'tool', 'tool_input', 'tool_response', 'tool_schema',
15
+ ]);
6
16
  let nextId = 1;
7
17
  const logs = [];
8
18
  function ts() {
@@ -69,6 +79,37 @@ export function startMockServer(port = DEFAULT_PORT) {
69
79
  });
70
80
  res.json({ action: 'allow' });
71
81
  });
82
+ // ── Policy evaluation (/v1/guard) ────────────────────────────────────────────
83
+ // Validates the role contract and echoes a simple verdict. Redacts any leaf
84
+ // whose content matches a demo PII pattern (email) so the interposer's
85
+ // structure-preserving write-back can be exercised end-to-end against the mock.
86
+ app.post(GUARD_PATH, (req, res) => {
87
+ const start = Date.now();
88
+ const body = (req.body ?? {});
89
+ const messages = Array.isArray(body.messages) ? body.messages : [];
90
+ const bad = messages.find((m) => !VALID_ROLES.has(String(m?.role)));
91
+ if (bad) {
92
+ const detail = `invalid role: ${String(bad.role)}`;
93
+ console.log(chalk.red(`[${ts()}] 422 ${GUARD_PATH} — ${detail}`));
94
+ addLog('POST', GUARD_PATH, 422, Date.now() - start, body, { error: detail });
95
+ return res.status(422).json({ detail });
96
+ }
97
+ const EMAIL = /\b[\w.+-]+@[\w-]+\.[\w.-]+\b/g;
98
+ const choices = messages.map((m) => {
99
+ const content = typeof m.content === 'string' ? m.content : '';
100
+ return { role: m.role, name: m.name, content: content.replace(EMAIL, '[EMAIL]') };
101
+ });
102
+ const redacted = choices.some((c, i) => c.content !== (messages[i].content ?? ''));
103
+ console.log(`${chalk.dim(`[${ts()}]`)} ${chalk.bold(chalk.green('guard'))} ${chalk.dim(`msgs=${messages.length} redacted=${redacted}`)}`);
104
+ addLog('POST', GUARD_PATH, 200, Date.now() - start, body, { messages: messages.length, redacted });
105
+ res.json({
106
+ id: `eval-${Date.now()}`,
107
+ flagged: redacted,
108
+ deny: false,
109
+ redacted,
110
+ ...(redacted ? { correction: { choices } } : {}),
111
+ });
112
+ });
72
113
  // ── Log queries ────────────────────────────────────────────────────────────
73
114
  app.get('/api/logs/stream', (req, res) => {
74
115
  res.setHeader('Content-Type', 'text/event-stream');
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../core/mock-server.ts"],"names":[],"mappings":"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"}