@guardbee/mcp-secret-scanner 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scanner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scanner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { scanText } from "../scanner.js";
3
+ describe("scanText", () => {
4
+ it("detects AWS access key", () => {
5
+ const findings = scanText("export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE");
6
+ expect(findings.some((f) => f.patternId === "aws_access_key")).toBe(true);
7
+ });
8
+ it("detects GitHub PAT", () => {
9
+ const findings = scanText("token: ghp_abcdefghijklmnopqrstuvwxyz0123456789");
10
+ expect(findings.some((f) => f.patternId === "github_pat")).toBe(true);
11
+ });
12
+ it("detects Stripe secret key", () => {
13
+ // split to avoid GitHub push protection on test fixtures
14
+ const key = ["sk", "_live_", "abc123xyz456def789ghi012"].join("");
15
+ const findings = scanText(`const stripe = require("stripe")("${key}")`);
16
+ expect(findings.some((f) => f.patternId === "stripe_secret")).toBe(true);
17
+ });
18
+ it("detects OpenAI API key", () => {
19
+ const key = ["sk-abcdefghijklmnopqrst", "T3BlbkFJ", "abcdefghijklmnopqrst"].join("");
20
+ const findings = scanText(`OPENAI_API_KEY=${key}`);
21
+ expect(findings.some((f) => f.patternId === "openai_key")).toBe(true);
22
+ });
23
+ it("detects Anthropic API key", () => {
24
+ const key = ["sk-ant-", "api03-abcdefghijklmnopqrstuvwxyz0123456789ABCD"].join("");
25
+ const findings = scanText(`key = '${key}'`);
26
+ expect(findings.some((f) => f.patternId === "anthropic_key")).toBe(true);
27
+ });
28
+ it("detects Slack token", () => {
29
+ const token = ["xoxb-", "123456789012-123456789012-abcdefghijklmnopqrstuvwx"].join("");
30
+ const findings = scanText(`SLACK_TOKEN=${token}`);
31
+ expect(findings.some((f) => f.patternId === "slack_token")).toBe(true);
32
+ });
33
+ it("detects PostgreSQL URL with credentials", () => {
34
+ const findings = scanText("DATABASE_URL=postgresql://admin:s3cr3tpass@prod.db.example.com:5432/mydb");
35
+ expect(findings.some((f) => f.patternId === "db_url_postgres")).toBe(true);
36
+ });
37
+ it("does not flag localhost postgres URL", () => {
38
+ const findings = scanText("DATABASE_URL=postgresql://user:pass@localhost:5432/mydb");
39
+ expect(findings.filter((f) => f.patternId === "db_url_postgres")).toHaveLength(0);
40
+ });
41
+ it("detects RSA private key header", () => {
42
+ const findings = scanText("-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAK...");
43
+ expect(findings.some((f) => f.patternId === "private_key_rsa")).toBe(true);
44
+ });
45
+ it("detects JWT token", () => {
46
+ const jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
47
+ const findings = scanText(`Authorization: Bearer ${jwt}`);
48
+ expect(findings.some((f) => f.patternId === "jwt")).toBe(true);
49
+ });
50
+ it("detects hardcoded password assignment", () => {
51
+ const findings = scanText('const password = "MyS3cr3tP@ssword!"');
52
+ expect(findings.some((f) => f.patternId === "generic_secret_assignment")).toBe(true);
53
+ });
54
+ it("ignores process.env references", () => {
55
+ const findings = scanText("const apiKey = process.env.API_KEY");
56
+ expect(findings.filter((f) => f.patternId === "generic_secret_assignment")).toHaveLength(0);
57
+ });
58
+ it("ignores placeholder values", () => {
59
+ const findings = scanText('password = "your-password-here"');
60
+ expect(findings.filter((f) => f.patternId === "generic_secret_assignment")).toHaveLength(0);
61
+ });
62
+ it("redacts the match value", () => {
63
+ const findings = scanText("token: ghp_abcdefghijklmnopqrstuvwxyz0123456789");
64
+ const f = findings.find((f) => f.patternId === "github_pat");
65
+ expect(f?.match).not.toContain("abcdefghijklmnopqrstuvwxyz");
66
+ expect(f?.match).toContain("*");
67
+ });
68
+ it("returns correct line number", () => {
69
+ const text = "line1\nline2\ntoken: ghp_abcdefghijklmnopqrstuvwxyz0123456789\nline4";
70
+ const findings = scanText(text);
71
+ const f = findings.find((f) => f.patternId === "github_pat");
72
+ expect(f?.line).toBe(3);
73
+ });
74
+ it("returns no findings for clean text", () => {
75
+ expect(scanText("const x = 1; console.log('hello world');")).toHaveLength(0);
76
+ });
77
+ });
78
+ //# sourceMappingURL=scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.test.js","sourceRoot":"","sources":["../../src/__tests__/scanner.test.ts"],"names":[],"mappings":"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"}
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,6 @@
1
+ import { startServer } from "./server.js";
2
+ startServer().catch((err) => {
3
+ process.stderr.write(`[guardbee-secret-scanner] Fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
4
+ process.exit(1);
5
+ });
6
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC/F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { scanText, scanFile, scanDirectory } from "./scanner.js";
2
+ export { SECRET_PATTERNS } from "./patterns.js";
3
+ export type { Finding, ScanResult } from "./scanner.js";
4
+ export type { SecretPattern } from "./patterns.js";
5
+ //# 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,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { scanText, scanFile, scanDirectory } from "./scanner.js";
2
+ export { SECRET_PATTERNS } from "./patterns.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface SecretPattern {
2
+ id: string;
3
+ name: string;
4
+ pattern: RegExp;
5
+ severity: "critical" | "high" | "medium" | "low";
6
+ allowlist?: RegExp[];
7
+ }
8
+ export declare const SECRET_PATTERNS: SecretPattern[];
9
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,EA6P1C,CAAC"}
@@ -0,0 +1,245 @@
1
+ export const SECRET_PATTERNS = [
2
+ // ── Cloud providers ────────────────────────────────────────────────────────
3
+ {
4
+ id: "aws_access_key",
5
+ name: "AWS Access Key ID",
6
+ pattern: /\b(AKIA|ABIA|ACCA|AIPA|AKIA|ANPA|ANVA|APKA)[0-9A-Z]{16}\b/g,
7
+ severity: "critical",
8
+ },
9
+ {
10
+ id: "aws_secret_key",
11
+ name: "AWS Secret Access Key",
12
+ pattern: /(?<![A-Za-z0-9/+])([A-Za-z0-9/+]{40})(?![A-Za-z0-9/+])/g,
13
+ severity: "critical",
14
+ allowlist: [/^[A-Za-z0-9+/]{40}={0,2}$/], // base64 payloads
15
+ },
16
+ {
17
+ id: "google_api_key",
18
+ name: "Google API Key",
19
+ pattern: /AIza[0-9A-Za-z\-_]{35}/g,
20
+ severity: "critical",
21
+ },
22
+ {
23
+ id: "google_oauth",
24
+ name: "Google OAuth Client Secret",
25
+ pattern: /GOCSPX-[0-9A-Za-z\-_]{28}/g,
26
+ severity: "critical",
27
+ },
28
+ // ── Version control & CI ───────────────────────────────────────────────────
29
+ {
30
+ id: "github_pat",
31
+ name: "GitHub Personal Access Token",
32
+ pattern: /ghp_[0-9A-Za-z]{36}/g,
33
+ severity: "critical",
34
+ },
35
+ {
36
+ id: "github_oauth",
37
+ name: "GitHub OAuth Token",
38
+ pattern: /gho_[0-9A-Za-z]{36}/g,
39
+ severity: "critical",
40
+ },
41
+ {
42
+ id: "github_app_token",
43
+ name: "GitHub App Token",
44
+ pattern: /ghs_[0-9A-Za-z]{36}/g,
45
+ severity: "critical",
46
+ },
47
+ {
48
+ id: "github_refresh_token",
49
+ name: "GitHub Refresh Token",
50
+ pattern: /ghr_[0-9A-Za-z]{36}/g,
51
+ severity: "high",
52
+ },
53
+ {
54
+ id: "gitlab_pat",
55
+ name: "GitLab Personal Access Token",
56
+ pattern: /glpat-[0-9A-Za-z\-_]{20}/g,
57
+ severity: "critical",
58
+ },
59
+ // ── Payment ────────────────────────────────────────────────────────────────
60
+ {
61
+ id: "stripe_secret",
62
+ name: "Stripe Secret Key",
63
+ pattern: /sk_(live|test)_[0-9A-Za-z]{24,}/g,
64
+ severity: "critical",
65
+ },
66
+ {
67
+ id: "stripe_publishable",
68
+ name: "Stripe Publishable Key",
69
+ pattern: /pk_(live|test)_[0-9A-Za-z]{24,}/g,
70
+ severity: "medium",
71
+ },
72
+ {
73
+ id: "stripe_restricted",
74
+ name: "Stripe Restricted Key",
75
+ pattern: /rk_(live|test)_[0-9A-Za-z]{24,}/g,
76
+ severity: "critical",
77
+ },
78
+ // ── AI / ML ────────────────────────────────────────────────────────────────
79
+ {
80
+ id: "openai_key",
81
+ name: "OpenAI API Key",
82
+ pattern: /sk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}/g,
83
+ severity: "critical",
84
+ },
85
+ {
86
+ id: "openai_key_v2",
87
+ name: "OpenAI API Key (v2)",
88
+ pattern: /sk-proj-[A-Za-z0-9\-_]{50,}/g,
89
+ severity: "critical",
90
+ },
91
+ {
92
+ id: "anthropic_key",
93
+ name: "Anthropic API Key",
94
+ pattern: /sk-ant-[A-Za-z0-9\-_]{32,}/g,
95
+ severity: "critical",
96
+ },
97
+ {
98
+ id: "huggingface_token",
99
+ name: "HuggingFace Token",
100
+ pattern: /hf_[A-Za-z0-9]{34}/g,
101
+ severity: "high",
102
+ },
103
+ // ── Communication ──────────────────────────────────────────────────────────
104
+ {
105
+ id: "slack_token",
106
+ name: "Slack Token",
107
+ pattern: /xox[baprs]-([0-9a-zA-Z]{10,48})/g,
108
+ severity: "critical",
109
+ },
110
+ {
111
+ id: "slack_webhook",
112
+ name: "Slack Webhook URL",
113
+ pattern: /https:\/\/hooks\.slack\.com\/services\/T[0-9A-Z]{8}\/B[0-9A-Z]{8}\/[0-9a-zA-Z]{24}/g,
114
+ severity: "high",
115
+ },
116
+ {
117
+ id: "twilio_account_sid",
118
+ name: "Twilio Account SID",
119
+ pattern: /AC[0-9a-f]{32}/g,
120
+ severity: "high",
121
+ },
122
+ {
123
+ id: "twilio_auth_token",
124
+ name: "Twilio Auth Token",
125
+ pattern: /(?i:twilio).{0,20}[0-9a-f]{32}/g,
126
+ severity: "critical",
127
+ },
128
+ {
129
+ id: "sendgrid_key",
130
+ name: "SendGrid API Key",
131
+ pattern: /SG\.[0-9A-Za-z\-_]{22}\.[0-9A-Za-z\-_]{43}/g,
132
+ severity: "critical",
133
+ },
134
+ // ── Database URLs ──────────────────────────────────────────────────────────
135
+ {
136
+ id: "db_url_postgres",
137
+ name: "PostgreSQL Connection String with credentials",
138
+ pattern: /postgres(?:ql)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
139
+ severity: "critical",
140
+ allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[A-Z_]+>/],
141
+ },
142
+ {
143
+ id: "db_url_mysql",
144
+ name: "MySQL Connection String with credentials",
145
+ pattern: /mysql:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
146
+ severity: "critical",
147
+ allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[A-Z_]+>/],
148
+ },
149
+ {
150
+ id: "db_url_mongodb",
151
+ name: "MongoDB Connection String with credentials",
152
+ pattern: /mongodb(?:\+srv)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
153
+ severity: "critical",
154
+ allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[A-Z_]+>/],
155
+ },
156
+ {
157
+ id: "db_url_redis",
158
+ name: "Redis Connection String with credentials",
159
+ pattern: /redis:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
160
+ severity: "high",
161
+ allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/],
162
+ },
163
+ // ── Private keys ───────────────────────────────────────────────────────────
164
+ {
165
+ id: "private_key_rsa",
166
+ name: "RSA Private Key",
167
+ pattern: /-----BEGIN RSA PRIVATE KEY-----/g,
168
+ severity: "critical",
169
+ },
170
+ {
171
+ id: "private_key_ec",
172
+ name: "EC Private Key",
173
+ pattern: /-----BEGIN EC PRIVATE KEY-----/g,
174
+ severity: "critical",
175
+ },
176
+ {
177
+ id: "private_key_openssh",
178
+ name: "OpenSSH Private Key",
179
+ pattern: /-----BEGIN OPENSSH PRIVATE KEY-----/g,
180
+ severity: "critical",
181
+ },
182
+ {
183
+ id: "private_key_generic",
184
+ name: "Generic Private Key",
185
+ pattern: /-----BEGIN PRIVATE KEY-----/g,
186
+ severity: "critical",
187
+ },
188
+ {
189
+ id: "pgp_private_key",
190
+ name: "PGP Private Key Block",
191
+ pattern: /-----BEGIN PGP PRIVATE KEY BLOCK-----/g,
192
+ severity: "critical",
193
+ },
194
+ // ── Auth tokens & JWTs ─────────────────────────────────────────────────────
195
+ {
196
+ id: "jwt",
197
+ name: "JSON Web Token",
198
+ pattern: /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
199
+ severity: "high",
200
+ },
201
+ {
202
+ id: "bearer_token",
203
+ name: "Bearer Token in code",
204
+ pattern: /['"](Bearer\s+[A-Za-z0-9\-._~+/]+=*)['"]/gi,
205
+ severity: "high",
206
+ },
207
+ // ── DevOps & infra ─────────────────────────────────────────────────────────
208
+ {
209
+ id: "npm_token",
210
+ name: "npm Access Token",
211
+ pattern: /npm_[A-Za-z0-9]{36}/g,
212
+ severity: "critical",
213
+ },
214
+ {
215
+ id: "docker_pat",
216
+ name: "Docker Hub Personal Access Token",
217
+ pattern: /dckr_pat_[A-Za-z0-9\-_]{27}/g,
218
+ severity: "high",
219
+ },
220
+ {
221
+ id: "vercel_token",
222
+ name: "Vercel API Token",
223
+ pattern: /vercel(?:[._-])?(?:token|api)['":\s=]+([A-Za-z0-9]{24})/gi,
224
+ severity: "high",
225
+ },
226
+ // ── Generic patterns ───────────────────────────────────────────────────────
227
+ {
228
+ id: "generic_secret_assignment",
229
+ name: "Hardcoded secret assignment",
230
+ pattern: /(?:password|passwd|secret|api[_-]?key|auth[_-]?token|access[_-]?token|private[_-]?key)\s*[:=]\s*['"][^'"]{8,}['"]/gi,
231
+ severity: "medium",
232
+ allowlist: [
233
+ /process\.env/,
234
+ /\$\{/,
235
+ /os\.environ/,
236
+ /getenv/,
237
+ /placeholder/i,
238
+ /example/i,
239
+ /your[-_]?/i,
240
+ /<[A-Z_]+>/,
241
+ /\*{3,}/,
242
+ ],
243
+ },
244
+ ];
245
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type SecretPattern } from "./patterns.js";
2
+ export interface Finding {
3
+ patternId: string;
4
+ patternName: string;
5
+ severity: SecretPattern["severity"];
6
+ file?: string;
7
+ line: number;
8
+ column: number;
9
+ match: string;
10
+ context: string;
11
+ }
12
+ export interface ScanResult {
13
+ scannedFiles: number;
14
+ skippedFiles: number;
15
+ totalFindings: number;
16
+ findings: Finding[];
17
+ durationMs: number;
18
+ }
19
+ export declare function scanText(text: string, filePath?: string): Finding[];
20
+ export declare function scanFile(filePath: string): {
21
+ findings: Finding[];
22
+ skipped: boolean;
23
+ };
24
+ export declare function scanDirectory(dirPath: string, options?: {
25
+ maxFiles?: number;
26
+ include?: string[];
27
+ exclude?: string[];
28
+ }): ScanResult;
29
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6BD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAkCnE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAqBpF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC1E,UAAU,CAuDZ"}
@@ -0,0 +1,136 @@
1
+ import { readFileSync, statSync, readdirSync } from "fs";
2
+ import { join, relative, extname } from "path";
3
+ import { SECRET_PATTERNS } from "./patterns.js";
4
+ const SKIP_EXTENSIONS = new Set([
5
+ ".png", ".jpg", ".jpeg", ".gif", ".svg", ".ico", ".webp", ".bmp",
6
+ ".pdf", ".zip", ".tar", ".gz", ".bz2", ".rar", ".7z",
7
+ ".exe", ".dll", ".so", ".dylib", ".bin", ".wasm",
8
+ ".mp3", ".mp4", ".avi", ".mov", ".wav",
9
+ ".ttf", ".woff", ".woff2", ".eot",
10
+ ".lock", // package-lock, yarn.lock — too noisy
11
+ ]);
12
+ const SKIP_DIRS = new Set([
13
+ "node_modules", ".git", ".svn", "dist", "build", ".next",
14
+ "__pycache__", ".mypy_cache", ".pytest_cache", "venv", ".venv",
15
+ "coverage", ".nyc_output",
16
+ ]);
17
+ const MAX_FILE_SIZE = 1 * 1024 * 1024; // 1 MB
18
+ function redact(match) {
19
+ if (match.length <= 8)
20
+ return "***";
21
+ return match.slice(0, 4) + "*".repeat(Math.min(match.length - 8, 20)) + match.slice(-4);
22
+ }
23
+ function isAllowlisted(match, pattern) {
24
+ if (!pattern.allowlist)
25
+ return false;
26
+ return pattern.allowlist.some((allow) => allow.test(match));
27
+ }
28
+ export function scanText(text, filePath) {
29
+ const findings = [];
30
+ const lines = text.split("\n");
31
+ for (const sp of SECRET_PATTERNS) {
32
+ const re = new RegExp(sp.pattern.source, sp.pattern.flags);
33
+ let m;
34
+ while ((m = re.exec(text)) !== null) {
35
+ const matchStr = m[0];
36
+ if (isAllowlisted(matchStr, sp))
37
+ continue;
38
+ // Find line/column
39
+ const before = text.slice(0, m.index);
40
+ const line = before.split("\n").length;
41
+ const lastNl = before.lastIndexOf("\n");
42
+ const column = m.index - (lastNl === -1 ? 0 : lastNl + 1) + 1;
43
+ const contextLine = lines[line - 1] ?? "";
44
+ const redactedContext = contextLine.replace(matchStr, redact(matchStr));
45
+ findings.push({
46
+ patternId: sp.id,
47
+ patternName: sp.name,
48
+ severity: sp.severity,
49
+ file: filePath,
50
+ line,
51
+ column,
52
+ match: redact(matchStr),
53
+ context: redactedContext.trim().slice(0, 200),
54
+ });
55
+ }
56
+ }
57
+ return findings;
58
+ }
59
+ export function scanFile(filePath) {
60
+ const ext = extname(filePath).toLowerCase();
61
+ if (SKIP_EXTENSIONS.has(ext))
62
+ return { findings: [], skipped: true };
63
+ let stat;
64
+ try {
65
+ stat = statSync(filePath);
66
+ }
67
+ catch {
68
+ return { findings: [], skipped: true };
69
+ }
70
+ if (!stat.isFile() || stat.size > MAX_FILE_SIZE)
71
+ return { findings: [], skipped: true };
72
+ let content;
73
+ try {
74
+ content = readFileSync(filePath, "utf8");
75
+ }
76
+ catch {
77
+ return { findings: [], skipped: true };
78
+ }
79
+ return { findings: scanText(content, filePath), skipped: false };
80
+ }
81
+ export function scanDirectory(dirPath, options = {}) {
82
+ const start = Date.now();
83
+ const { maxFiles = 5000, include, exclude } = options;
84
+ const allFindings = [];
85
+ let scannedFiles = 0;
86
+ let skippedFiles = 0;
87
+ function walk(dir) {
88
+ if (scannedFiles + skippedFiles >= maxFiles)
89
+ return;
90
+ let entries;
91
+ try {
92
+ entries = readdirSync(dir, { withFileTypes: true });
93
+ }
94
+ catch {
95
+ return;
96
+ }
97
+ for (const entry of entries) {
98
+ const fullPath = join(dir, entry.name);
99
+ if (entry.isDirectory()) {
100
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))
101
+ continue;
102
+ if (exclude?.some((ex) => entry.name === ex || fullPath.includes(ex)))
103
+ continue;
104
+ walk(fullPath);
105
+ }
106
+ else if (entry.isFile()) {
107
+ const relPath = relative(dirPath, fullPath);
108
+ if (exclude?.some((ex) => relPath.includes(ex))) {
109
+ skippedFiles++;
110
+ continue;
111
+ }
112
+ if (include && !include.some((inc) => relPath.includes(inc))) {
113
+ skippedFiles++;
114
+ continue;
115
+ }
116
+ const { findings, skipped } = scanFile(fullPath);
117
+ if (skipped) {
118
+ skippedFiles++;
119
+ }
120
+ else {
121
+ scannedFiles++;
122
+ allFindings.push(...findings);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ walk(dirPath);
128
+ return {
129
+ scannedFiles,
130
+ skippedFiles,
131
+ totalFindings: allFindings.length,
132
+ findings: allFindings,
133
+ durationMs: Date.now() - start,
134
+ };
135
+ }
136
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAgCA,wBAAsB,WAAW,kBA0HhC"}
package/dist/server.js ADDED
@@ -0,0 +1,121 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ import { scanText, scanFile, scanDirectory } from "./scanner.js";
5
+ import { SECRET_PATTERNS } from "./patterns.js";
6
+ function formatFindings(result) {
7
+ if (result.totalFindings === 0) {
8
+ return `✅ No secrets found. Scanned ${result.scannedFiles} files in ${result.durationMs}ms.`;
9
+ }
10
+ const bySeverity = { critical: 0, high: 0, medium: 0, low: 0 };
11
+ for (const f of result.findings)
12
+ bySeverity[f.severity]++;
13
+ const lines = [
14
+ `⚠️ Found ${result.totalFindings} potential secret(s) in ${result.scannedFiles} files (${result.durationMs}ms)`,
15
+ ` Critical: ${bySeverity.critical} High: ${bySeverity.high} Medium: ${bySeverity.medium} Low: ${bySeverity.low}`,
16
+ "",
17
+ ];
18
+ for (const f of result.findings) {
19
+ const loc = f.file ? `${f.file}:${f.line}:${f.column}` : `line ${f.line}:${f.column}`;
20
+ lines.push(`[${f.severity.toUpperCase()}] ${f.patternName}`);
21
+ lines.push(` Location : ${loc}`);
22
+ lines.push(` Match : ${f.match}`);
23
+ lines.push(` Context : ${f.context}`);
24
+ lines.push("");
25
+ }
26
+ return lines.join("\n");
27
+ }
28
+ export async function startServer() {
29
+ const server = new McpServer({
30
+ name: "guardbee-secret-scanner",
31
+ version: "0.1.0",
32
+ });
33
+ server.tool("scan_text", "Scan a text string or code snippet for exposed secrets and API keys", {
34
+ content: z.string().describe("The text content to scan"),
35
+ label: z.string().optional().describe("Optional label shown in findings (e.g. filename)"),
36
+ }, async ({ content, label }) => {
37
+ const findings = scanText(content, label);
38
+ if (findings.length === 0) {
39
+ return {
40
+ content: [{ type: "text", text: "✅ No secrets found in the provided text." }],
41
+ };
42
+ }
43
+ const bySeverity = { critical: 0, high: 0, medium: 0, low: 0 };
44
+ for (const f of findings)
45
+ bySeverity[f.severity]++;
46
+ const lines = [
47
+ `⚠️ Found ${findings.length} potential secret(s)`,
48
+ ` Critical: ${bySeverity.critical} High: ${bySeverity.high} Medium: ${bySeverity.medium} Low: ${bySeverity.low}`,
49
+ "",
50
+ ];
51
+ for (const f of findings) {
52
+ const loc = label ? `${label}:${f.line}:${f.column}` : `line ${f.line}:${f.column}`;
53
+ lines.push(`[${f.severity.toUpperCase()}] ${f.patternName}`);
54
+ lines.push(` Location : ${loc}`);
55
+ lines.push(` Match : ${f.match}`);
56
+ lines.push(` Context : ${f.context}`);
57
+ lines.push("");
58
+ }
59
+ return { content: [{ type: "text", text: lines.join("\n") }] };
60
+ });
61
+ server.tool("scan_file", "Scan a single file for exposed secrets and API keys", {
62
+ path: z.string().describe("Absolute or relative path to the file to scan"),
63
+ }, async ({ path: filePath }) => {
64
+ const { findings, skipped } = scanFile(filePath);
65
+ if (skipped) {
66
+ return {
67
+ content: [{ type: "text", text: `⏭️ File skipped (binary, too large, or unreadable): ${filePath}` }],
68
+ };
69
+ }
70
+ if (findings.length === 0) {
71
+ return {
72
+ content: [{ type: "text", text: `✅ No secrets found in ${filePath}` }],
73
+ };
74
+ }
75
+ const result = {
76
+ scannedFiles: 1,
77
+ skippedFiles: 0,
78
+ totalFindings: findings.length,
79
+ findings,
80
+ durationMs: 0,
81
+ };
82
+ return { content: [{ type: "text", text: formatFindings(result) }] };
83
+ });
84
+ server.tool("scan_directory", "Recursively scan a directory for exposed secrets and API keys. Automatically skips node_modules, .git, dist, and binary files.", {
85
+ path: z.string().describe("Absolute or relative path to the directory to scan"),
86
+ maxFiles: z.number().optional().describe("Maximum number of files to scan (default: 5000)"),
87
+ include: z
88
+ .array(z.string())
89
+ .optional()
90
+ .describe("Only scan files whose path contains one of these strings (e.g. [\".env\", \".ts\"])"),
91
+ exclude: z
92
+ .array(z.string())
93
+ .optional()
94
+ .describe("Skip files/dirs whose path contains one of these strings"),
95
+ }, async ({ path: dirPath, maxFiles, include, exclude }) => {
96
+ const result = scanDirectory(dirPath, { maxFiles, include, exclude });
97
+ return { content: [{ type: "text", text: formatFindings(result) }] };
98
+ });
99
+ server.tool("list_patterns", "List all secret patterns that the scanner can detect", {}, async () => {
100
+ const lines = ["Supported secret patterns:\n"];
101
+ const bySeverity = new Map();
102
+ for (const p of SECRET_PATTERNS) {
103
+ const list = bySeverity.get(p.severity) ?? [];
104
+ list.push(p);
105
+ bySeverity.set(p.severity, list);
106
+ }
107
+ for (const sev of ["critical", "high", "medium", "low"]) {
108
+ const patterns = bySeverity.get(sev) ?? [];
109
+ if (patterns.length === 0)
110
+ continue;
111
+ lines.push(`[${sev.toUpperCase()}]`);
112
+ for (const p of patterns)
113
+ lines.push(` • ${p.name} (${p.id})`);
114
+ lines.push("");
115
+ }
116
+ return { content: [{ type: "text", text: lines.join("\n") }] };
117
+ });
118
+ const transport = new StdioServerTransport();
119
+ await server.connect(transport);
120
+ }
121
+ //# 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/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@guardbee/mcp-secret-scanner",
3
+ "version": "0.1.0",
4
+ "description": "MCP server that scans files and directories for exposed secrets, API keys, and credentials",
5
+ "type": "module",
6
+ "bin": {
7
+ "guardbee-secret-scanner": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "start": "node dist/cli.js",
25
+ "test": "vitest run",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^26.5.0",
33
+ "typescript": "^5.0.0",
34
+ "vitest": "^2.0.0"
35
+ },
36
+ "keywords": [
37
+ "mcp",
38
+ "security",
39
+ "secret-scanning",
40
+ "guardbee",
41
+ "devtools"
42
+ ],
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/GuardBee/guardbee-mcp-secret-scanner"
47
+ }
48
+ }