@incultnitollc/mcpr 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/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # `mcpr`
2
+
3
+ > Search, inspect, and score MCP servers from your terminal.
4
+
5
+ The CLI half of the [MCP Registry](https://mcp-registry-dh5.pages.dev) — a
6
+ curated index of Model Context Protocol servers with structured metadata
7
+ and quality scores from
8
+ [`@incultnitollc/mcp-probe`](https://www.npmjs.com/package/@incultnitollc/mcp-probe).
9
+
10
+ ## Install
11
+
12
+ ```sh
13
+ npm install -g @incultnitollc/mcpr
14
+ # or run without installing
15
+ npx @incultnitollc/mcpr search filesystem
16
+ ```
17
+
18
+ After the global install the bin is `mcpr` — the scope only matters at
19
+ install time, not at the command line.
20
+
21
+ Node 20+ required.
22
+
23
+ ## Usage
24
+
25
+ ```sh
26
+ mcpr search <query> # search by name / slug / description
27
+ mcpr info <slug> # full detail for one server
28
+ mcpr score <slug> # quality-score breakdown
29
+ ```
30
+
31
+ ### Examples
32
+
33
+ ```sh
34
+ mcpr search filesystem
35
+ mcpr search github --limit 10
36
+ mcpr info mcpr-ai-arclan-registry
37
+ mcpr score mcpr-ai-arclan-registry
38
+ ```
39
+
40
+ `mcpr install` (cross-client config writer for Claude Code, Claude Desktop,
41
+ Cursor, Windsurf, and VS Code) is on the v1.1 roadmap. The Registry is
42
+ read-only from the CLI in v1.
43
+
44
+ ## Configuration
45
+
46
+ The CLI talks to the public Registry by default. Override the endpoint
47
+ with environment variables if you're running a private mirror:
48
+
49
+ | Variable | Default |
50
+ |---|---|
51
+ | `MCPR_SUPABASE_URL` | `https://kpqxrtsdcmwbszznpeem.supabase.co` |
52
+ | `MCPR_SUPABASE_ANON_KEY` | embedded anon key (read-only, RLS-governed) |
53
+
54
+ ## What the Registry covers
55
+
56
+ - ~6,900 MCP servers indexed from six upstream sources (Anthropic curated,
57
+ Microsoft, Google, Pipedream, the official `modelcontextprotocol.io`
58
+ registry, and npm).
59
+ - Canonical SPDX license normalization.
60
+ - Quality scores from `mcp-probe` — compliance, tool reliability, schema
61
+ validity, error handling, latency p50.
62
+
63
+ ## License
64
+
65
+ MIT © Incultnito LLC
package/dist/cli.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mcpr — MCP Registry CLI.
4
+ *
5
+ * Subcommands:
6
+ * mcpr search <query> — search the registry by name/slug/description
7
+ * mcpr info <slug> — print full server detail
8
+ * mcpr score <slug> — print quality-score breakdown
9
+ *
10
+ * Reads the public Supabase project via the published anon key. No
11
+ * credentials required at install time. `mcpr install` (cross-client
12
+ * config writer) is intentionally out of scope for v1.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
package/dist/cli.js ADDED
@@ -0,0 +1,288 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mcpr — MCP Registry CLI.
4
+ *
5
+ * Subcommands:
6
+ * mcpr search <query> — search the registry by name/slug/description
7
+ * mcpr info <slug> — print full server detail
8
+ * mcpr score <slug> — print quality-score breakdown
9
+ *
10
+ * Reads the public Supabase project via the published anon key. No
11
+ * credentials required at install time. `mcpr install` (cross-client
12
+ * config writer) is intentionally out of scope for v1.
13
+ */
14
+ import { createClient } from "@supabase/supabase-js";
15
+ import { Command } from "commander";
16
+ const REGISTRY_URL = process.env.MCPR_SUPABASE_URL ?? "https://kpqxrtsdcmwbszznpeem.supabase.co";
17
+ // Public anon key for the MCP Registry Supabase project. Anon role only;
18
+ // reads are governed by RLS. Safe to ship inside a published CLI.
19
+ const REGISTRY_ANON_KEY = process.env.MCPR_SUPABASE_ANON_KEY ??
20
+ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImtwcXhydHNkY213YnN6em5wZWVtIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzY1NjQ5MjcsImV4cCI6MjA5MjE0MDkyN30.eOgv-YxaZZ7T5ML_qAu3fAHQjcq1LQ9tNpmhVWorEIk";
21
+ const WEB_HOST = "https://mcp-registry-dh5.pages.dev";
22
+ const SERVER_COLUMNS = "id, slug, name, description, homepage, repo_url, license, maintainer, card_summary_json";
23
+ const VERSION_COLUMNS = "id, semver, source_url, capabilities_json, server_card_json, published_at";
24
+ // ---------------------------------------------------------------------------
25
+ // Supabase client — cached, anon-only.
26
+ // ---------------------------------------------------------------------------
27
+ let cachedClient = null;
28
+ function getClient() {
29
+ if (cachedClient)
30
+ return cachedClient;
31
+ cachedClient = createClient(REGISTRY_URL, REGISTRY_ANON_KEY, {
32
+ auth: { persistSession: false, autoRefreshToken: false },
33
+ });
34
+ return cachedClient;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Terminal helpers — TTY-aware, no chalk dep.
38
+ // ---------------------------------------------------------------------------
39
+ const isTTY = process.stdout.isTTY === true;
40
+ const ESC = "";
41
+ function color(code, s) {
42
+ if (!isTTY)
43
+ return s;
44
+ return `${ESC}[${code}m${s}${ESC}[0m`;
45
+ }
46
+ const dim = (s) => color("2", s);
47
+ const bold = (s) => color("1", s);
48
+ const brand = (s) => color("1;35", s); // bold magenta — matches #820855 family
49
+ function truncate(s, max) {
50
+ if (!s)
51
+ return "";
52
+ const cleaned = s.replace(/\s+/g, " ").trim();
53
+ return cleaned.length > max ? cleaned.slice(0, max - 1) + "…" : cleaned;
54
+ }
55
+ function formatDate(iso) {
56
+ if (!iso)
57
+ return "—";
58
+ const d = new Date(iso);
59
+ if (Number.isNaN(d.getTime()))
60
+ return iso;
61
+ return d.toISOString().slice(0, 10);
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Shared lookups
65
+ // ---------------------------------------------------------------------------
66
+ async function findServer(sb, slug) {
67
+ const { data, error } = await sb
68
+ .from("servers")
69
+ .select(SERVER_COLUMNS)
70
+ .eq("slug", slug)
71
+ .is("deleted_at", null)
72
+ .limit(1);
73
+ if (error)
74
+ throw new Error(`servers select failed: ${error.message}`);
75
+ return data?.[0] ?? null;
76
+ }
77
+ async function getLatestScore(sb, serverId) {
78
+ const { data, error } = await sb
79
+ .from("quality_scores")
80
+ .select("overall_score, dimensions_json, created_at, doctor_runs!inner(server_versions!inner(server_id))")
81
+ .eq("doctor_runs.server_versions.server_id", serverId)
82
+ .order("created_at", { ascending: false })
83
+ .limit(1);
84
+ if (error) {
85
+ // Score join may fail in restricted environments; treat as missing.
86
+ return null;
87
+ }
88
+ const first = data?.[0];
89
+ return first ?? null;
90
+ }
91
+ async function getLatestVersion(sb, serverId) {
92
+ const { data, error } = await sb
93
+ .from("server_versions")
94
+ .select(VERSION_COLUMNS)
95
+ .eq("server_id", serverId)
96
+ .is("deleted_at", null)
97
+ .order("published_at", { ascending: false, nullsFirst: false })
98
+ .limit(1);
99
+ if (error)
100
+ throw new Error(`server_versions select failed: ${error.message}`);
101
+ return data?.[0] ?? null;
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // search
105
+ // ---------------------------------------------------------------------------
106
+ async function cmdSearch(query, opts) {
107
+ const q = query.trim();
108
+ if (q.length === 0) {
109
+ console.error("search query must not be empty");
110
+ return 2;
111
+ }
112
+ const limit = Math.max(1, Math.min(100, Number.parseInt(opts.limit ?? "20", 10) || 20));
113
+ const sb = getClient();
114
+ const like = `%${q.replace(/[%_]/g, "\\$&")}%`;
115
+ const { data: serverData, error } = await sb
116
+ .from("servers")
117
+ .select(SERVER_COLUMNS)
118
+ .is("deleted_at", null)
119
+ .or(`slug.ilike.${like},name.ilike.${like},description.ilike.${like}`)
120
+ .order("slug", { ascending: true })
121
+ .limit(limit);
122
+ if (error)
123
+ throw new Error(`servers search failed: ${error.message}`);
124
+ const servers = (serverData ?? []);
125
+ if (servers.length === 0) {
126
+ console.log(dim(`No servers match “${q}”.`));
127
+ return 0;
128
+ }
129
+ // Parallel score lookup for the page.
130
+ const scores = await Promise.all(servers.map((s) => getLatestScore(sb, s.id)));
131
+ const slugW = Math.min(44, Math.max(20, ...servers.map((s) => s.slug.length)));
132
+ const licW = Math.min(14, Math.max(8, ...servers.map((s) => (s.license ?? "").length)));
133
+ console.log(bold(`${"slug".padEnd(slugW)} ${"score".padEnd(5)} ${"license".padEnd(licW)} description`));
134
+ console.log(dim("-".repeat(slugW + licW + 28)));
135
+ for (let i = 0; i < servers.length; i++) {
136
+ const s = servers[i];
137
+ const sc = scores[i];
138
+ const slugCell = brand(s.slug.padEnd(slugW));
139
+ const scoreCell = sc ? bold(String(sc.overall_score).padStart(3)) + " " : dim(" — ") + " ";
140
+ const licCell = (s.license ?? "—").padEnd(licW);
141
+ const descCell = dim(truncate(s.description, 72));
142
+ console.log(`${slugCell} ${scoreCell} ${licCell} ${descCell}`);
143
+ }
144
+ console.log("");
145
+ console.log(dim(`${servers.length} result(s). Use \`mcpr info <slug>\` for detail. Web: ${WEB_HOST}/servers/<slug>`));
146
+ return 0;
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // info
150
+ // ---------------------------------------------------------------------------
151
+ async function cmdInfo(slug) {
152
+ const sb = getClient();
153
+ const server = await findServer(sb, slug);
154
+ if (!server) {
155
+ console.error(`No active server with slug “${slug}”.`);
156
+ return 2;
157
+ }
158
+ const [version, score] = await Promise.all([
159
+ getLatestVersion(sb, server.id),
160
+ getLatestScore(sb, server.id),
161
+ ]);
162
+ console.log(brand(server.name || server.slug));
163
+ if (server.maintainer)
164
+ console.log(dim(server.maintainer));
165
+ console.log("");
166
+ const lines = [
167
+ ["Slug", server.slug],
168
+ ["License", server.license ?? "—"],
169
+ ["Latest version", version?.semver ?? "—"],
170
+ ["Published", formatDate(version?.published_at ?? null)],
171
+ ["Homepage", server.homepage ?? "—"],
172
+ ["Repository", server.repo_url ?? "—"],
173
+ [
174
+ "Quality score",
175
+ score ? `${score.overall_score} / 100 (probed ${formatDate(score.created_at)})` : "Not yet probed",
176
+ ],
177
+ ];
178
+ const labelW = Math.max(...lines.map(([k]) => k.length));
179
+ for (const [k, v] of lines) {
180
+ console.log(`${dim(k.padEnd(labelW))} ${v}`);
181
+ }
182
+ if (server.description) {
183
+ console.log("");
184
+ console.log(server.description.replace(/\s+/g, " ").trim());
185
+ }
186
+ console.log("");
187
+ console.log(dim(`Web: ${WEB_HOST}/servers/${encodeURIComponent(server.slug)}`));
188
+ return 0;
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // score
192
+ // ---------------------------------------------------------------------------
193
+ async function cmdScore(slug) {
194
+ const sb = getClient();
195
+ const server = await findServer(sb, slug);
196
+ if (!server) {
197
+ console.error(`No active server with slug “${slug}”.`);
198
+ return 2;
199
+ }
200
+ const score = await getLatestScore(sb, server.id);
201
+ if (!score) {
202
+ console.log(brand(server.name || server.slug));
203
+ console.log("");
204
+ console.log(dim("Not yet probed. The next scheduled scoring run will pick this server up."));
205
+ return 0;
206
+ }
207
+ console.log(brand(server.name || server.slug));
208
+ console.log(dim(`Probed ${formatDate(score.created_at)} · Web: ${WEB_HOST}/servers/${encodeURIComponent(server.slug)}`));
209
+ console.log("");
210
+ console.log(bold(`Overall: ${score.overall_score} / 100`));
211
+ console.log("");
212
+ const dims = score.dimensions_json ?? {};
213
+ const dimLines = [
214
+ ["Compliance", formatPct(dims["compliance_pct"])],
215
+ ["Tool reliability", formatPct(dims["tool_reliability_pct"])],
216
+ ["Schema", formatPct(dims["schema_pct"])],
217
+ ["Error handling", formatPct(dims["error_handling_pct"])],
218
+ ["Latency p50", formatMs(dims["latency_p50_ms"])],
219
+ ];
220
+ const labelW = Math.max(...dimLines.map(([k]) => k.length));
221
+ for (const [k, v] of dimLines) {
222
+ console.log(`${dim(k.padEnd(labelW))} ${v}`);
223
+ }
224
+ return 0;
225
+ }
226
+ function formatPct(v) {
227
+ if (typeof v !== "number" || !Number.isFinite(v))
228
+ return "—";
229
+ return `${Math.round(v)}%`;
230
+ }
231
+ function formatMs(v) {
232
+ if (typeof v !== "number" || !Number.isFinite(v))
233
+ return "—";
234
+ return `${Math.round(v)} ms`;
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // Commander entrypoint
238
+ // ---------------------------------------------------------------------------
239
+ const program = new Command();
240
+ program
241
+ .name("mcpr")
242
+ .description("MCP Registry CLI — search, inspect, and score MCP servers.")
243
+ .version("0.1.0");
244
+ program
245
+ .command("search")
246
+ .argument("<query>", "name, slug, or description keyword")
247
+ .option("--limit <n>", "max results to show", "20")
248
+ .description("Search the MCP Registry")
249
+ .action(async (query, opts) => {
250
+ try {
251
+ process.exit(await cmdSearch(query, opts));
252
+ }
253
+ catch (err) {
254
+ console.error(err.message);
255
+ process.exit(1);
256
+ }
257
+ });
258
+ program
259
+ .command("info")
260
+ .argument("<slug>", "server slug (use `mcpr search` to find one)")
261
+ .description("Show full detail for one server")
262
+ .action(async (slug) => {
263
+ try {
264
+ process.exit(await cmdInfo(slug));
265
+ }
266
+ catch (err) {
267
+ console.error(err.message);
268
+ process.exit(1);
269
+ }
270
+ });
271
+ program
272
+ .command("score")
273
+ .argument("<slug>", "server slug")
274
+ .description("Show the latest quality-score breakdown")
275
+ .action(async (slug) => {
276
+ try {
277
+ process.exit(await cmdScore(slug));
278
+ }
279
+ catch (err) {
280
+ console.error(err.message);
281
+ process.exit(1);
282
+ }
283
+ });
284
+ program.parseAsync(process.argv).catch((err) => {
285
+ console.error(err.message);
286
+ process.exit(1);
287
+ });
288
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@incultnitollc/mcpr",
3
+ "version": "0.1.0",
4
+ "description": "MCP Registry CLI — search, inspect, and score MCP servers across clients.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcpr": "dist/cli.js"
8
+ },
9
+ "main": "./dist/cli.js",
10
+ "types": "./dist/cli.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "typecheck": "tsc -p tsconfig.json --noEmit",
21
+ "lint": "eslint . --quiet",
22
+ "test": "echo \"(no tests yet)\" && exit 0"
23
+ },
24
+ "homepage": "https://mcp-registry-dh5.pages.dev",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/Incultnitollc/mcp-registry.git",
28
+ "directory": "packages/cli"
29
+ },
30
+ "keywords": [
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "registry",
34
+ "cli",
35
+ "claude"
36
+ ],
37
+ "license": "MIT",
38
+ "author": "Incultnito LLC",
39
+ "dependencies": {
40
+ "@mcpr/types": "workspace:*",
41
+ "@supabase/supabase-js": "^2.58.0",
42
+ "commander": "^14.0.3"
43
+ },
44
+ "devDependencies": {
45
+ "@mcpr/tsconfig": "workspace:*",
46
+ "@types/node": "^22.19.17",
47
+ "typescript": "^5.7.3"
48
+ }
49
+ }