mcp-scorecard 0.3.0 → 0.4.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/CHANGELOG.md +10 -0
- package/README.md +5 -0
- package/dist/checks-catalog.d.ts +16 -0
- package/dist/checks-catalog.js +33 -0
- package/dist/checks-catalog.js.map +1 -0
- package/dist/cli/commands.js +66 -25
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/output.d.ts +6 -0
- package/dist/cli/output.js +42 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/profiles.d.ts +3 -0
- package/dist/profiles.js +25 -0
- package/dist/profiles.js.map +1 -0
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
- **Compare** (`mcp-scorecard compare a b c`): audit several targets, print a ranked side-by-side table.
|
|
6
|
+
- **Baseline/regression** (`--baseline old.json`): diff a run against a previous `--json` report (CI guardrail).
|
|
7
|
+
- **Scoring profiles** (`--profile security|quality|agent-ready`): score only one category, rescaled.
|
|
8
|
+
- **HTML report** (`--html`): a self-contained, shareable scorecard.
|
|
9
|
+
- **Checks explainer page** (`/checks.html` on the site, generated from the single-source catalog): every check, its category, and why it matters.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
3
13
|
## 0.3.0
|
|
4
14
|
|
|
5
15
|
- **Run AS an MCP server** (`mcp-scorecard serve`): exposes an `audit` tool so agents can score any MCP server mid-task — an MCP that scores MCPs. Add to a client: `{"command":"npx","args":["-y","mcp-scorecard","serve"]}`.
|
package/README.md
CHANGED
|
@@ -248,3 +248,8 @@ MIT - see [LICENSE](LICENSE).
|
|
|
248
248
|
target: dist/index.js
|
|
249
249
|
min-score: 80
|
|
250
250
|
```
|
|
251
|
+
|
|
252
|
+
### v0.4.0
|
|
253
|
+
- `mcp-scorecard compare a b c` — side-by-side ranking.
|
|
254
|
+
- `--profile security|quality|agent-ready` — score one category. `--baseline old.json` — regression diff. `--html` — shareable scorecard.
|
|
255
|
+
- Checks explainer: https://mcp-scorecard.vercel.app/checks.html
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for every check: category + why it matters.
|
|
3
|
+
* Powers `--profile` (filter by category) and the site's /checks explainer page.
|
|
4
|
+
*/
|
|
5
|
+
import type { CheckId } from './types.js';
|
|
6
|
+
export type Category = 'quality' | 'security' | 'agent-ready';
|
|
7
|
+
export interface CheckMeta {
|
|
8
|
+
label: string;
|
|
9
|
+
category: Category;
|
|
10
|
+
why: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const CHECK_META: Record<CheckId, CheckMeta>;
|
|
13
|
+
export declare const PROFILES: Record<string, {
|
|
14
|
+
label: string;
|
|
15
|
+
categories: Category[];
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const CHECK_META = {
|
|
2
|
+
// --- stdio: protocol quality ---
|
|
3
|
+
schema_validity: { label: 'Schema validity', category: 'quality', why: 'Agents reject or mis-call tools whose input schemas are invalid or missing.' },
|
|
4
|
+
tool_naming: { label: 'Tool naming', category: 'quality', why: 'Consistent snake_case verb_noun names make tools predictable for models to select.' },
|
|
5
|
+
tool_descriptions: { label: 'Tool descriptions', category: 'quality', why: 'Rich descriptions are the only thing a model has to decide when/how to call a tool.' },
|
|
6
|
+
annotations: { label: 'Annotations', category: 'quality', why: 'readOnly/destructive hints let agents reason about safety before calling.' },
|
|
7
|
+
resources: { label: 'Resources advertised', category: 'quality', why: 'Exposing resources lets agents pull context without bespoke tool calls.' },
|
|
8
|
+
smoke_test: { label: 'Smoke test', category: 'quality', why: 'A smoke script proves the server actually boots — the baseline of trust.' },
|
|
9
|
+
mutation_gating: { label: 'Mutation gating', category: 'security', why: 'State-changing tools must document/guard side effects so agents do not mutate blindly.' },
|
|
10
|
+
privacy_modes: { label: 'Privacy modes', category: 'security', why: 'A privacy_mode parameter lets agents request non-sensitive responses.' },
|
|
11
|
+
agent_manifest: { label: 'Agent manifest', category: 'agent-ready', why: 'recommended_first_calls tells an agent how to start — the onboarding contract.' },
|
|
12
|
+
manifest_discoverability: { label: 'Manifest discoverability', category: 'agent-ready', why: 'Standard discovery tools (capabilities, inventory) let agents self-orient.' },
|
|
13
|
+
// --- web: hosted/remote ---
|
|
14
|
+
web_https: { label: 'HTTPS / TLS', category: 'security', why: 'Plaintext HTTP exposes tokens and tool traffic to interception.' },
|
|
15
|
+
web_security_headers: { label: 'Security headers', category: 'security', why: 'HSTS/CSP/X-Content-Type-Options harden the server against common web attacks.' },
|
|
16
|
+
web_auth_posture: { label: 'Auth posture declared', category: 'security', why: 'Agents cannot connect safely if they cannot tell whether/how to authenticate.' },
|
|
17
|
+
web_oauth_discovery: { label: 'OAuth discovery', category: 'security', why: 'Standard OAuth metadata lets agents programmatically obtain access.' },
|
|
18
|
+
web_exposed_paths: { label: 'No exposed secrets', category: 'security', why: 'A public /.git or /.env leaks source history and live credentials — critical.' },
|
|
19
|
+
web_cors_posture: { label: 'CORS posture', category: 'security', why: 'Wildcard + credentials CORS is a classic data-exfiltration misconfiguration.' },
|
|
20
|
+
web_llms_txt: { label: 'llms.txt', category: 'agent-ready', why: 'A concise machine summary tells LLMs what the server is and how to use it.' },
|
|
21
|
+
web_mcp_server_card: { label: 'MCP Server Card', category: 'agent-ready', why: 'The /.well-known card is how agents discover the server, transport and tools.' },
|
|
22
|
+
web_agent_skills: { label: 'Agent Skills index', category: 'agent-ready', why: 'The skills discovery index lets agents find and verify your capabilities.' },
|
|
23
|
+
web_api_catalog: { label: 'API catalog (RFC 9727)', category: 'agent-ready', why: 'A standard catalog points agents to your OpenAPI, docs and status.' },
|
|
24
|
+
web_robots_signals: { label: 'robots + AI signals', category: 'agent-ready', why: 'Explicit AI-bot rules + Content-Signal declare how agents may use your content.' },
|
|
25
|
+
web_structured_data: { label: 'Structured metadata', category: 'agent-ready', why: 'JSON-LD, OpenGraph and Markdown-for-Agents make the page machine-legible.' }
|
|
26
|
+
};
|
|
27
|
+
export const PROFILES = {
|
|
28
|
+
all: { label: 'All checks', categories: ['quality', 'security', 'agent-ready'] },
|
|
29
|
+
security: { label: 'Security', categories: ['security'] },
|
|
30
|
+
quality: { label: 'Protocol quality', categories: ['quality'] },
|
|
31
|
+
'agent-ready': { label: 'Agent-readiness', categories: ['agent-ready'] }
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=checks-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks-catalog.js","sourceRoot":"","sources":["../src/checks-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -19,12 +19,15 @@ import { runWebAudit } from '../audit/web/web-runner.js';
|
|
|
19
19
|
function isWebTarget(subject) {
|
|
20
20
|
return /^https?:\/\//.test(subject) && !/github\.com/.test(subject);
|
|
21
21
|
}
|
|
22
|
-
import {
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
import { applyProfile, isProfile } from '../profiles.js';
|
|
24
|
+
import { renderBadge, renderBaseline, renderCompare, renderHtml, renderJson, renderMarkdown } from './output.js';
|
|
23
25
|
const USAGE = `mcp-scorecard v${SERVER_VERSION}
|
|
24
26
|
|
|
25
27
|
Usage:
|
|
26
|
-
mcp-scorecard <subject> [--json|--badge] [--min-score N]
|
|
28
|
+
mcp-scorecard <subject> [--json|--badge|--html] [--profile P] [--baseline f.json] [--min-score N]
|
|
27
29
|
mcp-scorecard serve run AS an MCP server (agents can call the 'audit' tool)
|
|
30
|
+
mcp-scorecard compare a b c audit several subjects, print a side-by-side table
|
|
28
31
|
|
|
29
32
|
Subjects:
|
|
30
33
|
npm-package e.g. whoop-mcp-unofficial[@version]
|
|
@@ -35,6 +38,9 @@ Subjects:
|
|
|
35
38
|
Flags:
|
|
36
39
|
--json emit structured JSON to stdout
|
|
37
40
|
--badge emit a markdown shields.io badge (paste into your README)
|
|
41
|
+
--html emit a self-contained HTML scorecard
|
|
42
|
+
--profile P score only one category: all | security | quality | agent-ready
|
|
43
|
+
--baseline f diff against a previous --json report (regression view)
|
|
38
44
|
--min-score N exit non-zero if total score < N (default 0)
|
|
39
45
|
--version print version
|
|
40
46
|
--help, -h print this message
|
|
@@ -43,7 +49,7 @@ Privacy: the probe sets MCP_PROBE=1 so MCP authors can detect an audit and
|
|
|
43
49
|
skip auth-only side effects. Probe responses are NEVER persisted; only
|
|
44
50
|
counts and field names are recorded. See the README for the security model.`;
|
|
45
51
|
function parseArgs(argv) {
|
|
46
|
-
const out = { json: false, badge: false, minScore: 0, help: false, showVersion: false };
|
|
52
|
+
const out = { json: false, badge: false, html: false, minScore: 0, help: false, showVersion: false };
|
|
47
53
|
for (let i = 0; i < argv.length; i++) {
|
|
48
54
|
const arg = argv[i];
|
|
49
55
|
if (arg === '--help' || arg === '-h')
|
|
@@ -54,6 +60,18 @@ function parseArgs(argv) {
|
|
|
54
60
|
out.json = true;
|
|
55
61
|
else if (arg === '--badge')
|
|
56
62
|
out.badge = true;
|
|
63
|
+
else if (arg === '--html')
|
|
64
|
+
out.html = true;
|
|
65
|
+
else if (arg === '--baseline') {
|
|
66
|
+
out.baseline = argv[++i];
|
|
67
|
+
if (!out.baseline)
|
|
68
|
+
throw new Error('--baseline expects a path to a previous --json report');
|
|
69
|
+
}
|
|
70
|
+
else if (arg === '--profile') {
|
|
71
|
+
out.profile = argv[++i];
|
|
72
|
+
if (!out.profile || !isProfile(out.profile))
|
|
73
|
+
throw new Error(`--profile expects one of: all, security, quality, agent-ready`);
|
|
74
|
+
}
|
|
57
75
|
else if (arg === '--min-score') {
|
|
58
76
|
const v = argv[++i];
|
|
59
77
|
const n = Number.parseInt(v, 10);
|
|
@@ -85,6 +103,12 @@ async function resolveSubject(subject) {
|
|
|
85
103
|
return resolveLocal(subject);
|
|
86
104
|
return resolveNpmPackage(subject);
|
|
87
105
|
}
|
|
106
|
+
/** Audit one subject — web mode for hosted URLs, stdio mode otherwise. */
|
|
107
|
+
async function auditSubject(subject) {
|
|
108
|
+
if (isWebTarget(subject))
|
|
109
|
+
return runWebAudit(subject);
|
|
110
|
+
return runAudit(await resolveSubject(subject));
|
|
111
|
+
}
|
|
88
112
|
export async function run(argv) {
|
|
89
113
|
// `serve` → run mcp-scorecard itself AS an MCP server (agents call the audit tool).
|
|
90
114
|
if (argv[0] === 'serve') {
|
|
@@ -95,6 +119,27 @@ export async function run(argv) {
|
|
|
95
119
|
await new Promise(() => { });
|
|
96
120
|
return 0;
|
|
97
121
|
}
|
|
122
|
+
// `compare a b c` → audit each and print a side-by-side table.
|
|
123
|
+
if (argv[0] === 'compare') {
|
|
124
|
+
const subjects = argv.slice(1).filter((a) => !a.startsWith('--'));
|
|
125
|
+
if (subjects.length < 2) {
|
|
126
|
+
process.stderr.write(`compare needs at least 2 subjects.\n\n${USAGE}\n`);
|
|
127
|
+
return 2;
|
|
128
|
+
}
|
|
129
|
+
const reports = [];
|
|
130
|
+
for (const s of subjects) {
|
|
131
|
+
try {
|
|
132
|
+
reports.push(await auditSubject(s));
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
process.stderr.write(`skip ${s}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (reports.length === 0)
|
|
139
|
+
return 1;
|
|
140
|
+
process.stdout.write(`${renderCompare(reports)}\n`);
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
98
143
|
let parsed;
|
|
99
144
|
try {
|
|
100
145
|
parsed = parseArgs(argv);
|
|
@@ -116,35 +161,31 @@ export async function run(argv) {
|
|
|
116
161
|
return 2;
|
|
117
162
|
}
|
|
118
163
|
let report;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
report = await runWebAudit(parsed.subject);
|
|
123
|
-
}
|
|
124
|
-
catch (err) {
|
|
125
|
-
process.stderr.write(`Web audit error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
126
|
-
return 1;
|
|
127
|
-
}
|
|
164
|
+
try {
|
|
165
|
+
report = await auditSubject(parsed.subject);
|
|
128
166
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
process.stderr.write(`Audit error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
169
|
+
return 1;
|
|
170
|
+
}
|
|
171
|
+
if (parsed.profile)
|
|
172
|
+
report = applyProfile(report, parsed.profile);
|
|
173
|
+
let baseline;
|
|
174
|
+
if (parsed.baseline) {
|
|
138
175
|
try {
|
|
139
|
-
|
|
176
|
+
baseline = JSON.parse(readFileSync(parsed.baseline, 'utf8'));
|
|
140
177
|
}
|
|
141
178
|
catch (err) {
|
|
142
|
-
process.stderr.write(
|
|
179
|
+
process.stderr.write(`--baseline read error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
143
180
|
return 1;
|
|
144
181
|
}
|
|
145
182
|
}
|
|
146
|
-
|
|
147
|
-
|
|
183
|
+
const out = parsed.badge ? renderBadge(report)
|
|
184
|
+
: parsed.json ? renderJson(report)
|
|
185
|
+
: parsed.html ? renderHtml(report)
|
|
186
|
+
: baseline ? renderBaseline(report, baseline)
|
|
187
|
+
: renderMarkdown(report);
|
|
188
|
+
process.stdout.write(`${out}\n`);
|
|
148
189
|
if (report.totalScore < parsed.minScore) {
|
|
149
190
|
process.stderr.write(`\nScore ${report.totalScore} < --min-score ${parsed.minScore}\n`);
|
|
150
191
|
return 1;
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,sFAAsF;AACtF,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtE,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/output.d.ts
CHANGED
|
@@ -12,4 +12,10 @@ import type { AuditReport } from '../types.js';
|
|
|
12
12
|
export declare function renderMarkdown(report: AuditReport): string;
|
|
13
13
|
/** A shields.io badge (markdown) maintainers can paste into their README. */
|
|
14
14
|
export declare function renderBadge(report: AuditReport): string;
|
|
15
|
+
/** Side-by-side comparison table for multiple audited targets. */
|
|
16
|
+
export declare function renderCompare(reports: AuditReport[]): string;
|
|
17
|
+
/** Current report + delta against a previous run (regression view). */
|
|
18
|
+
export declare function renderBaseline(report: AuditReport, baseline: AuditReport): string;
|
|
19
|
+
/** Self-contained HTML scorecard for sharing / embedding in docs or a PR. */
|
|
20
|
+
export declare function renderHtml(report: AuditReport): string;
|
|
15
21
|
export declare function renderJson(report: AuditReport): string;
|
package/dist/cli/output.js
CHANGED
|
@@ -82,6 +82,48 @@ export function renderBadge(report) {
|
|
|
82
82
|
const url = `https://img.shields.io/badge/mcp--scorecard-${msg}-${color}`;
|
|
83
83
|
return `[](https://mcp-scorecard.vercel.app)`;
|
|
84
84
|
}
|
|
85
|
+
/** Side-by-side comparison table for multiple audited targets. */
|
|
86
|
+
export function renderCompare(reports) {
|
|
87
|
+
const sorted = [...reports].sort((a, b) => b.totalScore - a.totalScore);
|
|
88
|
+
const lines = ['# mcp-scorecard — comparison', '', '| # | target | score | grade |', '|---|--------|-------|-------|'];
|
|
89
|
+
sorted.forEach((r, i) => {
|
|
90
|
+
lines.push(`| ${i + 1} | ${redact(r.target.displayName)} | ${r.totalScore}/100 | ${r.grade} |`);
|
|
91
|
+
});
|
|
92
|
+
lines.push('', `_Generated by mcp-scorecard v${sorted[0]?.scorecardVersion ?? ''}_`);
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
}
|
|
95
|
+
/** Current report + delta against a previous run (regression view). */
|
|
96
|
+
export function renderBaseline(report, baseline) {
|
|
97
|
+
const delta = report.totalScore - baseline.totalScore;
|
|
98
|
+
const arrow = delta > 0 ? `▲ +${delta}` : delta < 0 ? `▼ ${delta}` : '= 0';
|
|
99
|
+
const prevById = new Map(baseline.checks.map((c) => [c.id, c.score]));
|
|
100
|
+
const lines = [renderMarkdown(report), '', '## vs baseline', `**Total: ${report.totalScore}/100 (${arrow} from ${baseline.totalScore})**`, ''];
|
|
101
|
+
for (const c of report.checks) {
|
|
102
|
+
const prev = prevById.get(c.id);
|
|
103
|
+
if (prev !== undefined && prev !== c.score) {
|
|
104
|
+
const d = c.score - prev;
|
|
105
|
+
lines.push(`- ${c.label}: ${prev} → ${c.score} (${d > 0 ? '+' : ''}${d})`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
/** Self-contained HTML scorecard for sharing / embedding in docs or a PR. */
|
|
111
|
+
export function renderHtml(report) {
|
|
112
|
+
const color = report.grade === 'A' ? '#10b981' : report.grade === 'B' ? '#34d399' : report.grade === 'C' ? '#f59e0b' : report.grade === 'D' ? '#fb923c' : '#f43f5e';
|
|
113
|
+
const esc = (t) => t.replace(/[&<>]/g, (m) => ({ '&': '&', '<': '<', '>': '>' }[m]));
|
|
114
|
+
const rows = report.checks.map((c) => {
|
|
115
|
+
const cc = c.status === 'pass' ? '#10b981' : c.status === 'warn' ? '#f59e0b' : '#f43f5e';
|
|
116
|
+
return `<tr><td>${esc(c.label)}</td><td style="text-align:right;color:${cc};font-weight:700">${c.score}/10</td><td style="color:#9aa6c2">${esc(redact(c.summary))}</td></tr>`;
|
|
117
|
+
}).join('');
|
|
118
|
+
return `<!doctype html><meta charset="utf-8"><title>mcp-scorecard — ${esc(report.target.displayName)}</title>
|
|
119
|
+
<div style="font-family:ui-monospace,monospace;background:#0b1120;color:#e8eefc;max-width:760px;margin:30px auto;padding:28px;border-radius:14px">
|
|
120
|
+
<div style="font-size:13px;color:#7c8aa6;letter-spacing:.1em">MCP-SCORECARD · ${report.mode.toUpperCase()} MODE</div>
|
|
121
|
+
<h1 style="margin:6px 0 2px">${esc(report.target.displayName)}</h1>
|
|
122
|
+
<div style="font-size:48px;font-weight:800;color:${color}">${report.totalScore}<span style="font-size:20px;color:#7c8aa6">/100</span> <span style="border:2px solid ${color};border-radius:8px;padding:2px 12px;font-size:24px">${report.grade}</span></div>
|
|
123
|
+
<table style="width:100%;border-collapse:collapse;margin-top:18px;font-size:13.5px">${rows}</table>
|
|
124
|
+
<p style="color:#7c8aa6;font-size:12px;margin-top:18px">Generated by <a style="color:#10b981" href="https://mcp-scorecard.vercel.app">mcp-scorecard</a> v${report.scorecardVersion} · ${report.generatedAt}</p>
|
|
125
|
+
</div>`;
|
|
126
|
+
}
|
|
85
127
|
export function renderJson(report) {
|
|
86
128
|
// JSON output is also redacted at the string level so consumers don't
|
|
87
129
|
// accidentally persist secrets from probed servers.
|
package/dist/cli/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,GAA0C;IACzD,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAChG,IAAI,CACL,CAAC;AAEF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,UAAU,gBAAgB,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,uFAAuF;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,gBAAgB,OAAO,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO;QACjF,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9E,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,MAAM,CAAC,UAAU,SAAS,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,+CAA+C,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1E,OAAO,qBAAqB,MAAM,CAAC,KAAK,KAAK,GAAG,sCAAsC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,sEAAsE;IACtE,oDAAoD;IACpD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC;QACJ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7B,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;KAC1B,CAAC,CAAC,CAAC;IACJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* same string. Bumping this without updating package.json is intentional during
|
|
4
4
|
* dev (keep src as source of truth); a release script can sync them.
|
|
5
5
|
*/
|
|
6
|
-
export declare const SERVER_VERSION = "0.
|
|
6
|
+
export declare const SERVER_VERSION = "0.4.0";
|
|
7
7
|
/** Identifier used when the probe connects to a target MCP server. */
|
|
8
8
|
export declare const PROBE_CLIENT_NAME = "mcp-scorecard";
|
|
9
9
|
/** Env var set on the spawned target so MCP authors can detect we are probing
|
package/dist/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* same string. Bumping this without updating package.json is intentional during
|
|
4
4
|
* dev (keep src as source of truth); a release script can sync them.
|
|
5
5
|
*/
|
|
6
|
-
export const SERVER_VERSION = '0.
|
|
6
|
+
export const SERVER_VERSION = '0.4.0';
|
|
7
7
|
/** Identifier used when the probe connects to a target MCP server. */
|
|
8
8
|
export const PROBE_CLIENT_NAME = 'mcp-scorecard';
|
|
9
9
|
/** Env var set on the spawned target so MCP authors can detect we are probing
|
package/dist/profiles.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring profiles — narrow a report to the checks in a category (security /
|
|
3
|
+
* quality / agent-ready) and rescore over just those. Pure; returns a new report.
|
|
4
|
+
*/
|
|
5
|
+
import { CHECK_META, PROFILES } from './checks-catalog.js';
|
|
6
|
+
import { toGrade } from './types.js';
|
|
7
|
+
export function isProfile(name) {
|
|
8
|
+
return name in PROFILES;
|
|
9
|
+
}
|
|
10
|
+
export function applyProfile(report, profileName) {
|
|
11
|
+
const profile = PROFILES[profileName];
|
|
12
|
+
if (!profile || profileName === 'all')
|
|
13
|
+
return report;
|
|
14
|
+
const cats = profile.categories;
|
|
15
|
+
const filtered = report.checks.filter((c) => {
|
|
16
|
+
const meta = CHECK_META[c.id];
|
|
17
|
+
return meta && cats.includes(meta.category);
|
|
18
|
+
});
|
|
19
|
+
if (filtered.length === 0)
|
|
20
|
+
return report; // nothing in this profile for this mode
|
|
21
|
+
const sum = filtered.reduce((acc, c) => acc + Math.max(0, Math.min(10, c.score)), 0);
|
|
22
|
+
const totalScore = Math.round((sum / (filtered.length * 10)) * 100);
|
|
23
|
+
return { ...report, checks: filtered, totalScore, grade: toGrade(totalScore) };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,IAAI,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,WAAmB;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,wCAAwC;IAClF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AACjF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-scorecard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.davidmosiah/mcp-scorecard",
|
|
5
5
|
"description": "Grade any MCP server's agent-readiness in one command \u2014 stdio (10 protocol checks) AND hosted/remote servers (10 security + web agent-readiness checks). Open source, local-first, no credentials.",
|
|
6
6
|
"type": "module",
|
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
"dev": "tsx src/index.ts",
|
|
23
23
|
"test:checks": "node scripts/test-checks.mjs",
|
|
24
24
|
"test:self": "node scripts/smoke-self.mjs",
|
|
25
|
-
"test": "npm run typecheck && npm run build && npm run test:checks && npm run test:self && npm run test:web",
|
|
25
|
+
"test": "npm run typecheck && npm run build && npm run test:checks && npm run test:self && npm run test:web && npm run test:features",
|
|
26
26
|
"prepublishOnly": "npm test",
|
|
27
|
-
"test:web": "node scripts/test-web.mjs"
|
|
27
|
+
"test:web": "node scripts/test-web.mjs",
|
|
28
|
+
"test:features": "node scripts/test-features.mjs",
|
|
29
|
+
"gen:checks": "node scripts/gen-checks-page.mjs"
|
|
28
30
|
},
|
|
29
31
|
"keywords": [
|
|
30
32
|
"mcp",
|