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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/bin/mcp-trust.js +2 -0
  4. package/dist/checks/github.d.ts +4 -0
  5. package/dist/checks/github.js +175 -0
  6. package/dist/checks/github.js.map +1 -0
  7. package/dist/checks/index.d.ts +2 -0
  8. package/dist/checks/index.js +3 -0
  9. package/dist/checks/index.js.map +1 -0
  10. package/dist/checks/scorer.d.ts +2 -0
  11. package/dist/checks/scorer.js +109 -0
  12. package/dist/checks/scorer.js.map +1 -0
  13. package/dist/commands/audit.d.ts +9 -0
  14. package/dist/commands/audit.js +53 -0
  15. package/dist/commands/audit.js.map +1 -0
  16. package/dist/commands/index.d.ts +2 -0
  17. package/dist/commands/index.js +2 -0
  18. package/dist/commands/index.js.map +1 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +96 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/prober/index.d.ts +1 -0
  23. package/dist/prober/index.js +2 -0
  24. package/dist/prober/index.js.map +1 -0
  25. package/dist/prober/spawner.d.ts +2 -0
  26. package/dist/prober/spawner.js +230 -0
  27. package/dist/prober/spawner.js.map +1 -0
  28. package/dist/readers/claude.d.ts +2 -0
  29. package/dist/readers/claude.js +48 -0
  30. package/dist/readers/claude.js.map +1 -0
  31. package/dist/readers/cline.d.ts +2 -0
  32. package/dist/readers/cline.js +58 -0
  33. package/dist/readers/cline.js.map +1 -0
  34. package/dist/readers/codex.d.ts +2 -0
  35. package/dist/readers/codex.js +104 -0
  36. package/dist/readers/codex.js.map +1 -0
  37. package/dist/readers/cursor.d.ts +2 -0
  38. package/dist/readers/cursor.js +53 -0
  39. package/dist/readers/cursor.js.map +1 -0
  40. package/dist/readers/index.d.ts +2 -0
  41. package/dist/readers/index.js +18 -0
  42. package/dist/readers/index.js.map +1 -0
  43. package/dist/reporters/index.d.ts +2 -0
  44. package/dist/reporters/index.js +3 -0
  45. package/dist/reporters/index.js.map +1 -0
  46. package/dist/reporters/json.d.ts +2 -0
  47. package/dist/reporters/json.js +23 -0
  48. package/dist/reporters/json.js.map +1 -0
  49. package/dist/reporters/terminal.d.ts +3 -0
  50. package/dist/reporters/terminal.js +120 -0
  51. package/dist/reporters/terminal.js.map +1 -0
  52. package/dist/types.d.ts +50 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. 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,2 @@
1
+ import type { ServerConfig } from "../types.js";
2
+ export declare function readAllConfigs(): ServerConfig[];
@@ -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,2 @@
1
+ export { renderReport, summarize } from "./terminal.js";
2
+ export { toJson } from "./json.js";
@@ -0,0 +1,3 @@
1
+ export { renderReport, summarize } from "./terminal.js";
2
+ export { toJson } from "./json.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ import type { ServerReport } from "../types.js";
2
+ export declare function toJson(reports: ServerReport[]): string;
@@ -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,3 @@
1
+ import type { AuditSummary, ServerReport } from "../types.js";
2
+ export declare function renderReport(reports: ServerReport[]): void;
3
+ export declare function summarize(reports: ServerReport[]): AuditSummary;
@@ -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":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,MAAM,YAAY,GAA2B;IAC3C,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACxB,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;IACnC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IAChC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC/B,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACzB,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;CAC9B,CAAC;AAEF,MAAM,cAAc,GAA2C;IAC7D,CAAC,EAAE,EAAE,CAAC,KAAK;IACX,CAAC,EAAE,EAAE,CAAC,IAAI;IACV,CAAC,EAAE,EAAE,CAAC,MAAM;IACZ,CAAC,EAAE,EAAE,CAAC,MAAM;IACZ,CAAC,EAAE,EAAE,CAAC,GAAG;CACV,CAAC;AAEF,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS;IAC/B,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC1B,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAEpE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CACtB,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;gBAChE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,CAC/B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,MAAM,GAAG,GAAG,CAAC,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACrF,MAAM,EAAE,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,aAAa,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,CAAe;IACpC,MAAM,KAAK,GAAG;QACZ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACpC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,MAAM;KACjD,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAuB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,OAAO;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;SACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACpD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }