mcplane 0.1.0 → 0.3.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 +68 -11
- package/dist/checks/auth.d.ts +9 -0
- package/dist/checks/listing.d.ts +4 -0
- package/dist/checks/listing.js +9 -0
- package/dist/checks/server.d.ts +8 -0
- package/dist/checks/server.js +24 -22
- package/dist/checks/tls.d.ts +3 -0
- package/dist/checks/tls.js +17 -0
- package/dist/checks/tools.d.ts +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +15 -22
- package/dist/core.d.ts +18 -0
- package/dist/core.js +52 -0
- package/dist/draft.d.ts +5 -0
- package/dist/draft.js +55 -0
- package/dist/drift.d.ts +57 -0
- package/dist/extras.d.ts +13 -0
- package/dist/extras.js +2 -41
- package/dist/fleet.d.ts +40 -0
- package/dist/fleet.js +12 -5
- package/dist/listings.d.ts +13 -0
- package/dist/listings.js +169 -0
- package/dist/manifest.d.ts +10 -0
- package/dist/manifest.js +2 -53
- package/dist/mcp-client.d.ts +24 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +14 -9
- package/dist/packs.d.ts +32 -0
- package/dist/packs.js +5 -3
- package/dist/preflight.d.ts +9 -0
- package/dist/preflight.js +5 -38
- package/dist/publish.d.ts +52 -0
- package/dist/publish.js +21 -4
- package/dist/report.d.ts +4 -0
- package/dist/submissions.d.ts +33 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.js +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -1
- package/package.json +10 -2
- package/schema.json +2 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Manifest, StoreId } from './types.js';
|
|
2
|
+
export interface PublishResult {
|
|
3
|
+
store: StoreId;
|
|
4
|
+
done: boolean;
|
|
5
|
+
lines: string[];
|
|
6
|
+
url?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function registryName(m: Manifest): string;
|
|
9
|
+
export declare function serverJson(m: Manifest): {
|
|
10
|
+
version: string;
|
|
11
|
+
remotes: {
|
|
12
|
+
type: string;
|
|
13
|
+
url: string;
|
|
14
|
+
}[];
|
|
15
|
+
repository?: {
|
|
16
|
+
url: string;
|
|
17
|
+
source: string;
|
|
18
|
+
} | undefined;
|
|
19
|
+
websiteUrl?: string | undefined;
|
|
20
|
+
$schema: string;
|
|
21
|
+
name: string;
|
|
22
|
+
title: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
declare function grokEntry(m: Manifest, sha: string): {
|
|
26
|
+
keywords: string[];
|
|
27
|
+
domains: string[];
|
|
28
|
+
homepage?: string | undefined;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
category: string;
|
|
32
|
+
source: {
|
|
33
|
+
source: string;
|
|
34
|
+
url: string;
|
|
35
|
+
sha: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/** Adds or re-pins our entry without reformatting the rest of the file. */
|
|
39
|
+
declare function editMarketplace(text: string, entry: ReturnType<typeof grokEntry>): {
|
|
40
|
+
text: string;
|
|
41
|
+
mode: 'add' | 'bump' | 'same';
|
|
42
|
+
};
|
|
43
|
+
export declare function publish(m: Manifest, store: StoreId, opts?: {
|
|
44
|
+
yes?: boolean;
|
|
45
|
+
dir?: string;
|
|
46
|
+
}): Promise<PublishResult>;
|
|
47
|
+
export declare const _test: {
|
|
48
|
+
editMarketplace: typeof editMarketplace;
|
|
49
|
+
grokEntry: typeof grokEntry;
|
|
50
|
+
nextPrerelease: (v: string) => string;
|
|
51
|
+
};
|
|
52
|
+
export {};
|
package/dist/publish.js
CHANGED
|
@@ -59,7 +59,7 @@ async function registryVersions(name) {
|
|
|
59
59
|
}
|
|
60
60
|
/** 1.2.0 → 1.2.0-1, 1.2.0-1 → 1.2.0-2: the registry's way to change metadata without a new release. */
|
|
61
61
|
const nextPrerelease = (v) => (/-(\d+)$/.test(v) ? v.replace(/-(\d+)$/, (_, n) => `-${Number(n) + 1}`) : `${v}-1`);
|
|
62
|
-
const REGISTRY_READERS = 'GitHub’s MCP
|
|
62
|
+
const REGISTRY_READERS = 'Glama and PulseMCP import from the official registry. GitHub’s MCP gallery (VS Code) needs a one-time manual onboarding, then syncs new versions. Run "mcplane listings" in a day or two to see where it landed.';
|
|
63
63
|
async function publishRegistry(m, yes, dir) {
|
|
64
64
|
const json = serverJson(m);
|
|
65
65
|
const file = m.registry?.file ?? 'server.json';
|
|
@@ -201,6 +201,22 @@ async function publishGrok(m, yes) {
|
|
|
201
201
|
function prepared(m, store) {
|
|
202
202
|
const gh = ghRepo(m);
|
|
203
203
|
const desc = m.oneLiner ?? m.subtitle ?? m.title;
|
|
204
|
+
if (store === 'awesome-remote-mcp-servers') {
|
|
205
|
+
const auth = m.server.auth === 'oauth' ? '🔐' : '🔓';
|
|
206
|
+
const reg = registryName(m);
|
|
207
|
+
const sentence = (desc.endsWith('.') ? desc : `${desc}.`).slice(0, 120);
|
|
208
|
+
return {
|
|
209
|
+
store,
|
|
210
|
+
done: false,
|
|
211
|
+
lines: [
|
|
212
|
+
'For hosted servers. Add this under the right category in punkpeye/awesome-remote-mcp-servers README.md (alphabetical):',
|
|
213
|
+
`- [${m.title}](${m.links?.website ?? m.server.url}) \`${m.server.url}\``,
|
|
214
|
+
` [](https://glama.ai/mcp/connectors/${reg})`,
|
|
215
|
+
` ${auth} - ${sentence}`,
|
|
216
|
+
'Star the repo first (PRs from accounts that haven’t aren’t merged). CI sends an unauthenticated initialize: a 401 with WWW-Authenticate passes as OAuth. The Glama connector must exist ("mcplane listings"). Agent-opened PRs can end the title with 🤖🤖🤖 for the fast track.',
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
204
220
|
if (store === 'awesome-mcp-servers') {
|
|
205
221
|
const link = gh ? `[${gh.owner}/${gh.repo}](https://github.com/${gh.owner}/${gh.repo})` : `[${m.title}](${m.links?.website ?? m.server.url})`;
|
|
206
222
|
return {
|
|
@@ -222,10 +238,11 @@ function prepared(m, store) {
|
|
|
222
238
|
store,
|
|
223
239
|
done: false,
|
|
224
240
|
lines: [
|
|
225
|
-
`
|
|
226
|
-
|
|
241
|
+
`Hosted servers: Glama imports a connector from the official registry at https://glama.ai/mcp/connectors/${registryName(m)}. Publish there first, then claim it.`,
|
|
242
|
+
`Code on GitHub: add ${gh ? `https://github.com/${gh.owner}/${gh.repo}` : 'the repo'} at https://glama.ai/mcp/servers ("Add MCP Server"); Glama checks license, security and health, and scores it.`,
|
|
243
|
+
'To claim either, commit glama.json at the repo root:',
|
|
227
244
|
JSON.stringify({ $schema: 'https://glama.ai/mcp/schemas/server.json', maintainers: [owner] }, null, 2),
|
|
228
|
-
'awesome
|
|
245
|
+
'Both awesome lists require the Glama badge on each entry, so do this first.',
|
|
229
246
|
],
|
|
230
247
|
};
|
|
231
248
|
}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Manifest, StoreId } from './types.js';
|
|
2
|
+
export interface Submission {
|
|
3
|
+
store: StoreId;
|
|
4
|
+
kind: 'new' | 'update' | 'resubmission';
|
|
5
|
+
version?: string;
|
|
6
|
+
submittedOn: string;
|
|
7
|
+
status: 'waiting' | 'approved' | 'rejected' | 'withdrawn';
|
|
8
|
+
decidedOn?: string;
|
|
9
|
+
reviewTimes?: {
|
|
10
|
+
token: string;
|
|
11
|
+
shareUrl: string | null;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare function load(dir?: string): Promise<Submission[]>;
|
|
15
|
+
export declare function recordSubmitted(m: Manifest, store: StoreId, opts: {
|
|
16
|
+
date?: string;
|
|
17
|
+
kind?: Submission['kind'];
|
|
18
|
+
version?: string;
|
|
19
|
+
appId?: string;
|
|
20
|
+
share?: boolean;
|
|
21
|
+
token?: string;
|
|
22
|
+
}, dir?: string): Promise<{
|
|
23
|
+
submission: Submission;
|
|
24
|
+
note: string;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function recordDecision(store: StoreId, outcome: 'approved' | 'rejected' | 'withdrawn', date?: string, dir?: string): Promise<Submission>;
|
|
27
|
+
export interface StatusRow {
|
|
28
|
+
submission: Submission;
|
|
29
|
+
days: number;
|
|
30
|
+
typical: string | null;
|
|
31
|
+
}
|
|
32
|
+
/** Refreshes each waiting submission from Review Times (the directory watch may have closed it) and adds the store's typical wait. */
|
|
33
|
+
export declare function status(dir?: string): Promise<StatusRow[]>;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export type Level = 'pass' | 'warn' | 'fail' | 'skip';
|
|
2
|
+
export interface Check {
|
|
3
|
+
id: string;
|
|
4
|
+
level: Level;
|
|
5
|
+
title: string;
|
|
6
|
+
/** What we found. */
|
|
7
|
+
detail?: string;
|
|
8
|
+
/** How to fix it, when it isn't a pass. */
|
|
9
|
+
fix?: string;
|
|
10
|
+
/** The stores this matters for; empty means all. */
|
|
11
|
+
stores?: StoreId[];
|
|
12
|
+
}
|
|
13
|
+
export type StoreId = 'mcp-registry' | 'chatgpt' | 'claude-connectors' | 'claude-plugins' | 'cursor' | 'grok' | 'docker' | 'muse' | 'smithery' | 'glama' | 'cline' | 'lobehub' | 'awesome-mcp-servers' | 'awesome-remote-mcp-servers';
|
|
14
|
+
export declare const STORE_NAMES: Record<StoreId, string>;
|
|
15
|
+
export interface Manifest {
|
|
16
|
+
$schema?: string;
|
|
17
|
+
name: string;
|
|
18
|
+
title: string;
|
|
19
|
+
subtitle?: string;
|
|
20
|
+
oneLiner?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
category?: string;
|
|
23
|
+
server: {
|
|
24
|
+
url: string;
|
|
25
|
+
auth?: 'none' | 'oauth';
|
|
26
|
+
};
|
|
27
|
+
repository?: string;
|
|
28
|
+
author?: {
|
|
29
|
+
name: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
};
|
|
32
|
+
links?: {
|
|
33
|
+
website?: string;
|
|
34
|
+
support?: string;
|
|
35
|
+
privacy?: string;
|
|
36
|
+
terms?: string;
|
|
37
|
+
docs?: string;
|
|
38
|
+
};
|
|
39
|
+
icon?: string;
|
|
40
|
+
prompts?: string[];
|
|
41
|
+
stores?: StoreId[];
|
|
42
|
+
/** Review test cases: ChatGPT wants exactly 5 positive and 3 negative. */
|
|
43
|
+
tests?: {
|
|
44
|
+
positive?: {
|
|
45
|
+
scenario: string;
|
|
46
|
+
prompt: string;
|
|
47
|
+
tools: string[];
|
|
48
|
+
expected: string;
|
|
49
|
+
}[];
|
|
50
|
+
negative?: {
|
|
51
|
+
scenario: string;
|
|
52
|
+
prompt: string;
|
|
53
|
+
}[];
|
|
54
|
+
};
|
|
55
|
+
/** Hand-written ChatGPT hint justifications, per tool; they replace mcplane's drafts. */
|
|
56
|
+
justifications?: Record<string, {
|
|
57
|
+
readOnly?: string;
|
|
58
|
+
openWorld?: string;
|
|
59
|
+
destructive?: string;
|
|
60
|
+
}>;
|
|
61
|
+
/** Your server's version, for the MCP Registry and your own records. */
|
|
62
|
+
version?: string;
|
|
63
|
+
/** MCP Registry overrides: reverse-DNS name (io.github.<owner>/<name> by default), description (100 max), file path. */
|
|
64
|
+
registry?: {
|
|
65
|
+
name?: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
file?: string;
|
|
68
|
+
};
|
|
69
|
+
/** Grok marketplace entry overrides. */
|
|
70
|
+
grok?: {
|
|
71
|
+
description?: string;
|
|
72
|
+
category?: string;
|
|
73
|
+
keywords?: string[];
|
|
74
|
+
domains?: string[];
|
|
75
|
+
};
|
|
76
|
+
/** Named workflows, run with "mcplane <lane>": each step is a command line without "mcplane". */
|
|
77
|
+
lanes?: Record<string, string[]>;
|
|
78
|
+
/** How reviewers get in, for servers behind sign-in. Never put the password here; say where it lives. */
|
|
79
|
+
reviewerAccess?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface Tool {
|
|
82
|
+
name: string;
|
|
83
|
+
title?: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
inputSchema?: {
|
|
86
|
+
properties?: Record<string, unknown>;
|
|
87
|
+
required?: string[];
|
|
88
|
+
};
|
|
89
|
+
outputSchema?: unknown;
|
|
90
|
+
annotations?: {
|
|
91
|
+
title?: string;
|
|
92
|
+
readOnlyHint?: boolean;
|
|
93
|
+
destructiveHint?: boolean;
|
|
94
|
+
idempotentHint?: boolean;
|
|
95
|
+
openWorldHint?: boolean;
|
|
96
|
+
};
|
|
97
|
+
}
|
package/dist/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION = "0.3.0";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = '0.
|
|
1
|
+
export const VERSION = '0.3.0';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcplane",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "fastlane for MCP servers: preflight against every store's rejection causes, publish where you can, prepare the rest, track every review.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -52,5 +52,13 @@
|
|
|
52
52
|
"url": "https://github.com/stevysmith/mcplane/issues"
|
|
53
53
|
},
|
|
54
54
|
"author": "Steve Smith",
|
|
55
|
-
"mcpName": "io.github.stevysmith/mcplane"
|
|
55
|
+
"mcpName": "io.github.stevysmith/mcplane",
|
|
56
|
+
"exports": {
|
|
57
|
+
"./core": {
|
|
58
|
+
"types": "./dist/core.d.ts",
|
|
59
|
+
"default": "./dist/core.js"
|
|
60
|
+
},
|
|
61
|
+
"./schema.json": "./schema.json",
|
|
62
|
+
"./package.json": "./package.json"
|
|
63
|
+
}
|
|
56
64
|
}
|