@sulthonzh/mcp-audit 1.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.
Files changed (50) hide show
  1. package/README.md +134 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +165 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config/config-loader.d.ts +17 -0
  7. package/dist/config/config-loader.d.ts.map +1 -0
  8. package/dist/config/config-loader.js +72 -0
  9. package/dist/config/config-loader.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +22 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/reporter/report-generator.d.ts +7 -0
  15. package/dist/reporter/report-generator.d.ts.map +1 -0
  16. package/dist/reporter/report-generator.js +240 -0
  17. package/dist/reporter/report-generator.js.map +1 -0
  18. package/dist/reporters/sarif-reporter.d.ts +18 -0
  19. package/dist/reporters/sarif-reporter.d.ts.map +1 -0
  20. package/dist/reporters/sarif-reporter.js +148 -0
  21. package/dist/reporters/sarif-reporter.js.map +1 -0
  22. package/dist/scanners/config-scanner.d.ts +11 -0
  23. package/dist/scanners/config-scanner.d.ts.map +1 -0
  24. package/dist/scanners/config-scanner.js +399 -0
  25. package/dist/scanners/config-scanner.js.map +1 -0
  26. package/dist/scanners/docker-scanner.d.ts +13 -0
  27. package/dist/scanners/docker-scanner.d.ts.map +1 -0
  28. package/dist/scanners/docker-scanner.js +384 -0
  29. package/dist/scanners/docker-scanner.js.map +1 -0
  30. package/dist/scanners/helm-scanner.d.ts +16 -0
  31. package/dist/scanners/helm-scanner.d.ts.map +1 -0
  32. package/dist/scanners/helm-scanner.js +385 -0
  33. package/dist/scanners/helm-scanner.js.map +1 -0
  34. package/dist/scanners/k8s-scanner.d.ts +14 -0
  35. package/dist/scanners/k8s-scanner.d.ts.map +1 -0
  36. package/dist/scanners/k8s-scanner.js +315 -0
  37. package/dist/scanners/k8s-scanner.js.map +1 -0
  38. package/dist/scanners/server-scanner.d.ts +13 -0
  39. package/dist/scanners/server-scanner.d.ts.map +1 -0
  40. package/dist/scanners/server-scanner.js +346 -0
  41. package/dist/scanners/server-scanner.js.map +1 -0
  42. package/dist/types/security-result.d.ts +35 -0
  43. package/dist/types/security-result.d.ts.map +1 -0
  44. package/dist/types/security-result.js +3 -0
  45. package/dist/types/security-result.js.map +1 -0
  46. package/dist/utils/logger.d.ts +19 -0
  47. package/dist/utils/logger.d.ts.map +1 -0
  48. package/dist/utils/logger.js +71 -0
  49. package/dist/utils/logger.js.map +1 -0
  50. package/package.json +77 -0
package/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # MCP Audit 🔍
2
+
3
+ Security scanner for MCP (Model Context Protocol) servers — and your container/K8s/Helm infrastructure too. Think of it as `npm audit` but for your AI agent integrations and cloud-native deployments.
4
+
5
+ ## Why MCP Audit?
6
+
7
+ Everyone's installing MCP servers like crazy, but nobody's checking if they're about to give a plugin full access to their filesystem, data, and context. MCP Audit gives you visibility into what these servers can actually do — and flags the risky stuff before it bites you.
8
+
9
+ It also scans Dockerfiles, Kubernetes manifests, and Helm charts, because your AI tools don't live in a vacuum. They run in containers, on clusters, behind charts. Might as well audit the whole stack.
10
+
11
+ ## What It Scans
12
+
13
+ | Target | Command | What It Catches |
14
+ |--------|---------|-----------------|
15
+ | MCP config files | `mcp-audit scan` | Risky permissions, overly broad file access |
16
+ | MCP server repos | `mcp-audit check <repo>` | Prompt injection, hardcoded secrets, trust scoring |
17
+ | Dockerfiles | `mcp-audit docker <path>` | Root user, exposed secrets, outdated base images |
18
+ | Kubernetes manifests | `mcp-audit k8s <path>` | Privileged containers, hostNetwork, runaway resources |
19
+ | Helm charts | `mcp-audit helm <path>` | Hardcoded secrets in values.yaml, unsafe defaults |
20
+
21
+ ## Quick Start
22
+
23
+ ```bash
24
+ npm install -g mcp-audit
25
+
26
+ # Scan your MCP config
27
+ mcp-audit scan
28
+
29
+ # Audit a remote MCP server
30
+ mcp-audit check github.com/user/mcp-server
31
+
32
+ # Scan a Dockerfile
33
+ mcp-audit docker ./Dockerfile
34
+
35
+ # Scan K8s manifests
36
+ mcp-audit k8s ./manifests
37
+
38
+ # Scan a Helm chart
39
+ mcp-audit helm ./my-chart
40
+
41
+ # CI mode (exits with code on findings)
42
+ mcp-audit check --ci
43
+ ```
44
+
45
+ ## Usage
46
+
47
+ ### Scan MCP Configuration
48
+ Checks `claude_desktop_config.json`, `.cursor/mcp.json`, and other MCP config files for risky permissions.
49
+
50
+ ```bash
51
+ mcp-audit scan
52
+ mcp-audit scan -o report.json # save report
53
+ ```
54
+
55
+ ### Check a Remote Server
56
+ Clones the repo, runs static analysis, and generates a trust score based on GitHub signals.
57
+
58
+ ```bash
59
+ mcp-audit check https://github.com/username/mcp-server
60
+ mcp-audit check https://github.com/username/mcp-server --ci # CI-friendly
61
+ ```
62
+
63
+ ### Docker Security
64
+ ```bash
65
+ mcp-audit docker ./Dockerfile
66
+ mcp-audit docker ./docker-dir # scans all Dockerfiles in directory
67
+ ```
68
+
69
+ Detects: root user, `ADD` vs `COPY`, hardcoded secrets, `latest` tags, missing `.dockerignore`.
70
+
71
+ ### Kubernetes Security
72
+ ```bash
73
+ mcp-audit k8s ./manifests
74
+ mcp-audit k8s ./manifests --strict # stricter checks
75
+ ```
76
+
77
+ Detects: privileged containers, hostNetwork/hostPID, missing resource limits, `alwaysPullPolicy` not set, containers running as root.
78
+
79
+ ### Helm Chart Security
80
+ ```bash
81
+ mcp-audit helm ./my-chart
82
+ mcp-audit helm ./my-chart --strict -o report.json
83
+ ```
84
+
85
+ Automatically detects Helm charts (looks for `Chart.yaml`). Scans `values.yaml` for hardcoded secrets and privileged flags, strips Go template syntax from `templates/` and runs K8s security checks, and validates `Chart.yaml` for deprecated API versions and missing metadata.
86
+
87
+ ### CI Integration
88
+ All scanners support `--ci` for pipeline-friendly output and proper exit codes. Use `--strict` to fail on warnings too.
89
+
90
+ ```yaml
91
+ # GitHub Actions example
92
+ - name: Security Audit
93
+ run: |
94
+ npx mcp-audit k8s ./k8s --ci --strict
95
+ npx mcp-audit docker . --ci
96
+ npx mcp-audit helm ./charts --ci
97
+ ```
98
+
99
+ ## Configuration
100
+
101
+ Create `mcp-audit.config.json` to customize:
102
+
103
+ ```json
104
+ {
105
+ "vulnerabilityDatabase": "https://raw.githubusercontent.com/your-org/mcp-vuln-db/main/database.json",
106
+ "trustWeight": {
107
+ "stars": 0.3,
108
+ "tests": 0.3,
109
+ "ci": 0.2,
110
+ "age": 0.2
111
+ }
112
+ }
113
+ ```
114
+
115
+ ## Pre-commit Hook
116
+
117
+ ```yaml
118
+ # .pre-commit-config.yaml
119
+ repos:
120
+ - repo: local
121
+ hooks:
122
+ - id: mcp-audit
123
+ name: MCP Security Audit
124
+ entry: mcp-audit check --ci
125
+ language: system
126
+ ```
127
+
128
+ ## Contributing
129
+
130
+ PRs welcome. Open an issue first if it's a significant change.
131
+
132
+ ## License
133
+
134
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# 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,165 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const config_scanner_1 = require("./scanners/config-scanner");
6
+ const server_scanner_1 = require("./scanners/server-scanner");
7
+ const report_generator_1 = require("./reporter/report-generator");
8
+ const logger_1 = require("./utils/logger");
9
+ const config_loader_1 = require("./config/config-loader");
10
+ const docker_scanner_1 = require("./scanners/docker-scanner");
11
+ const k8s_scanner_1 = require("./scanners/k8s-scanner");
12
+ const helm_scanner_1 = require("./scanners/helm-scanner");
13
+ commander_1.program
14
+ .name('mcp-audit')
15
+ .description('Security scanner for MCP (Model Context Protocol) servers')
16
+ .version('1.0.0');
17
+ commander_1.program
18
+ .command('scan')
19
+ .description('Scan local MCP configuration files for security issues')
20
+ .option('-v, --verbose', 'Verbose output')
21
+ .option('-o, --output <file>', 'Output file for report')
22
+ .action(async (options) => {
23
+ try {
24
+ logger_1.logger.info('Starting MCP configuration scan...');
25
+ const config = (0, config_loader_1.loadConfig)();
26
+ const results = await (0, config_scanner_1.scanConfig)(config, options.verbose);
27
+ await (0, report_generator_1.generateReport)(results, options.output);
28
+ logger_1.logger.info('✅ Configuration scan completed');
29
+ }
30
+ catch (error) {
31
+ logger_1.logger.error('❌ Configuration scan failed:', error);
32
+ process.exit(1);
33
+ }
34
+ });
35
+ commander_1.program
36
+ .command('check')
37
+ .description('Check a specific MCP server for security issues')
38
+ .argument('<repository>', 'GitHub repository URL or path')
39
+ .option('-v, --verbose', 'Verbose output')
40
+ .option('-o, --output <file>', 'Output file for report')
41
+ .option('--ci', 'CI mode (silent, exit codes only)')
42
+ .option('--depth <number>', 'Scan depth for analysis', '2')
43
+ .action(async (repository, options) => {
44
+ try {
45
+ logger_1.logger.info(`Starting MCP server analysis for: ${repository}`);
46
+ const config = (0, config_loader_1.loadConfig)();
47
+ const results = await (0, server_scanner_1.checkServer)(repository, {
48
+ ...config,
49
+ scanDepth: parseInt(options.depth)
50
+ }, options.verbose);
51
+ await (0, report_generator_1.generateReport)(results, options.output);
52
+ if (!options.ci) {
53
+ logger_1.logger.info('✅ Server analysis completed');
54
+ }
55
+ process.exit(results.issues.length > 0 ? 1 : 0);
56
+ }
57
+ catch (error) {
58
+ logger_1.logger.error('❌ Server analysis failed:', error);
59
+ process.exit(1);
60
+ }
61
+ });
62
+ commander_1.program
63
+ .command('docker')
64
+ .description('Scan Dockerfiles, compose files, and .env for container security issues')
65
+ .argument('<path>', 'Directory or file to scan')
66
+ .option('-v, --verbose', 'Verbose output')
67
+ .option('-o, --output <file>', 'Output file for report')
68
+ .option('--strict', 'Treat warnings as errors (exit 1)')
69
+ .option('--ci', 'CI mode (no color, exit codes only)')
70
+ .action(async (targetPath, options) => {
71
+ try {
72
+ if (!options.ci)
73
+ logger_1.logger.info(`Scanning Docker configs in: ${targetPath}`);
74
+ const results = await (0, docker_scanner_1.scanDocker)(targetPath, { strict: options.strict });
75
+ await (0, report_generator_1.generateReport)(results, options.output);
76
+ if (!options.ci) {
77
+ const score = results.score ?? 'N/A';
78
+ const issueCount = results.issues.length;
79
+ logger_1.logger.info(`✅ Docker scan completed — ${issueCount} issue(s) found, score: ${score}`);
80
+ }
81
+ const hasHigh = results.issues.some((i) => i.severity === 'high');
82
+ const fail = options.strict ? results.issues.length > 0 : hasHigh;
83
+ process.exit(fail ? 1 : 0);
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error('❌ Docker scan failed:', error);
87
+ process.exit(1);
88
+ }
89
+ });
90
+ commander_1.program
91
+ .command('k8s')
92
+ .description('Scan Kubernetes manifests (YAML) for security misconfigurations')
93
+ .argument('<path>', 'Directory or file to scan')
94
+ .option('-v, --verbose', 'Verbose output')
95
+ .option('-o, --output <file>', 'Output file for report')
96
+ .option('--strict', 'Treat all issues as failures (exit 1)')
97
+ .option('--ci', 'CI mode (no color, exit codes only)')
98
+ .action(async (targetPath, options) => {
99
+ try {
100
+ if (!options.ci)
101
+ logger_1.logger.info(`Scanning K8s manifests in: ${targetPath}`);
102
+ const results = await (0, k8s_scanner_1.scanK8s)(targetPath, { strict: options.strict });
103
+ await (0, report_generator_1.generateReport)(results, options.output);
104
+ if (!options.ci) {
105
+ const score = results.score ?? 'N/A';
106
+ const issueCount = results.issues.length;
107
+ logger_1.logger.info(`✅ K8s scan completed — ${issueCount} issue(s) found, score: ${score}`);
108
+ }
109
+ const hasHigh = results.issues.some((i) => i.type === 'high');
110
+ const fail = options.strict ? results.issues.length > 0 : hasHigh;
111
+ process.exit(fail ? 1 : 0);
112
+ }
113
+ catch (error) {
114
+ logger_1.logger.error('❌ K8s scan failed:', error);
115
+ process.exit(1);
116
+ }
117
+ });
118
+ commander_1.program
119
+ .command('helm')
120
+ .description('Scan Helm charts for security misconfigurations')
121
+ .argument('<path>', 'Helm chart directory or parent directory')
122
+ .option('-v, --verbose', 'Verbose output')
123
+ .option('-o, --output <file>', 'Output file for report')
124
+ .option('--strict', 'Treat all issues as failures (exit 1)')
125
+ .option('--ci', 'CI mode (no color, exit codes only)')
126
+ .action(async (targetPath, options) => {
127
+ try {
128
+ if (!options.ci)
129
+ logger_1.logger.info(`Scanning Helm charts in: ${targetPath}`);
130
+ const results = await (0, helm_scanner_1.scanHelm)(targetPath, { strict: options.strict });
131
+ await (0, report_generator_1.generateReport)(results, options.output);
132
+ if (!options.ci) {
133
+ const score = results.score ?? 'N/A';
134
+ const issueCount = results.issues.length;
135
+ logger_1.logger.info(`✅ Helm scan completed — ${issueCount} issue(s) found, score: ${score}`);
136
+ }
137
+ const hasHigh = results.issues.some((i) => i.type === 'high');
138
+ const fail = options.strict ? results.issues.length > 0 : hasHigh;
139
+ process.exit(fail ? 1 : 0);
140
+ }
141
+ catch (error) {
142
+ logger_1.logger.error('❌ Helm scan failed:', error);
143
+ process.exit(1);
144
+ }
145
+ });
146
+ commander_1.program
147
+ .command('config')
148
+ .description('Manage MCP Audit configuration')
149
+ .option('--init', 'Initialize configuration file')
150
+ .option('--show', 'Show current configuration')
151
+ .action(async (options) => {
152
+ const config = (0, config_loader_1.loadConfig)();
153
+ if (options.init) {
154
+ await (0, config_loader_1.initializeConfig)();
155
+ logger_1.logger.info('✅ Configuration initialized');
156
+ return;
157
+ }
158
+ if (options.show) {
159
+ console.log(JSON.stringify(config, null, 2));
160
+ return;
161
+ }
162
+ console.log('Use --init to create configuration or --show to view current config');
163
+ });
164
+ commander_1.program.parse();
165
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,8DAAuD;AACvD,8DAAwD;AACxD,kEAA6D;AAC7D,2CAAwC;AACxC,0DAAsE;AACtE,8DAAuD;AACvD,wDAAiD;AACjD,0DAAmD;AAEnD,mBAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,eAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,0BAAU,GAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,cAAc,EAAE,+BAA+B,CAAC;KACzD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,MAAM,EAAE,mCAAmC,CAAC;KACnD,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,GAAG,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,eAAM,CAAC,IAAI,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAA,0BAAU,GAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAW,EAAC,UAAU,EAAE;YAC5C,GAAG,MAAM;YACT,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yEAAyE,CAAC;KACtF,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;KACvD,MAAM,CAAC,MAAM,EAAE,qCAAqC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,eAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YACrC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACzC,eAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,iEAAiE,CAAC;KAC9E,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;KAC3D,MAAM,CAAC,MAAM,EAAE,qCAAqC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,eAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAO,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YACrC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACzC,eAAM,CAAC,IAAI,CAAC,0BAA0B,UAAU,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,QAAQ,EAAE,0CAA0C,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;KAC3D,MAAM,CAAC,MAAM,EAAE,qCAAqC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,eAAM,CAAC,IAAI,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,IAAA,uBAAQ,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,IAAA,iCAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YACrC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACzC,eAAM,CAAC,IAAI,CAAC,2BAA2B,UAAU,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC;KACjD,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,MAAM,GAAG,IAAA,0BAAU,GAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAA,gCAAgB,GAAE,CAAC;QACzB,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEL,mBAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface MCPAuditConfig {
2
+ vulnerabilityDatabase: string;
3
+ trustWeight: {
4
+ stars: number;
5
+ tests: number;
6
+ ci: number;
7
+ age: number;
8
+ };
9
+ allowedFileAccess: string[];
10
+ scanDepth: number;
11
+ excludePatterns: string[];
12
+ }
13
+ export declare function getConfigPath(): string;
14
+ export declare function getDefaultConfigPath(): string;
15
+ export declare function loadConfig(configPath?: string): MCPAuditConfig;
16
+ export declare function initializeConfig(configPath?: string): Promise<void>;
17
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAyBD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAyB9D;AAED,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE"}
@@ -0,0 +1,72 @@
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.getConfigPath = getConfigPath;
7
+ exports.getDefaultConfigPath = getDefaultConfigPath;
8
+ exports.loadConfig = loadConfig;
9
+ exports.initializeConfig = initializeConfig;
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = require("os");
13
+ const DEFAULT_CONFIG = {
14
+ vulnerabilityDatabase: 'https://raw.githubusercontent.com/sulthonzh/mcp-vulnerability-database/main/database.json',
15
+ trustWeight: {
16
+ stars: 0.3,
17
+ tests: 0.3,
18
+ ci: 0.2,
19
+ age: 0.2
20
+ },
21
+ allowedFileAccess: [
22
+ '~/documents',
23
+ '~/projects',
24
+ '~/downloads'
25
+ ],
26
+ scanDepth: 2,
27
+ excludePatterns: [
28
+ 'node_modules/**',
29
+ 'dist/**',
30
+ 'build/**',
31
+ '**/*.log',
32
+ '**/*.tmp'
33
+ ]
34
+ };
35
+ function getConfigPath() {
36
+ return path_1.default.join(process.cwd(), 'mcp-audit.config.json');
37
+ }
38
+ function getDefaultConfigPath() {
39
+ return path_1.default.join((0, os_1.homedir)(), '.mcp-audit.json');
40
+ }
41
+ function loadConfig(configPath) {
42
+ const configFile = configPath || getConfigPath();
43
+ if (fs_extra_1.default.existsSync(configFile)) {
44
+ try {
45
+ const userConfig = fs_extra_1.default.readJsonSync(configFile);
46
+ return { ...DEFAULT_CONFIG, ...userConfig };
47
+ }
48
+ catch (error) {
49
+ console.warn(`Warning: Could not parse config file ${configFile}, using defaults`);
50
+ return DEFAULT_CONFIG;
51
+ }
52
+ }
53
+ // Check for global config
54
+ const globalConfigFile = getDefaultConfigPath();
55
+ if (fs_extra_1.default.existsSync(globalConfigFile)) {
56
+ try {
57
+ const globalConfig = fs_extra_1.default.readJsonSync(globalConfigFile);
58
+ return { ...DEFAULT_CONFIG, ...globalConfig };
59
+ }
60
+ catch (error) {
61
+ console.warn(`Warning: Could not parse global config file ${globalConfigFile}, using defaults`);
62
+ }
63
+ }
64
+ return DEFAULT_CONFIG;
65
+ }
66
+ async function initializeConfig(configPath) {
67
+ const configFile = configPath || getConfigPath();
68
+ const config = loadConfig();
69
+ await fs_extra_1.default.writeJson(configFile, config, { spaces: 2 });
70
+ console.log(`Configuration initialized at: ${configFile}`);
71
+ }
72
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":";;;;;AAwCA,sCAEC;AAED,oDAEC;AAED,gCAyBC;AAED,4CAMC;AAjFD,wDAA0B;AAC1B,gDAAwB;AACxB,2BAA6B;AAe7B,MAAM,cAAc,GAAmB;IACrC,qBAAqB,EAAE,2FAA2F;IAClH,WAAW,EAAE;QACX,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,GAAG;QACV,EAAE,EAAE,GAAG;QACP,GAAG,EAAE,GAAG;KACT;IACD,iBAAiB,EAAE;QACjB,aAAa;QACb,YAAY;QACZ,aAAa;KACd;IACD,SAAS,EAAE,CAAC;IACZ,eAAe,EAAE;QACf,iBAAiB;QACjB,SAAS;QACT,UAAU;QACV,UAAU;QACV,UAAU;KACX;CACF,CAAC;AAEF,SAAgB,aAAa;IAC3B,OAAO,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,cAAI,CAAC,IAAI,CAAC,IAAA,YAAO,GAAE,EAAE,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,UAAU,GAAG,UAAU,IAAI,aAAa,EAAE,CAAC;IAEjD,IAAI,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,kBAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wCAAwC,UAAU,kBAAkB,CAAC,CAAC;YACnF,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;IAChD,IAAI,kBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,kBAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACvD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,YAAY,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,+CAA+C,gBAAgB,kBAAkB,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,UAAmB;IACxD,MAAM,UAAU,GAAG,UAAU,IAAI,aAAa,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { scanConfig } from './scanners/config-scanner';
2
+ export { checkServer } from './scanners/server-scanner';
3
+ export { generateReport } from './reporter/report-generator';
4
+ export { loadConfig, initializeConfig } from './config/config-loader';
5
+ export { logger } from './utils/logger';
6
+ export { scanDocker } from './scanners/docker-scanner';
7
+ export { SecurityResult, SecurityIssue } from './types/security-result';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ // MCP Audit - Main entry point
3
+ // This file serves as the main entry point for the package
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.scanDocker = exports.logger = exports.initializeConfig = exports.loadConfig = exports.generateReport = exports.checkServer = exports.scanConfig = void 0;
6
+ var config_scanner_1 = require("./scanners/config-scanner");
7
+ Object.defineProperty(exports, "scanConfig", { enumerable: true, get: function () { return config_scanner_1.scanConfig; } });
8
+ var server_scanner_1 = require("./scanners/server-scanner");
9
+ Object.defineProperty(exports, "checkServer", { enumerable: true, get: function () { return server_scanner_1.checkServer; } });
10
+ var report_generator_1 = require("./reporter/report-generator");
11
+ Object.defineProperty(exports, "generateReport", { enumerable: true, get: function () { return report_generator_1.generateReport; } });
12
+ var config_loader_1 = require("./config/config-loader");
13
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_loader_1.loadConfig; } });
14
+ Object.defineProperty(exports, "initializeConfig", { enumerable: true, get: function () { return config_loader_1.initializeConfig; } });
15
+ var logger_1 = require("./utils/logger");
16
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
17
+ var docker_scanner_1 = require("./scanners/docker-scanner");
18
+ Object.defineProperty(exports, "scanDocker", { enumerable: true, get: function () { return docker_scanner_1.scanDocker; } });
19
+ // Re-export command for programmatic usage
20
+ // Note: program is not exported due to circular dependency
21
+ // Use cli module directly for programmatic access
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B,2DAA2D;;;AAE3D,4DAAuD;AAA9C,4GAAA,UAAU,OAAA;AACnB,4DAAwD;AAA/C,6GAAA,WAAW,OAAA;AACpB,gEAA6D;AAApD,kHAAA,cAAc,OAAA;AACvB,wDAAsE;AAA7D,2GAAA,UAAU,OAAA;AAAE,iHAAA,gBAAgB,OAAA;AACrC,yCAAwC;AAA/B,gGAAA,MAAM,OAAA;AACf,4DAAuD;AAA9C,4GAAA,UAAU,OAAA;AAGnB,2CAA2C;AAC3C,2DAA2D;AAC3D,kDAAkD"}
@@ -0,0 +1,7 @@
1
+ import { SecurityResult } from '../types/security-result';
2
+ export interface ReportOptions {
3
+ format: 'json' | 'table' | 'summary' | 'sarif';
4
+ output?: string;
5
+ }
6
+ export declare function generateReport(result: SecurityResult, outputPath?: string): Promise<void>;
7
+ //# sourceMappingURL=report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/reporter/report-generator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAGzE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/F"}