mcp-trust 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.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/bin/mcp-trust.js +2 -0
- package/dist/checks/github.d.ts +4 -0
- package/dist/checks/github.js +175 -0
- package/dist/checks/github.js.map +1 -0
- package/dist/checks/index.d.ts +2 -0
- package/dist/checks/index.js +3 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/scorer.d.ts +2 -0
- package/dist/checks/scorer.js +109 -0
- package/dist/checks/scorer.js.map +1 -0
- package/dist/commands/audit.d.ts +9 -0
- package/dist/commands/audit.js +53 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/prober/index.d.ts +1 -0
- package/dist/prober/index.js +2 -0
- package/dist/prober/index.js.map +1 -0
- package/dist/prober/spawner.d.ts +2 -0
- package/dist/prober/spawner.js +230 -0
- package/dist/prober/spawner.js.map +1 -0
- package/dist/readers/claude.d.ts +2 -0
- package/dist/readers/claude.js +48 -0
- package/dist/readers/claude.js.map +1 -0
- package/dist/readers/cline.d.ts +2 -0
- package/dist/readers/cline.js +58 -0
- package/dist/readers/cline.js.map +1 -0
- package/dist/readers/codex.d.ts +2 -0
- package/dist/readers/codex.js +104 -0
- package/dist/readers/codex.js.map +1 -0
- package/dist/readers/cursor.d.ts +2 -0
- package/dist/readers/cursor.js +53 -0
- package/dist/readers/cursor.js.map +1 -0
- package/dist/readers/index.d.ts +2 -0
- package/dist/readers/index.js +18 -0
- package/dist/readers/index.js.map +1 -0
- package/dist/reporters/index.d.ts +2 -0
- package/dist/reporters/index.js +3 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +2 -0
- package/dist/reporters/json.js +23 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/terminal.d.ts +3 -0
- package/dist/reporters/terminal.js +120 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/readers/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO5C,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC;YACnF,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;SAClC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,CAAC;YAClE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;SAClC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI;gBACJ,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;gBACpB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readClaudeDesktop } from "./claude.js";
|
|
2
|
+
import { readCursor } from "./cursor.js";
|
|
3
|
+
import { readCodex } from "./codex.js";
|
|
4
|
+
import { readCline } from "./cline.js";
|
|
5
|
+
export function readAllConfigs() {
|
|
6
|
+
const all = [...readClaudeDesktop(), ...readCursor(), ...readCodex(), ...readCline()];
|
|
7
|
+
const seen = new Set();
|
|
8
|
+
const unique = [];
|
|
9
|
+
for (const s of all) {
|
|
10
|
+
const key = `${s.source}:${s.name}:${s.command}:${s.args.join(" ")}`;
|
|
11
|
+
if (seen.has(key))
|
|
12
|
+
continue;
|
|
13
|
+
seen.add(key);
|
|
14
|
+
unique.push(s);
|
|
15
|
+
}
|
|
16
|
+
return unique;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/readers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAmB,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function toJson(reports) {
|
|
2
|
+
return JSON.stringify(reports.map((r) => ({
|
|
3
|
+
name: r.server.config.name,
|
|
4
|
+
source: r.server.config.source,
|
|
5
|
+
status: r.server.status,
|
|
6
|
+
score: r.score,
|
|
7
|
+
verdict: r.verdict,
|
|
8
|
+
durationMs: r.server.durationMs,
|
|
9
|
+
toolCount: r.server.toolCount,
|
|
10
|
+
emptyArgTools: r.server.emptyArgTools,
|
|
11
|
+
protocolVersion: r.server.protocolVersion,
|
|
12
|
+
repo: r.health?.repo ?? null,
|
|
13
|
+
lastCommitDaysAgo: r.health?.lastCommitDaysAgo ?? null,
|
|
14
|
+
stars: r.health?.stars ?? null,
|
|
15
|
+
weeklyDownloads: r.health?.weeklyDownloads ?? null,
|
|
16
|
+
cveCount: r.health?.cveCount ?? null,
|
|
17
|
+
archived: r.health?.archived ?? null,
|
|
18
|
+
issues: r.issues,
|
|
19
|
+
recommendations: r.recommendations,
|
|
20
|
+
error: r.server.errorMessage ?? null,
|
|
21
|
+
})), null, 2);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,OAAO,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;QAC7B,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa;QACrC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,eAAe;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI;QAC5B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,iBAAiB,IAAI,IAAI;QACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI;QAC9B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,IAAI,IAAI;QAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI;QACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI;KACrC,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
const STATUS_ICONS = {
|
|
3
|
+
alive: pc.green("[ALIVE]"),
|
|
4
|
+
dead: pc.red("[DEAD] "),
|
|
5
|
+
hangs: pc.red("[HANG] "),
|
|
6
|
+
auth_required: pc.yellow("[AUTH] "),
|
|
7
|
+
install_error: pc.red("[NOEX] "),
|
|
8
|
+
needs_args: pc.yellow("[ARGS]"),
|
|
9
|
+
needs_env: pc.yellow("[ENV] "),
|
|
10
|
+
broken: pc.red("[BRKN] "),
|
|
11
|
+
not_probed: pc.gray("[----]"),
|
|
12
|
+
};
|
|
13
|
+
const VERDICT_COLORS = {
|
|
14
|
+
A: pc.green,
|
|
15
|
+
B: pc.cyan,
|
|
16
|
+
C: pc.yellow,
|
|
17
|
+
D: pc.yellow,
|
|
18
|
+
F: pc.red,
|
|
19
|
+
};
|
|
20
|
+
function pad(s, n) {
|
|
21
|
+
return s.length >= n ? s : s + " ".repeat(n - s.length);
|
|
22
|
+
}
|
|
23
|
+
function shortStatus(status) {
|
|
24
|
+
return STATUS_ICONS[status] ?? pc.gray("[" + status + "]");
|
|
25
|
+
}
|
|
26
|
+
export function renderReport(reports) {
|
|
27
|
+
console.log();
|
|
28
|
+
console.log(pc.bold(pc.magenta("mcp-trust")) + pc.gray(" v0.1.0"));
|
|
29
|
+
console.log(pc.gray("Auditing MCP servers installed on this machine"));
|
|
30
|
+
console.log();
|
|
31
|
+
if (reports.length === 0) {
|
|
32
|
+
console.log(pc.yellow("No MCP servers found in any known config location."));
|
|
33
|
+
console.log(pc.gray("Searched: Claude Desktop, Cursor, Codex, Cline"));
|
|
34
|
+
console.log();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const r of reports) {
|
|
38
|
+
const cfg = r.server.config;
|
|
39
|
+
const status = shortStatus(r.server.status);
|
|
40
|
+
const verdict = r.verdict;
|
|
41
|
+
const verdictColor = VERDICT_COLORS[verdict];
|
|
42
|
+
const name = pc.bold(pad(cfg.name, 24));
|
|
43
|
+
const source = pc.gray("[" + cfg.source + "]");
|
|
44
|
+
console.log(`${status} ${verdictColor(verdict)} ${name} ${source}`);
|
|
45
|
+
if (r.server.status === "alive") {
|
|
46
|
+
const toolInfo = pc.gray(`${r.server.toolCount} tool${r.server.toolCount === 1 ? "" : "s"}` +
|
|
47
|
+
(r.server.emptyArgTools > 0 ? `, ${r.server.emptyArgTools} no-arg` : "") +
|
|
48
|
+
`, ${r.server.durationMs}ms`);
|
|
49
|
+
console.log(` ${toolInfo}`);
|
|
50
|
+
}
|
|
51
|
+
else if (r.server.errorMessage) {
|
|
52
|
+
const errMsg = r.server.errorMessage.split("\n")[0]?.trim() ?? "";
|
|
53
|
+
console.log(` ${pc.gray(truncate(errMsg, 80))}`);
|
|
54
|
+
}
|
|
55
|
+
if (r.health) {
|
|
56
|
+
const h = r.health;
|
|
57
|
+
const age = h.lastCommitDaysAgo !== null ? `${h.lastCommitDaysAgo}d ago` : "unknown";
|
|
58
|
+
const dl = h.weeklyDownloads > 0 ? formatNumber(h.weeklyDownloads) + " dl/wk" : "no dl data";
|
|
59
|
+
console.log(` ${pc.gray(`[${h.repo}]`)} ${pc.gray(`${age}, ${h.stars}★, ${dl}`)}`);
|
|
60
|
+
if (h.archived) {
|
|
61
|
+
console.log(` ${pc.red("⚠ Archived")}`);
|
|
62
|
+
}
|
|
63
|
+
if (h.cveCount > 0) {
|
|
64
|
+
console.log(` ${pc.red(`⚠ ${h.cveCount} CVE${h.cveCount === 1 ? "" : "s"}`)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const issue of r.issues) {
|
|
68
|
+
console.log(` ${pc.red("•")} ${issue}`);
|
|
69
|
+
}
|
|
70
|
+
for (const rec of r.recommendations) {
|
|
71
|
+
console.log(` ${pc.cyan("→")} ${rec}`);
|
|
72
|
+
}
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
const summary = summarize(reports);
|
|
76
|
+
renderSummary(summary);
|
|
77
|
+
}
|
|
78
|
+
function renderSummary(s) {
|
|
79
|
+
const parts = [
|
|
80
|
+
pc.bold("Total: ") + String(s.total),
|
|
81
|
+
pc.green("Alive: ") + String(s.alive),
|
|
82
|
+
pc.red("Dead: ") + String(s.dead),
|
|
83
|
+
pc.yellow("Other: ") + String(s.other),
|
|
84
|
+
pc.bold("Avg score: ") + s.averageScore + "/100",
|
|
85
|
+
];
|
|
86
|
+
console.log(pc.gray("─".repeat(60)));
|
|
87
|
+
console.log(parts.join(" "));
|
|
88
|
+
if (s.worstOffenders.length > 0) {
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(pc.red(pc.bold("Worst offenders:")));
|
|
91
|
+
for (const name of s.worstOffenders) {
|
|
92
|
+
console.log(` ${pc.red("•")} ${name}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log();
|
|
96
|
+
}
|
|
97
|
+
export function summarize(reports) {
|
|
98
|
+
const total = reports.length;
|
|
99
|
+
const alive = reports.filter((r) => r.server.status === "alive").length;
|
|
100
|
+
const dead = reports.filter((r) => r.server.status === "dead").length;
|
|
101
|
+
const other = total - alive - dead;
|
|
102
|
+
const avg = total === 0 ? 0 : Math.round(reports.reduce((s, r) => s + r.score, 0) / total);
|
|
103
|
+
const worst = reports
|
|
104
|
+
.filter((r) => r.verdict === "F" || r.verdict === "D")
|
|
105
|
+
.sort((a, b) => a.score - b.score)
|
|
106
|
+
.slice(0, 5)
|
|
107
|
+
.map((r) => r.server.config.name);
|
|
108
|
+
return { total, alive, dead, other, averageScore: avg, worstOffenders: worst };
|
|
109
|
+
}
|
|
110
|
+
function truncate(s, n) {
|
|
111
|
+
return s.length > n ? s.slice(0, n - 1) + "…" : s;
|
|
112
|
+
}
|
|
113
|
+
function formatNumber(n) {
|
|
114
|
+
if (n >= 1_000_000)
|
|
115
|
+
return (n / 1_000_000).toFixed(1) + "M";
|
|
116
|
+
if (n >= 1_000)
|
|
117
|
+
return (n / 1_000).toFixed(1) + "K";
|
|
118
|
+
return String(n);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type ServerStatus = "alive" | "dead" | "hangs" | "auth_required" | "install_error" | "needs_args" | "needs_env" | "broken" | "not_probed";
|
|
2
|
+
export type Verdict = "A" | "B" | "C" | "D" | "F";
|
|
3
|
+
export interface ServerConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
command: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
source: "claude" | "cursor" | "codex" | "cline" | "vscode" | "windsurf" | "manual";
|
|
9
|
+
configPath: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ProbedServer {
|
|
12
|
+
config: ServerConfig;
|
|
13
|
+
status: ServerStatus;
|
|
14
|
+
probedAt: number;
|
|
15
|
+
durationMs: number;
|
|
16
|
+
protocolVersion?: string;
|
|
17
|
+
toolCount: number;
|
|
18
|
+
emptyArgTools: number;
|
|
19
|
+
toolNames: string[];
|
|
20
|
+
errorMessage?: string;
|
|
21
|
+
stderr?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface RepoHealth {
|
|
24
|
+
repo: string;
|
|
25
|
+
lastCommit: string | null;
|
|
26
|
+
lastCommitDaysAgo: number | null;
|
|
27
|
+
stars: number;
|
|
28
|
+
openIssues: number;
|
|
29
|
+
cveCount: number;
|
|
30
|
+
weeklyDownloads: number;
|
|
31
|
+
contributors: number;
|
|
32
|
+
archived: boolean;
|
|
33
|
+
sourceUrl: string | null;
|
|
34
|
+
}
|
|
35
|
+
export interface ServerReport {
|
|
36
|
+
server: ProbedServer;
|
|
37
|
+
health: RepoHealth | null;
|
|
38
|
+
verdict: Verdict;
|
|
39
|
+
score: number;
|
|
40
|
+
issues: string[];
|
|
41
|
+
recommendations: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface AuditSummary {
|
|
44
|
+
total: number;
|
|
45
|
+
alive: number;
|
|
46
|
+
dead: number;
|
|
47
|
+
other: number;
|
|
48
|
+
averageScore: number;
|
|
49
|
+
worstOffenders: string[];
|
|
50
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-trust",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Audit the MCP servers installed on your machine. Detect dead, dangerous, or fake servers before they hit production.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": "bin/mcp-trust.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"bin",
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"prepare": "tsc",
|
|
16
|
+
"test": "node --test --import tsx test/*.test.ts",
|
|
17
|
+
"lint": "tsc --noEmit",
|
|
18
|
+
"start": "node --import tsx src/index.ts"
|
|
19
|
+
},
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=20"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mcp",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"audit",
|
|
27
|
+
"security",
|
|
28
|
+
"cli",
|
|
29
|
+
"agent",
|
|
30
|
+
"claude",
|
|
31
|
+
"codex",
|
|
32
|
+
"cursor"
|
|
33
|
+
],
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"picocolors": "^1.0.1"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^20.11.0",
|
|
40
|
+
"tsx": "^4.19.0",
|
|
41
|
+
"typescript": "^5.4.0"
|
|
42
|
+
}
|
|
43
|
+
}
|