@mcp-guardian/server 0.3.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 (106) hide show
  1. package/README.md +505 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +216 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/clients/nvd-client.d.ts +17 -0
  7. package/dist/clients/nvd-client.d.ts.map +1 -0
  8. package/dist/clients/nvd-client.js +64 -0
  9. package/dist/clients/nvd-client.js.map +1 -0
  10. package/dist/clients/osv-client.d.ts +19 -0
  11. package/dist/clients/osv-client.d.ts.map +1 -0
  12. package/dist/clients/osv-client.js +60 -0
  13. package/dist/clients/osv-client.js.map +1 -0
  14. package/dist/clients/pricing-client.d.ts +16 -0
  15. package/dist/clients/pricing-client.d.ts.map +1 -0
  16. package/dist/clients/pricing-client.js +171 -0
  17. package/dist/clients/pricing-client.js.map +1 -0
  18. package/dist/config-parser.d.ts +24 -0
  19. package/dist/config-parser.d.ts.map +1 -0
  20. package/dist/config-parser.js +96 -0
  21. package/dist/config-parser.js.map +1 -0
  22. package/dist/container.d.ts +12 -0
  23. package/dist/container.d.ts.map +1 -0
  24. package/dist/container.js +22 -0
  25. package/dist/container.js.map +1 -0
  26. package/dist/database/history-db.d.ts +28 -0
  27. package/dist/database/history-db.d.ts.map +1 -0
  28. package/dist/database/history-db.js +154 -0
  29. package/dist/database/history-db.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +247 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/proxy/proxy-manager.d.ts +12 -0
  35. package/dist/proxy/proxy-manager.d.ts.map +1 -0
  36. package/dist/proxy/proxy-manager.js +37 -0
  37. package/dist/proxy/proxy-manager.js.map +1 -0
  38. package/dist/proxy/proxy-server.d.ts +26 -0
  39. package/dist/proxy/proxy-server.d.ts.map +1 -0
  40. package/dist/proxy/proxy-server.js +99 -0
  41. package/dist/proxy/proxy-server.js.map +1 -0
  42. package/dist/reporter/report-generator.d.ts +9 -0
  43. package/dist/reporter/report-generator.d.ts.map +1 -0
  44. package/dist/reporter/report-generator.js +145 -0
  45. package/dist/reporter/report-generator.js.map +1 -0
  46. package/dist/scanners/auth-prober.d.ts +13 -0
  47. package/dist/scanners/auth-prober.d.ts.map +1 -0
  48. package/dist/scanners/auth-prober.js +59 -0
  49. package/dist/scanners/auth-prober.js.map +1 -0
  50. package/dist/scanners/command-validator.d.ts +15 -0
  51. package/dist/scanners/command-validator.d.ts.map +1 -0
  52. package/dist/scanners/command-validator.js +50 -0
  53. package/dist/scanners/command-validator.js.map +1 -0
  54. package/dist/scanners/cve-checker.d.ts +15 -0
  55. package/dist/scanners/cve-checker.d.ts.map +1 -0
  56. package/dist/scanners/cve-checker.js +28 -0
  57. package/dist/scanners/cve-checker.js.map +1 -0
  58. package/dist/scanners/secret-scanner.d.ts +12 -0
  59. package/dist/scanners/secret-scanner.d.ts.map +1 -0
  60. package/dist/scanners/secret-scanner.js +72 -0
  61. package/dist/scanners/secret-scanner.js.map +1 -0
  62. package/dist/scanners/typo-squat-detector.d.ts +14 -0
  63. package/dist/scanners/typo-squat-detector.d.ts.map +1 -0
  64. package/dist/scanners/typo-squat-detector.js +82 -0
  65. package/dist/scanners/typo-squat-detector.js.map +1 -0
  66. package/dist/services/cost-auditor.d.ts +14 -0
  67. package/dist/services/cost-auditor.d.ts.map +1 -0
  68. package/dist/services/cost-auditor.js +90 -0
  69. package/dist/services/cost-auditor.js.map +1 -0
  70. package/dist/services/health-monitor.d.ts +8 -0
  71. package/dist/services/health-monitor.d.ts.map +1 -0
  72. package/dist/services/health-monitor.js +51 -0
  73. package/dist/services/health-monitor.js.map +1 -0
  74. package/dist/services/security-scanner.d.ts +20 -0
  75. package/dist/services/security-scanner.d.ts.map +1 -0
  76. package/dist/services/security-scanner.js +92 -0
  77. package/dist/services/security-scanner.js.map +1 -0
  78. package/dist/types.d.ts +86 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +2 -0
  81. package/dist/types.js.map +1 -0
  82. package/dist/utils/logger.d.ts +13 -0
  83. package/dist/utils/logger.d.ts.map +1 -0
  84. package/dist/utils/logger.js +35 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/mcp-client.d.ts +33 -0
  87. package/dist/utils/mcp-client.d.ts.map +1 -0
  88. package/dist/utils/mcp-client.js +182 -0
  89. package/dist/utils/mcp-client.js.map +1 -0
  90. package/dist/utils/rate-limiter.d.ts +31 -0
  91. package/dist/utils/rate-limiter.d.ts.map +1 -0
  92. package/dist/utils/rate-limiter.js +74 -0
  93. package/dist/utils/rate-limiter.js.map +1 -0
  94. package/dist/utils/scoring.d.ts +9 -0
  95. package/dist/utils/scoring.d.ts.map +1 -0
  96. package/dist/utils/scoring.js +19 -0
  97. package/dist/utils/scoring.js.map +1 -0
  98. package/dist/utils/tls-checker.d.ts +13 -0
  99. package/dist/utils/tls-checker.d.ts.map +1 -0
  100. package/dist/utils/tls-checker.js +62 -0
  101. package/dist/utils/tls-checker.js.map +1 -0
  102. package/dist/utils/token-counter.d.ts +7 -0
  103. package/dist/utils/token-counter.d.ts.map +1 -0
  104. package/dist/utils/token-counter.js +16 -0
  105. package/dist/utils/token-counter.js.map +1 -0
  106. package/package.json +52 -0
@@ -0,0 +1,35 @@
1
+ import chalk from 'chalk';
2
+ export var LogLevel;
3
+ (function (LogLevel) {
4
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
5
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
6
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
7
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
8
+ })(LogLevel || (LogLevel = {}));
9
+ const rawLevel = process.env.LOG_LEVEL?.toUpperCase();
10
+ const LOG_LEVEL = (rawLevel !== undefined && rawLevel in LogLevel)
11
+ ? LogLevel[rawLevel]
12
+ : LogLevel.INFO;
13
+ export class Logger {
14
+ static debug(msg) {
15
+ if (LOG_LEVEL <= LogLevel.DEBUG) {
16
+ console.error(chalk.gray(`[DEBUG] ${msg}`));
17
+ }
18
+ }
19
+ static info(msg) {
20
+ if (LOG_LEVEL <= LogLevel.INFO) {
21
+ console.error(chalk.blue(`[INFO] ${msg}`));
22
+ }
23
+ }
24
+ static warn(msg) {
25
+ if (LOG_LEVEL <= LogLevel.WARN) {
26
+ console.error(chalk.yellow(`[WARN] ${msg}`));
27
+ }
28
+ }
29
+ static error(msg) {
30
+ if (LOG_LEVEL <= LogLevel.ERROR) {
31
+ console.error(chalk.red(`[ERROR] ${msg}`));
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AACtD,MAAM,SAAS,GAAa,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC;IAC1E,CAAC,CAAC,QAAQ,CAAC,QAAiC,CAAC;IAC7C,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAElB,MAAM,OAAO,MAAM;IACjB,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAW;QACrB,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAW;QACrB,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { McpServerConfig } from '../types.js';
2
+ export interface McpProbeResult {
3
+ success: boolean;
4
+ toolCount?: number;
5
+ toolNames?: string[];
6
+ authRequired: boolean;
7
+ latencyMs: number;
8
+ serverVersion?: string;
9
+ error?: string;
10
+ }
11
+ export declare class McpClient {
12
+ private static HANDSHAKE_TIMEOUT_MS;
13
+ private static SSE_TIMEOUT_MS;
14
+ static probe(server: McpServerConfig): Promise<McpProbeResult>;
15
+ /**
16
+ * Full stdio JSON-RPC handshake: initialize → initialized → tools/list.
17
+ */
18
+ private static probeStdio;
19
+ /**
20
+ * Full MCP-over-SSE handshake:
21
+ * 1. GET SSE endpoint → parse sessionId from event stream
22
+ * 2. POST initialize to /message?sessionId=...
23
+ * 3. POST tools/list to /message?sessionId=...
24
+ * Returns actual tool count from server — no hardcoded values.
25
+ */
26
+ private static probeSse;
27
+ /**
28
+ * GET the SSE endpoint, parse the event stream for a sessionId.
29
+ */
30
+ private static getSessionId;
31
+ private static postJson;
32
+ }
33
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAS;IAC5C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;WAEzB,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IASpE;;OAEG;mBACkB,UAAU;IA0D/B;;;;;;OAMG;mBACkB,QAAQ;IAuC7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAmBxB"}
@@ -0,0 +1,182 @@
1
+ import { spawn } from 'child_process';
2
+ import { createInterface } from 'readline';
3
+ import { randomUUID } from 'crypto';
4
+ import http from 'http';
5
+ import https from 'https';
6
+ import { Logger } from './logger.js';
7
+ export class McpClient {
8
+ static HANDSHAKE_TIMEOUT_MS = 15000;
9
+ static SSE_TIMEOUT_MS = 15000;
10
+ static async probe(server) {
11
+ if (server.transport === 'stdio' && server.command) {
12
+ return McpClient.probeStdio(server);
13
+ }
14
+ else if (server.url) {
15
+ return McpClient.probeSse(server);
16
+ }
17
+ return { success: false, authRequired: false, latencyMs: 0, error: 'No command or URL provided' };
18
+ }
19
+ /**
20
+ * Full stdio JSON-RPC handshake: initialize → initialized → tools/list.
21
+ */
22
+ static async probeStdio(server) {
23
+ const start = Date.now();
24
+ const cmd = server.command;
25
+ const args = server.args || [];
26
+ const env = { ...process.env, ...(server.env || {}) };
27
+ return new Promise((resolve) => {
28
+ let child;
29
+ try {
30
+ child = spawn(cmd, args, { env, stdio: ['pipe', 'pipe', 'pipe'] });
31
+ }
32
+ catch (err) {
33
+ return resolve({ success: false, authRequired: false, latencyMs: Date.now() - start, error: `Spawn failed: ${err?.message}` });
34
+ }
35
+ const timeout = setTimeout(() => { try {
36
+ child.kill();
37
+ }
38
+ catch { } resolve({ success: false, authRequired: false, latencyMs: Date.now() - start, error: 'Handshake timeout' }); }, McpClient.HANDSHAKE_TIMEOUT_MS);
39
+ let handled = false;
40
+ const done = (r) => { if (handled)
41
+ return; handled = true; clearTimeout(timeout); try {
42
+ child.kill();
43
+ }
44
+ catch { } resolve(r); };
45
+ const rl = createInterface({ input: child.stdout });
46
+ let authRequired = false, toolCount, toolNames, serverVersion;
47
+ let initId, listId;
48
+ initId = randomUUID();
49
+ child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id: initId, method: 'initialize', params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'mcp-guardian', version: '0.3.0' } } }) + '\n');
50
+ rl.on('line', (line) => {
51
+ try {
52
+ const msg = JSON.parse(line.trim());
53
+ if (msg.id === initId) {
54
+ if (msg.error) {
55
+ authRequired = msg.error.code === -32000 || (typeof msg.error.message === 'string' && /auth/i.test(msg.error.message));
56
+ serverVersion = undefined;
57
+ child.stdin.write(JSON.stringify({ jsonrpc: '2.0', method: 'notifications/initialized' }) + '\n');
58
+ listId = randomUUID();
59
+ child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id: listId, method: 'tools/list' }) + '\n');
60
+ }
61
+ else {
62
+ serverVersion = msg.result?.protocolVersion || msg.result?.serverInfo?.version;
63
+ child.stdin.write(JSON.stringify({ jsonrpc: '2.0', method: 'notifications/initialized' }) + '\n');
64
+ listId = randomUUID();
65
+ child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id: listId, method: 'tools/list' }) + '\n');
66
+ }
67
+ return;
68
+ }
69
+ if (msg.id === listId && msg.result?.tools) {
70
+ const tools = Array.isArray(msg.result.tools) ? msg.result.tools : [];
71
+ toolCount = tools.length;
72
+ toolNames = tools.map((t) => t.name || 'unnamed');
73
+ done({ success: true, toolCount, toolNames, authRequired, latencyMs: Date.now() - start, serverVersion });
74
+ }
75
+ }
76
+ catch { }
77
+ });
78
+ child.stderr?.on('data', (data) => Logger.debug(`[${server.name} stderr] ${data.toString().trim().substring(0, 200)}`));
79
+ child.on('error', (err) => done({ success: false, authRequired, latencyMs: Date.now() - start, error: err.message }));
80
+ child.on('close', (code) => {
81
+ if (!handled)
82
+ done(toolCount !== undefined ? { success: true, toolCount, toolNames, authRequired, latencyMs: Date.now() - start, serverVersion } : { success: false, authRequired, latencyMs: Date.now() - start, error: `Process exited with code ${code}` });
83
+ });
84
+ });
85
+ }
86
+ /**
87
+ * Full MCP-over-SSE handshake:
88
+ * 1. GET SSE endpoint → parse sessionId from event stream
89
+ * 2. POST initialize to /message?sessionId=...
90
+ * 3. POST tools/list to /message?sessionId=...
91
+ * Returns actual tool count from server — no hardcoded values.
92
+ */
93
+ static async probeSse(server) {
94
+ const start = Date.now();
95
+ if (!server.url)
96
+ return { success: false, authRequired: false, latencyMs: 0, error: 'No URL provided' };
97
+ const parsed = new URL(server.url);
98
+ const isHttps = parsed.protocol === 'https:';
99
+ const httpModule = isHttps ? https : http;
100
+ const timeout = McpClient.SSE_TIMEOUT_MS;
101
+ // Step 1: GET SSE endpoint for session ID
102
+ const sessionId = await McpClient.getSessionId(parsed, httpModule, timeout);
103
+ if (!sessionId) {
104
+ return { success: false, authRequired: false, latencyMs: Date.now() - start, error: 'Failed to obtain SSE session ID' };
105
+ }
106
+ // Step 2: POST initialize
107
+ const messageBase = new URL(server.url);
108
+ messageBase.pathname = messageBase.pathname.replace(/\/$/, '') + '/message';
109
+ messageBase.searchParams.set('sessionId', sessionId);
110
+ const initId = randomUUID();
111
+ const initBody = { jsonrpc: '2.0', id: initId, method: 'initialize', params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'mcp-guardian', version: '0.3.0' } } };
112
+ const initResp = await McpClient.postJson(messageBase, initBody, httpModule, timeout);
113
+ if (!initResp || initResp.error) {
114
+ return { success: false, authRequired: initResp?.error?.code === -32001 || /auth/i.test(initResp?.error?.message || ''), latencyMs: Date.now() - start, error: initResp?.error?.message || 'Initialize failed' };
115
+ }
116
+ // Step 3: POST initialized notification
117
+ await McpClient.postJson(messageBase, { jsonrpc: '2.0', method: 'notifications/initialized' }, httpModule, timeout).catch(() => { });
118
+ // Step 4: POST tools/list
119
+ const listId = randomUUID();
120
+ const listResp = await McpClient.postJson(messageBase, { jsonrpc: '2.0', id: listId, method: 'tools/list' }, httpModule, timeout);
121
+ if (listResp?.result?.tools) {
122
+ const tools = Array.isArray(listResp.result.tools) ? listResp.result.tools : [];
123
+ return { success: true, toolCount: tools.length, toolNames: tools.map((t) => t.name || 'unnamed'), authRequired: false, latencyMs: Date.now() - start };
124
+ }
125
+ return { success: false, authRequired: false, latencyMs: Date.now() - start, error: listResp?.error?.message || 'tools/list did not return tools' };
126
+ }
127
+ /**
128
+ * GET the SSE endpoint, parse the event stream for a sessionId.
129
+ */
130
+ static getSessionId(parsedUrl, httpModule, timeoutMs) {
131
+ return new Promise((resolve) => {
132
+ const req = httpModule.get(parsedUrl, { timeout: timeoutMs }, (res) => {
133
+ let data = '';
134
+ res.on('data', (chunk) => data += chunk.toString());
135
+ res.on('end', () => {
136
+ const lines = data.split('\n');
137
+ let currentEvent = null;
138
+ for (const line of lines) {
139
+ if (line.startsWith('event: '))
140
+ currentEvent = line.slice(7).trim();
141
+ else if (line.startsWith('data: ') && currentEvent === 'endpoint') {
142
+ const m = line.slice(6).match(/sessionId=([^&\s]+)/);
143
+ if (m) {
144
+ resolve(m[1]);
145
+ return;
146
+ }
147
+ }
148
+ }
149
+ resolve(null);
150
+ });
151
+ });
152
+ req.on('timeout', () => { req.destroy(); resolve(null); });
153
+ req.on('error', () => resolve(null));
154
+ req.end();
155
+ });
156
+ }
157
+ static postJson(url, body, httpModule, timeoutMs) {
158
+ const bodyString = JSON.stringify(body);
159
+ return new Promise((resolve, reject) => {
160
+ const req = httpModule.request({
161
+ hostname: url.hostname, port: url.port || (url.protocol === 'https:' ? 443 : 80),
162
+ path: url.pathname + url.search, method: 'POST',
163
+ headers: { 'Content-Type': 'application/json', 'Content-Length': String(Buffer.byteLength(bodyString)) },
164
+ timeout: timeoutMs,
165
+ }, (res) => {
166
+ let data = '';
167
+ res.on('data', (chunk) => data += chunk.toString());
168
+ res.on('end', () => { try {
169
+ resolve(JSON.parse(data));
170
+ }
171
+ catch {
172
+ resolve(null);
173
+ } });
174
+ });
175
+ req.on('timeout', () => { req.destroy(); reject(new Error('Timeout')); });
176
+ req.on('error', reject);
177
+ req.write(bodyString);
178
+ req.end();
179
+ });
180
+ }
181
+ }
182
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/utils/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Token-bucket rate limiter for external API calls.
3
+ * Prevents exceeding API rate limits for OSV.dev, NVD, etc.
4
+ */
5
+ export declare class RateLimiter {
6
+ private maxTokens;
7
+ private intervalMs;
8
+ private tokens;
9
+ private lastRefill;
10
+ private queue;
11
+ private processing;
12
+ constructor(maxPerInterval: number, intervalMs: number);
13
+ /**
14
+ * Wait until a token is available, then consume it.
15
+ * Returns immediately if a token is available.
16
+ */
17
+ acquire(): Promise<void>;
18
+ private refill;
19
+ private processQueue;
20
+ /**
21
+ * Get current available tokens (for debugging).
22
+ */
23
+ get availableTokens(): number;
24
+ }
25
+ /**
26
+ * Pre-configured rate limiters for external APIs.
27
+ */
28
+ export declare const osvLimiter: RateLimiter;
29
+ export declare const nvdLimiter: RateLimiter;
30
+ export declare const nvdApiKeyLimiter: RateLimiter;
31
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAoE;IACjF,OAAO,CAAC,UAAU,CAAS;gBAEf,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAOtD;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAG5B;CACF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,aAA4B,CAAC;AACpD,eAAO,MAAM,UAAU,aAA4B,CAAC;AACpD,eAAO,MAAM,gBAAgB,aAA6B,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Token-bucket rate limiter for external API calls.
3
+ * Prevents exceeding API rate limits for OSV.dev, NVD, etc.
4
+ */
5
+ export class RateLimiter {
6
+ maxTokens;
7
+ intervalMs;
8
+ tokens;
9
+ lastRefill;
10
+ queue = [];
11
+ processing = false;
12
+ constructor(maxPerInterval, intervalMs) {
13
+ this.maxTokens = maxPerInterval;
14
+ this.intervalMs = intervalMs;
15
+ this.tokens = maxPerInterval;
16
+ this.lastRefill = Date.now();
17
+ }
18
+ /**
19
+ * Wait until a token is available, then consume it.
20
+ * Returns immediately if a token is available.
21
+ */
22
+ async acquire() {
23
+ this.refill();
24
+ if (this.tokens > 0) {
25
+ this.tokens--;
26
+ return;
27
+ }
28
+ // Queue the request
29
+ return new Promise((resolve, reject) => {
30
+ this.queue.push({ resolve, reject });
31
+ if (!this.processing) {
32
+ this.processQueue();
33
+ }
34
+ });
35
+ }
36
+ refill() {
37
+ const now = Date.now();
38
+ const elapsed = now - this.lastRefill;
39
+ const refillIntervals = Math.floor(elapsed / this.intervalMs);
40
+ if (refillIntervals > 0) {
41
+ this.tokens = Math.min(this.maxTokens, this.tokens + refillIntervals * this.maxTokens);
42
+ this.lastRefill += refillIntervals * this.intervalMs;
43
+ }
44
+ }
45
+ processQueue() {
46
+ this.processing = true;
47
+ const interval = setInterval(() => {
48
+ this.refill();
49
+ while (this.tokens > 0 && this.queue.length > 0) {
50
+ const req = this.queue.shift();
51
+ this.tokens--;
52
+ req.resolve();
53
+ }
54
+ if (this.queue.length === 0) {
55
+ clearInterval(interval);
56
+ this.processing = false;
57
+ }
58
+ }, Math.max(this.intervalMs / this.maxTokens, 50));
59
+ }
60
+ /**
61
+ * Get current available tokens (for debugging).
62
+ */
63
+ get availableTokens() {
64
+ this.refill();
65
+ return this.tokens;
66
+ }
67
+ }
68
+ /**
69
+ * Pre-configured rate limiters for external APIs.
70
+ */
71
+ export const osvLimiter = new RateLimiter(50, 1000); // 50 req/s (OSV.dev allows burst)
72
+ export const nvdLimiter = new RateLimiter(5, 60000); // 5 req/min (NVD without API key)
73
+ export const nvdApiKeyLimiter = new RateLimiter(20, 60000); // 20 req/min (NVD with API key)
74
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared scoring utility used by both index.ts (MCP server) and cli.ts (CLI).
3
+ */
4
+ export declare function calculateOverallScore(security: {
5
+ score: number;
6
+ }[], health: {
7
+ successRate: number;
8
+ }[]): number;
9
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/utils/scoring.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC7B,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,GAChC,MAAM,CAWR"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared scoring utility used by both index.ts (MCP server) and cli.ts (CLI).
3
+ */
4
+ export function calculateOverallScore(security, health) {
5
+ if (security.length === 0 && health.length === 0)
6
+ return 0;
7
+ const secAvg = security.length > 0
8
+ ? security.reduce((sum, s) => sum + s.score, 0) / security.length
9
+ : 0;
10
+ const healthAvg = health.length > 0
11
+ ? health.reduce((sum, h) => sum + h.successRate * 100, 0) / health.length
12
+ : 0;
13
+ if (security.length === 0)
14
+ return Math.round(healthAvg);
15
+ if (health.length === 0)
16
+ return Math.round(secAvg);
17
+ return Math.round((secAvg + healthAvg) / 2);
18
+ }
19
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/utils/scoring.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA6B,EAC7B,MAAiC;IAEjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM;QACjE,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM;QACzE,CAAC,CAAC,CAAC,CAAC;IACN,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface TlsCheckResult {
2
+ valid: boolean;
3
+ daysUntilExpiry: number;
4
+ issuer?: string;
5
+ subject?: string;
6
+ protocol?: string;
7
+ }
8
+ /**
9
+ * Check TLS certificate validity for a given HTTPS URL.
10
+ * Returns validity status, days until expiry, and certificate details.
11
+ */
12
+ export declare function checkTlsCert(url: string): Promise<TlsCheckResult>;
13
+ //# sourceMappingURL=tls-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls-checker.d.ts","sourceRoot":"","sources":["../../src/utils/tls-checker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiEvE"}
@@ -0,0 +1,62 @@
1
+ import https from 'https';
2
+ import { URL } from 'url';
3
+ import { Logger } from './logger.js';
4
+ /**
5
+ * Check TLS certificate validity for a given HTTPS URL.
6
+ * Returns validity status, days until expiry, and certificate details.
7
+ */
8
+ export async function checkTlsCert(url) {
9
+ let parsed;
10
+ try {
11
+ parsed = new URL(url);
12
+ }
13
+ catch {
14
+ return { valid: false, daysUntilExpiry: 0 };
15
+ }
16
+ if (parsed.protocol !== 'https:') {
17
+ return { valid: true, daysUntilExpiry: Infinity, protocol: parsed.protocol };
18
+ }
19
+ return new Promise((resolve) => {
20
+ const req = https.request({
21
+ hostname: parsed.hostname,
22
+ port: 443,
23
+ method: 'HEAD',
24
+ timeout: 5000,
25
+ rejectUnauthorized: false, // We want to inspect the cert, not fail
26
+ }, (res) => {
27
+ const socket = res.socket;
28
+ const cert = socket?.getPeerCertificate?.();
29
+ if (!cert || Object.keys(cert).length === 0) {
30
+ resolve({ valid: false, daysUntilExpiry: 0 });
31
+ return;
32
+ }
33
+ const validFrom = cert.valid_from ? new Date(cert.valid_from) : null;
34
+ const validTo = cert.valid_to ? new Date(cert.valid_to) : null;
35
+ const now = Date.now();
36
+ // Check if certificate is currently valid
37
+ const isValid = validFrom && validTo
38
+ ? now >= validFrom.getTime() && now <= validTo.getTime()
39
+ : true;
40
+ const days = validTo
41
+ ? Math.floor((validTo.getTime() - now) / (1000 * 60 * 60 * 24))
42
+ : 0;
43
+ resolve({
44
+ valid: isValid,
45
+ daysUntilExpiry: days,
46
+ issuer: cert.issuer?.O || cert.issuer?.CN,
47
+ subject: cert.subject?.CN,
48
+ protocol: 'TLS',
49
+ });
50
+ });
51
+ req.on('error', (err) => {
52
+ Logger.debug(`TLS check failed for ${parsed.hostname}: ${err.message}`);
53
+ resolve({ valid: false, daysUntilExpiry: 0 });
54
+ });
55
+ req.on('timeout', () => {
56
+ req.destroy();
57
+ resolve({ valid: false, daysUntilExpiry: 0 });
58
+ });
59
+ req.end();
60
+ });
61
+ }
62
+ //# sourceMappingURL=tls-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls-checker.js","sourceRoot":"","sources":["../../src/utils/tls-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class TokenCounter {
2
+ private encoding;
3
+ constructor(model?: string);
4
+ count(text: string): number;
5
+ free(): void;
6
+ }
7
+ //# sourceMappingURL=token-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,KAAK,GAAE,MAAiB;IAMpC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3B,IAAI,IAAI,IAAI;CAGb"}
@@ -0,0 +1,16 @@
1
+ import { get_encoding } from 'tiktoken';
2
+ export class TokenCounter {
3
+ encoding;
4
+ constructor(model = 'gpt-4o') {
5
+ // o200k_base is the encoding used by gpt-4o and gpt-4o-mini
6
+ const encodingName = 'o200k_base';
7
+ this.encoding = get_encoding(encodingName);
8
+ }
9
+ count(text) {
10
+ return this.encoding.encode(text).length;
11
+ }
12
+ free() {
13
+ this.encoding.free();
14
+ }
15
+ }
16
+ //# sourceMappingURL=token-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,UAAU,CAAC;AAE1D,MAAM,OAAO,YAAY;IACf,QAAQ,CAAkC;IAElD,YAAY,QAAgB,QAAQ;QAClC,4DAA4D;QAC5D,MAAM,YAAY,GAAqB,YAAY,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@mcp-guardian/server",
3
+ "version": "0.3.0",
4
+ "description": "Security, cost, and health audit for MCP infrastructure",
5
+ "type": "module",
6
+ "files": ["dist"],
7
+ "main": "./dist/index.js",
8
+ "bin": {
9
+ "mcp-guardian": "./dist/cli.js"
10
+ },
11
+ "engines": {
12
+ "node": ">=18"
13
+ },
14
+ "repository": "github:rudraneel93/mcp-guardian",
15
+ "bugs": "https://github.com/rudraneel93/mcp-guardian/issues",
16
+ "homepage": "https://github.com/rudraneel93/mcp-guardian#readme",
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "security",
21
+ "audit",
22
+ "cost",
23
+ "health",
24
+ "observability",
25
+ "agent-ai",
26
+ "cli"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "start": "node dist/index.js",
31
+ "dev": "tsx watch src/index.ts",
32
+ "test": "vitest run",
33
+ "test:watch": "vitest",
34
+ "lint": "tsc --noEmit",
35
+ "prepublishOnly": "npm run build && npm test"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.0.0",
39
+ "tiktoken": "^1.0.15",
40
+ "sql.js": "^1.11.0",
41
+ "axios": "^1.7.0",
42
+ "commander": "^12.0.0",
43
+ "chalk": "^5.3.0",
44
+ "zod": "^3.23.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^20.0.0",
48
+ "typescript": "^5.4.0",
49
+ "tsx": "^4.7.0",
50
+ "vitest": "^1.6.0"
51
+ }
52
+ }