@mcp-guardian/server 1.0.0 → 1.0.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.
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/dist/utils/policy-auditor.d.ts +24 -0
- package/dist/utils/policy-auditor.d.ts.map +1 -0
- package/dist/utils/policy-auditor.js +58 -0
- package/dist/utils/policy-auditor.js.map +1 -0
- package/dist/utils/tracing.d.ts +2 -2
- package/dist/utils/tracing.d.ts.map +1 -1
- package/dist/utils/tracing.js +8 -6
- package/dist/utils/tracing.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -45,7 +45,7 @@ const program = new Command();
|
|
|
45
45
|
program
|
|
46
46
|
.name('mcp-guardian')
|
|
47
47
|
.description('Security, cost, and health audit for MCP infrastructure')
|
|
48
|
-
.version('1.0.
|
|
48
|
+
.version('1.0.1');
|
|
49
49
|
program
|
|
50
50
|
.command('scan')
|
|
51
51
|
.description('Run security scan on MCP servers')
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { Logger } from './utils/logger.js';
|
|
|
9
9
|
import { createContainer } from './container.js';
|
|
10
10
|
const container = createContainer();
|
|
11
11
|
const reporter = new ReportGenerator();
|
|
12
|
-
const server = new Server({ name: 'mcp-guardian', version: '1.0.
|
|
12
|
+
const server = new Server({ name: 'mcp-guardian', version: '1.0.1' }, { capabilities: { tools: {} } });
|
|
13
13
|
// ── Logging capability (MCP spec requirement) ─────────────────────
|
|
14
14
|
let currentLogLevel = 'info';
|
|
15
15
|
server.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Audit Trail — records every policy change for compliance.
|
|
3
|
+
* Logs: who changed what, when, old/new values, and rollback info.
|
|
4
|
+
* Enable with: POLICY_AUDIT_ENABLED=true
|
|
5
|
+
*/
|
|
6
|
+
export interface PolicyChangeRecord {
|
|
7
|
+
timestamp: string;
|
|
8
|
+
actor: string;
|
|
9
|
+
change: string;
|
|
10
|
+
oldValue?: string;
|
|
11
|
+
newValue?: string;
|
|
12
|
+
sourceHash?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class PolicyAuditor {
|
|
15
|
+
private auditPath;
|
|
16
|
+
private enabled;
|
|
17
|
+
private lastHash;
|
|
18
|
+
constructor(auditPath?: string);
|
|
19
|
+
record(change: PolicyChangeRecord): void;
|
|
20
|
+
readAuditTrail(): PolicyChangeRecord[];
|
|
21
|
+
computeHash(content: string): string;
|
|
22
|
+
hasChanged(content: string): boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=policy-auditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-auditor.d.ts","sourceRoot":"","sources":["../../src/utils/policy-auditor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,SAAS,CAAC,EAAE,MAAM;IAK9B,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAWxC,cAAc,IAAI,kBAAkB,EAAE;IAUtC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAUpC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CASrC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Audit Trail — records every policy change for compliance.
|
|
3
|
+
* Logs: who changed what, when, old/new values, and rollback info.
|
|
4
|
+
* Enable with: POLICY_AUDIT_ENABLED=true
|
|
5
|
+
*/
|
|
6
|
+
import { writeFileSync, readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { Logger } from './logger.js';
|
|
8
|
+
export class PolicyAuditor {
|
|
9
|
+
auditPath;
|
|
10
|
+
enabled;
|
|
11
|
+
lastHash = null;
|
|
12
|
+
constructor(auditPath) {
|
|
13
|
+
this.enabled = process.env['POLICY_AUDIT_ENABLED'] === 'true';
|
|
14
|
+
this.auditPath = auditPath || process.env['POLICY_AUDIT_LOG'] || './policy-audit.jsonl';
|
|
15
|
+
}
|
|
16
|
+
record(change) {
|
|
17
|
+
if (!this.enabled)
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
const line = JSON.stringify({ ...change, source: 'mcp-guardian-policy-auditor' }) + '\n';
|
|
21
|
+
writeFileSync(this.auditPath, line, { flag: 'a' });
|
|
22
|
+
Logger.debug(`[policy-auditor] Change recorded: ${change.change}`);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
Logger.error(`[policy-auditor] Failed to write audit log: ${err?.message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
readAuditTrail() {
|
|
29
|
+
if (!existsSync(this.auditPath))
|
|
30
|
+
return [];
|
|
31
|
+
try {
|
|
32
|
+
const content = readFileSync(this.auditPath, 'utf-8');
|
|
33
|
+
return content.trim().split('\n').filter(Boolean).map(l => JSON.parse(l));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
computeHash(content) {
|
|
40
|
+
let hash = 0;
|
|
41
|
+
for (let i = 0; i < content.length; i++) {
|
|
42
|
+
const char = content.charCodeAt(i);
|
|
43
|
+
hash = ((hash << 5) - hash) + char;
|
|
44
|
+
hash |= 0;
|
|
45
|
+
}
|
|
46
|
+
return hash.toString(16);
|
|
47
|
+
}
|
|
48
|
+
hasChanged(content) {
|
|
49
|
+
const currentHash = this.computeHash(content);
|
|
50
|
+
if (this.lastHash && this.lastHash !== currentHash) {
|
|
51
|
+
this.lastHash = currentHash;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
this.lastHash = currentHash;
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=policy-auditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-auditor.js","sourceRoot":"","sources":["../../src/utils/policy-auditor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAWrC,MAAM,OAAO,aAAa;IAChB,SAAS,CAAS;IAClB,OAAO,CAAU;IACjB,QAAQ,GAAkB,IAAI,CAAC;IAEvC,YAAY,SAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,MAAM,CAAC;QAC9D,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,sBAAsB,CAAC;IAC1F,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC,GAAG,IAAI,CAAC;YACzF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,qCAAqC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,+CAA+C,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACnC,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
package/dist/utils/tracing.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenTelemetry tracing for distributed request tracking across proxy + MCP servers.
|
|
3
|
-
* Enable with: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:
|
|
4
|
-
*
|
|
3
|
+
* Enable with: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
|
|
4
|
+
* Uses OTLP HTTP exporter (gRPC exporter deprecated due to critical CVE in protobufjs).
|
|
5
5
|
*/
|
|
6
6
|
export declare function initTracing(): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BjD"}
|
package/dist/utils/tracing.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Logger } from './logger.js';
|
|
2
2
|
/**
|
|
3
3
|
* OpenTelemetry tracing for distributed request tracking across proxy + MCP servers.
|
|
4
|
-
* Enable with: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:
|
|
5
|
-
*
|
|
4
|
+
* Enable with: OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
|
|
5
|
+
* Uses OTLP HTTP exporter (gRPC exporter deprecated due to critical CVE in protobufjs).
|
|
6
6
|
*/
|
|
7
7
|
export async function initTracing() {
|
|
8
8
|
if (!process.env['OTEL_EXPORTER_OTLP_ENDPOINT']) {
|
|
@@ -12,18 +12,20 @@ export async function initTracing() {
|
|
|
12
12
|
try {
|
|
13
13
|
const { NodeSDK } = await import('@opentelemetry/sdk-node');
|
|
14
14
|
const { getNodeAutoInstrumentations } = await import('@opentelemetry/auto-instrumentations-node');
|
|
15
|
-
|
|
16
|
-
const
|
|
15
|
+
// Use OTLP HTTP exporter instead of deprecated gRPC
|
|
16
|
+
const { OTLPTraceExporter } = await import('@opentelemetry/exporter-trace-otlp-http');
|
|
17
|
+
const exporter = new OTLPTraceExporter({
|
|
18
|
+
url: `${process.env['OTEL_EXPORTER_OTLP_ENDPOINT']}/v1/traces`,
|
|
19
|
+
});
|
|
17
20
|
const instruments = getNodeAutoInstrumentations({
|
|
18
21
|
'@opentelemetry/instrumentation-http': { enabled: true },
|
|
19
|
-
'@opentelemetry/instrumentation-pino': { enabled: false },
|
|
20
22
|
});
|
|
21
23
|
const sdk = new NodeSDK({
|
|
22
24
|
traceExporter: exporter,
|
|
23
25
|
instrumentations: [instruments],
|
|
24
26
|
});
|
|
25
27
|
await sdk.start();
|
|
26
|
-
Logger.info('[tracing] OpenTelemetry tracing initialized — exporting to OTLP endpoint');
|
|
28
|
+
Logger.info('[tracing] OpenTelemetry tracing initialized — exporting to OTLP HTTP endpoint');
|
|
27
29
|
}
|
|
28
30
|
catch (err) {
|
|
29
31
|
Logger.warn(`[tracing] OpenTelemetry initialization failed: ${err?.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC5D,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QAClG,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/utils/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC5D,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QAClG,oDAAoD;QACpD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;YACrC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,YAAY;SAC/D,CAAQ,CAAC;QAEV,MAAM,WAAW,GAAG,2BAA2B,CAAC;YAC9C,qCAAqC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SACzD,CAAQ,CAAC;QAEV,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;YACtB,aAAa,EAAE,QAAQ;YACvB,gBAAgB,EAAE,CAAC,WAAW,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,kDAAkD,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-guardian/server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Security, cost, and health audit for MCP infrastructure",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
41
41
|
"@opentelemetry/api": "^1.9.1",
|
|
42
42
|
"@opentelemetry/auto-instrumentations-node": "^0.75.0",
|
|
43
|
-
"@opentelemetry/exporter-otlp-
|
|
43
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.217.0",
|
|
44
44
|
"@opentelemetry/sdk-node": "^0.217.0",
|
|
45
45
|
"axios": "^1.7.0",
|
|
46
46
|
"chalk": "^5.3.0",
|