pulsemcp-cms-admin-mcp-server 0.6.5 → 0.6.7
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/build/shared/src/tools/create-unofficial-mirror.js +23 -16
- package/build/shared/src/tools/get-mcp-server.js +2 -2
- package/build/shared/src/tools/update-mcp-server.js +4 -1
- package/build/shared/src/tools/update-unofficial-mirror.js +28 -13
- package/package.json +1 -1
- package/shared/tools/create-unofficial-mirror.d.ts +2 -2
- package/shared/tools/create-unofficial-mirror.js +23 -16
- package/shared/tools/get-mcp-server.js +2 -2
- package/shared/tools/update-mcp-server.js +4 -1
- package/shared/tools/update-unofficial-mirror.d.ts +2 -2
- package/shared/tools/update-unofficial-mirror.js +28 -13
- package/shared/types.d.ts +4 -0
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
const PARAM_DESCRIPTIONS = {
|
|
3
3
|
name: 'The name of the unofficial mirror (e.g., "@modelcontextprotocol/server-filesystem")',
|
|
4
4
|
version: 'The version of the mirror (e.g., "1.0.0")',
|
|
5
|
-
|
|
5
|
+
server_json: 'The server.json content to store. This will be automatically wrapped in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.',
|
|
6
6
|
mcp_server_id: 'Optional ID of the MCP server to link this mirror to',
|
|
7
7
|
previous_name: 'Optional previous name if this mirror was renamed',
|
|
8
8
|
next_name: 'Optional next name if this mirror will be renamed',
|
|
@@ -10,7 +10,9 @@ const PARAM_DESCRIPTIONS = {
|
|
|
10
10
|
const CreateUnofficialMirrorSchema = z.object({
|
|
11
11
|
name: z.string().describe(PARAM_DESCRIPTIONS.name),
|
|
12
12
|
version: z.string().describe(PARAM_DESCRIPTIONS.version),
|
|
13
|
-
|
|
13
|
+
server_json: z
|
|
14
|
+
.union([z.record(z.unknown()), z.string()])
|
|
15
|
+
.describe(PARAM_DESCRIPTIONS.server_json),
|
|
14
16
|
mcp_server_id: z.number().optional().describe(PARAM_DESCRIPTIONS.mcp_server_id),
|
|
15
17
|
previous_name: z.string().optional().describe(PARAM_DESCRIPTIONS.previous_name),
|
|
16
18
|
next_name: z.string().optional().describe(PARAM_DESCRIPTIONS.next_name),
|
|
@@ -20,16 +22,18 @@ export function createUnofficialMirror(_server, clientFactory) {
|
|
|
20
22
|
name: 'create_unofficial_mirror',
|
|
21
23
|
description: `Create a new unofficial mirror entry. Unofficial mirrors represent community-submitted MCP server definitions.
|
|
22
24
|
|
|
25
|
+
The server_json parameter accepts server.json content directly and automatically wraps it in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.
|
|
26
|
+
|
|
23
27
|
Example request:
|
|
24
28
|
{
|
|
25
|
-
"name": "
|
|
26
|
-
"version": "
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
"name": "com.pulsemcp.mirror/example",
|
|
30
|
+
"version": "0.0.1",
|
|
31
|
+
"server_json": {
|
|
32
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
33
|
+
"name": "com.pulsemcp.mirror/example",
|
|
34
|
+
"title": "Example Server",
|
|
35
|
+
"version": "0.0.1"
|
|
36
|
+
}
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
Use cases:
|
|
@@ -41,26 +45,29 @@ Use cases:
|
|
|
41
45
|
properties: {
|
|
42
46
|
name: { type: 'string', description: PARAM_DESCRIPTIONS.name },
|
|
43
47
|
version: { type: 'string', description: PARAM_DESCRIPTIONS.version },
|
|
44
|
-
|
|
48
|
+
server_json: {
|
|
45
49
|
oneOf: [{ type: 'object' }, { type: 'string' }],
|
|
46
|
-
description: PARAM_DESCRIPTIONS.
|
|
50
|
+
description: PARAM_DESCRIPTIONS.server_json,
|
|
47
51
|
},
|
|
48
52
|
mcp_server_id: { type: 'number', description: PARAM_DESCRIPTIONS.mcp_server_id },
|
|
49
53
|
previous_name: { type: 'string', description: PARAM_DESCRIPTIONS.previous_name },
|
|
50
54
|
next_name: { type: 'string', description: PARAM_DESCRIPTIONS.next_name },
|
|
51
55
|
},
|
|
52
|
-
required: ['name', 'version', '
|
|
56
|
+
required: ['name', 'version', 'server_json'],
|
|
53
57
|
},
|
|
54
58
|
handler: async (args) => {
|
|
55
59
|
const validatedArgs = CreateUnofficialMirrorSchema.parse(args);
|
|
56
60
|
const client = clientFactory();
|
|
57
61
|
try {
|
|
62
|
+
// Wrap server_json in { "server": ... } envelope
|
|
63
|
+
const serverContent = typeof validatedArgs.server_json === 'string'
|
|
64
|
+
? JSON.parse(validatedArgs.server_json)
|
|
65
|
+
: validatedArgs.server_json;
|
|
66
|
+
const jsonb_data = { server: serverContent };
|
|
58
67
|
const mirror = await client.createUnofficialMirror({
|
|
59
68
|
name: validatedArgs.name,
|
|
60
69
|
version: validatedArgs.version,
|
|
61
|
-
jsonb_data
|
|
62
|
-
? JSON.parse(validatedArgs.jsonb_data)
|
|
63
|
-
: validatedArgs.jsonb_data,
|
|
70
|
+
jsonb_data,
|
|
64
71
|
mcp_server_id: validatedArgs.mcp_server_id,
|
|
65
72
|
previous_name: validatedArgs.previous_name,
|
|
66
73
|
next_name: validatedArgs.next_name,
|
|
@@ -99,8 +99,8 @@ Example response:
|
|
|
99
99
|
}
|
|
100
100
|
content += '\n';
|
|
101
101
|
}
|
|
102
|
-
if (server.recommended) {
|
|
103
|
-
content += `**Recommended:** Yes\n`;
|
|
102
|
+
if (server.recommended !== undefined) {
|
|
103
|
+
content += `**Recommended:** ${server.recommended ? 'Yes' : 'No'}\n`;
|
|
104
104
|
}
|
|
105
105
|
if (server.short_description) {
|
|
106
106
|
content += `\n**Short Description:**\n${server.short_description}\n`;
|
|
@@ -315,10 +315,13 @@ Create new provider:
|
|
|
315
315
|
if (server.remotes && server.remotes.length > 0) {
|
|
316
316
|
content += `**Remote Endpoints:** ${server.remotes.length}\n`;
|
|
317
317
|
}
|
|
318
|
+
if (server.recommended !== undefined) {
|
|
319
|
+
content += `**Recommended:** ${server.recommended ? 'Yes' : 'No'}\n`;
|
|
320
|
+
}
|
|
318
321
|
if (server.updated_at) {
|
|
319
322
|
content += `**Updated:** ${server.updated_at}\n`;
|
|
320
323
|
}
|
|
321
|
-
content += `\n**Fields
|
|
324
|
+
content += `\n**Fields provided:**\n`;
|
|
322
325
|
Object.keys(updateParams).forEach((field) => {
|
|
323
326
|
content += `- ${field}\n`;
|
|
324
327
|
});
|
|
@@ -3,7 +3,7 @@ const PARAM_DESCRIPTIONS = {
|
|
|
3
3
|
id: 'The ID of the unofficial mirror to update',
|
|
4
4
|
name: 'Updated name of the unofficial mirror',
|
|
5
5
|
version: 'Updated version of the mirror',
|
|
6
|
-
|
|
6
|
+
server_json: 'Updated server.json content. This will be automatically wrapped in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.',
|
|
7
7
|
mcp_server_id: 'ID of the MCP server to link (set to null to unlink)',
|
|
8
8
|
previous_name: 'Updated previous name (set to null to clear)',
|
|
9
9
|
next_name: 'Updated next name (set to null to clear)',
|
|
@@ -12,10 +12,10 @@ const UpdateUnofficialMirrorSchema = z.object({
|
|
|
12
12
|
id: z.number().describe(PARAM_DESCRIPTIONS.id),
|
|
13
13
|
name: z.string().optional().describe(PARAM_DESCRIPTIONS.name),
|
|
14
14
|
version: z.string().optional().describe(PARAM_DESCRIPTIONS.version),
|
|
15
|
-
|
|
15
|
+
server_json: z
|
|
16
16
|
.union([z.record(z.unknown()), z.string()])
|
|
17
17
|
.optional()
|
|
18
|
-
.describe(PARAM_DESCRIPTIONS.
|
|
18
|
+
.describe(PARAM_DESCRIPTIONS.server_json),
|
|
19
19
|
mcp_server_id: z.number().nullable().optional().describe(PARAM_DESCRIPTIONS.mcp_server_id),
|
|
20
20
|
previous_name: z.string().nullable().optional().describe(PARAM_DESCRIPTIONS.previous_name),
|
|
21
21
|
next_name: z.string().nullable().optional().describe(PARAM_DESCRIPTIONS.next_name),
|
|
@@ -25,7 +25,20 @@ export function updateUnofficialMirror(_server, clientFactory) {
|
|
|
25
25
|
name: 'update_unofficial_mirror',
|
|
26
26
|
description: `Update an existing unofficial mirror by its ID. Only provided fields will be updated.
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
The server_json parameter accepts server.json content directly and automatically wraps it in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.
|
|
29
|
+
|
|
30
|
+
Example request updating server_json:
|
|
31
|
+
{
|
|
32
|
+
"id": 123,
|
|
33
|
+
"server_json": {
|
|
34
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
35
|
+
"name": "com.pulsemcp.mirror/example",
|
|
36
|
+
"title": "Example Server",
|
|
37
|
+
"version": "0.0.2"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Example request updating other fields:
|
|
29
42
|
{
|
|
30
43
|
"id": 123,
|
|
31
44
|
"version": "1.1.0",
|
|
@@ -35,7 +48,7 @@ Example request:
|
|
|
35
48
|
Use cases:
|
|
36
49
|
- Link an unofficial mirror to an MCP server
|
|
37
50
|
- Update the version or name of a mirror
|
|
38
|
-
-
|
|
51
|
+
- Update the server.json configuration data
|
|
39
52
|
- Unlink a mirror from an MCP server (set mcp_server_id to null)`,
|
|
40
53
|
inputSchema: {
|
|
41
54
|
type: 'object',
|
|
@@ -43,9 +56,9 @@ Use cases:
|
|
|
43
56
|
id: { type: 'number', description: PARAM_DESCRIPTIONS.id },
|
|
44
57
|
name: { type: 'string', description: PARAM_DESCRIPTIONS.name },
|
|
45
58
|
version: { type: 'string', description: PARAM_DESCRIPTIONS.version },
|
|
46
|
-
|
|
59
|
+
server_json: {
|
|
47
60
|
oneOf: [{ type: 'object' }, { type: 'string' }],
|
|
48
|
-
description: PARAM_DESCRIPTIONS.
|
|
61
|
+
description: PARAM_DESCRIPTIONS.server_json,
|
|
49
62
|
},
|
|
50
63
|
mcp_server_id: { type: ['number', 'null'], description: PARAM_DESCRIPTIONS.mcp_server_id },
|
|
51
64
|
previous_name: { type: ['string', 'null'], description: PARAM_DESCRIPTIONS.previous_name },
|
|
@@ -57,14 +70,16 @@ Use cases:
|
|
|
57
70
|
const validatedArgs = UpdateUnofficialMirrorSchema.parse(args);
|
|
58
71
|
const client = clientFactory();
|
|
59
72
|
try {
|
|
60
|
-
const { id,
|
|
73
|
+
const { id, server_json, ...rest } = validatedArgs;
|
|
74
|
+
// If server_json provided, wrap it in { "server": ... } envelope
|
|
75
|
+
let jsonb_data;
|
|
76
|
+
if (server_json !== undefined) {
|
|
77
|
+
const serverContent = typeof server_json === 'string' ? JSON.parse(server_json) : server_json;
|
|
78
|
+
jsonb_data = { server: serverContent };
|
|
79
|
+
}
|
|
61
80
|
const params = {
|
|
62
81
|
...rest,
|
|
63
|
-
...(jsonb_data !== undefined
|
|
64
|
-
? {
|
|
65
|
-
jsonb_data: typeof jsonb_data === 'string' ? JSON.parse(jsonb_data) : jsonb_data,
|
|
66
|
-
}
|
|
67
|
-
: {}),
|
|
82
|
+
...(jsonb_data !== undefined ? { jsonb_data } : {}),
|
|
68
83
|
};
|
|
69
84
|
if (Object.keys(params).length === 0) {
|
|
70
85
|
return {
|
package/package.json
CHANGED
|
@@ -14,11 +14,11 @@ export declare function createUnofficialMirror(_server: Server, clientFactory: C
|
|
|
14
14
|
type: string;
|
|
15
15
|
description: "The version of the mirror (e.g., \"1.0.0\")";
|
|
16
16
|
};
|
|
17
|
-
|
|
17
|
+
server_json: {
|
|
18
18
|
oneOf: {
|
|
19
19
|
type: string;
|
|
20
20
|
}[];
|
|
21
|
-
description: "The
|
|
21
|
+
description: "The server.json content to store. This will be automatically wrapped in a { \"server\": ... } envelope as required by the PulseMCP Sub-Registry API.";
|
|
22
22
|
};
|
|
23
23
|
mcp_server_id: {
|
|
24
24
|
type: string;
|
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
const PARAM_DESCRIPTIONS = {
|
|
3
3
|
name: 'The name of the unofficial mirror (e.g., "@modelcontextprotocol/server-filesystem")',
|
|
4
4
|
version: 'The version of the mirror (e.g., "1.0.0")',
|
|
5
|
-
|
|
5
|
+
server_json: 'The server.json content to store. This will be automatically wrapped in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.',
|
|
6
6
|
mcp_server_id: 'Optional ID of the MCP server to link this mirror to',
|
|
7
7
|
previous_name: 'Optional previous name if this mirror was renamed',
|
|
8
8
|
next_name: 'Optional next name if this mirror will be renamed',
|
|
@@ -10,7 +10,9 @@ const PARAM_DESCRIPTIONS = {
|
|
|
10
10
|
const CreateUnofficialMirrorSchema = z.object({
|
|
11
11
|
name: z.string().describe(PARAM_DESCRIPTIONS.name),
|
|
12
12
|
version: z.string().describe(PARAM_DESCRIPTIONS.version),
|
|
13
|
-
|
|
13
|
+
server_json: z
|
|
14
|
+
.union([z.record(z.unknown()), z.string()])
|
|
15
|
+
.describe(PARAM_DESCRIPTIONS.server_json),
|
|
14
16
|
mcp_server_id: z.number().optional().describe(PARAM_DESCRIPTIONS.mcp_server_id),
|
|
15
17
|
previous_name: z.string().optional().describe(PARAM_DESCRIPTIONS.previous_name),
|
|
16
18
|
next_name: z.string().optional().describe(PARAM_DESCRIPTIONS.next_name),
|
|
@@ -20,16 +22,18 @@ export function createUnofficialMirror(_server, clientFactory) {
|
|
|
20
22
|
name: 'create_unofficial_mirror',
|
|
21
23
|
description: `Create a new unofficial mirror entry. Unofficial mirrors represent community-submitted MCP server definitions.
|
|
22
24
|
|
|
25
|
+
The server_json parameter accepts server.json content directly and automatically wraps it in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.
|
|
26
|
+
|
|
23
27
|
Example request:
|
|
24
28
|
{
|
|
25
|
-
"name": "
|
|
26
|
-
"version": "
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
"name": "com.pulsemcp.mirror/example",
|
|
30
|
+
"version": "0.0.1",
|
|
31
|
+
"server_json": {
|
|
32
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
33
|
+
"name": "com.pulsemcp.mirror/example",
|
|
34
|
+
"title": "Example Server",
|
|
35
|
+
"version": "0.0.1"
|
|
36
|
+
}
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
Use cases:
|
|
@@ -41,26 +45,29 @@ Use cases:
|
|
|
41
45
|
properties: {
|
|
42
46
|
name: { type: 'string', description: PARAM_DESCRIPTIONS.name },
|
|
43
47
|
version: { type: 'string', description: PARAM_DESCRIPTIONS.version },
|
|
44
|
-
|
|
48
|
+
server_json: {
|
|
45
49
|
oneOf: [{ type: 'object' }, { type: 'string' }],
|
|
46
|
-
description: PARAM_DESCRIPTIONS.
|
|
50
|
+
description: PARAM_DESCRIPTIONS.server_json,
|
|
47
51
|
},
|
|
48
52
|
mcp_server_id: { type: 'number', description: PARAM_DESCRIPTIONS.mcp_server_id },
|
|
49
53
|
previous_name: { type: 'string', description: PARAM_DESCRIPTIONS.previous_name },
|
|
50
54
|
next_name: { type: 'string', description: PARAM_DESCRIPTIONS.next_name },
|
|
51
55
|
},
|
|
52
|
-
required: ['name', 'version', '
|
|
56
|
+
required: ['name', 'version', 'server_json'],
|
|
53
57
|
},
|
|
54
58
|
handler: async (args) => {
|
|
55
59
|
const validatedArgs = CreateUnofficialMirrorSchema.parse(args);
|
|
56
60
|
const client = clientFactory();
|
|
57
61
|
try {
|
|
62
|
+
// Wrap server_json in { "server": ... } envelope
|
|
63
|
+
const serverContent = typeof validatedArgs.server_json === 'string'
|
|
64
|
+
? JSON.parse(validatedArgs.server_json)
|
|
65
|
+
: validatedArgs.server_json;
|
|
66
|
+
const jsonb_data = { server: serverContent };
|
|
58
67
|
const mirror = await client.createUnofficialMirror({
|
|
59
68
|
name: validatedArgs.name,
|
|
60
69
|
version: validatedArgs.version,
|
|
61
|
-
jsonb_data
|
|
62
|
-
? JSON.parse(validatedArgs.jsonb_data)
|
|
63
|
-
: validatedArgs.jsonb_data,
|
|
70
|
+
jsonb_data,
|
|
64
71
|
mcp_server_id: validatedArgs.mcp_server_id,
|
|
65
72
|
previous_name: validatedArgs.previous_name,
|
|
66
73
|
next_name: validatedArgs.next_name,
|
|
@@ -99,8 +99,8 @@ Example response:
|
|
|
99
99
|
}
|
|
100
100
|
content += '\n';
|
|
101
101
|
}
|
|
102
|
-
if (server.recommended) {
|
|
103
|
-
content += `**Recommended:** Yes\n`;
|
|
102
|
+
if (server.recommended !== undefined) {
|
|
103
|
+
content += `**Recommended:** ${server.recommended ? 'Yes' : 'No'}\n`;
|
|
104
104
|
}
|
|
105
105
|
if (server.short_description) {
|
|
106
106
|
content += `\n**Short Description:**\n${server.short_description}\n`;
|
|
@@ -315,10 +315,13 @@ Create new provider:
|
|
|
315
315
|
if (server.remotes && server.remotes.length > 0) {
|
|
316
316
|
content += `**Remote Endpoints:** ${server.remotes.length}\n`;
|
|
317
317
|
}
|
|
318
|
+
if (server.recommended !== undefined) {
|
|
319
|
+
content += `**Recommended:** ${server.recommended ? 'Yes' : 'No'}\n`;
|
|
320
|
+
}
|
|
318
321
|
if (server.updated_at) {
|
|
319
322
|
content += `**Updated:** ${server.updated_at}\n`;
|
|
320
323
|
}
|
|
321
|
-
content += `\n**Fields
|
|
324
|
+
content += `\n**Fields provided:**\n`;
|
|
322
325
|
Object.keys(updateParams).forEach((field) => {
|
|
323
326
|
content += `- ${field}\n`;
|
|
324
327
|
});
|
|
@@ -18,11 +18,11 @@ export declare function updateUnofficialMirror(_server: Server, clientFactory: C
|
|
|
18
18
|
type: string;
|
|
19
19
|
description: "Updated version of the mirror";
|
|
20
20
|
};
|
|
21
|
-
|
|
21
|
+
server_json: {
|
|
22
22
|
oneOf: {
|
|
23
23
|
type: string;
|
|
24
24
|
}[];
|
|
25
|
-
description: "Updated
|
|
25
|
+
description: "Updated server.json content. This will be automatically wrapped in a { \"server\": ... } envelope as required by the PulseMCP Sub-Registry API.";
|
|
26
26
|
};
|
|
27
27
|
mcp_server_id: {
|
|
28
28
|
type: string[];
|
|
@@ -3,7 +3,7 @@ const PARAM_DESCRIPTIONS = {
|
|
|
3
3
|
id: 'The ID of the unofficial mirror to update',
|
|
4
4
|
name: 'Updated name of the unofficial mirror',
|
|
5
5
|
version: 'Updated version of the mirror',
|
|
6
|
-
|
|
6
|
+
server_json: 'Updated server.json content. This will be automatically wrapped in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.',
|
|
7
7
|
mcp_server_id: 'ID of the MCP server to link (set to null to unlink)',
|
|
8
8
|
previous_name: 'Updated previous name (set to null to clear)',
|
|
9
9
|
next_name: 'Updated next name (set to null to clear)',
|
|
@@ -12,10 +12,10 @@ const UpdateUnofficialMirrorSchema = z.object({
|
|
|
12
12
|
id: z.number().describe(PARAM_DESCRIPTIONS.id),
|
|
13
13
|
name: z.string().optional().describe(PARAM_DESCRIPTIONS.name),
|
|
14
14
|
version: z.string().optional().describe(PARAM_DESCRIPTIONS.version),
|
|
15
|
-
|
|
15
|
+
server_json: z
|
|
16
16
|
.union([z.record(z.unknown()), z.string()])
|
|
17
17
|
.optional()
|
|
18
|
-
.describe(PARAM_DESCRIPTIONS.
|
|
18
|
+
.describe(PARAM_DESCRIPTIONS.server_json),
|
|
19
19
|
mcp_server_id: z.number().nullable().optional().describe(PARAM_DESCRIPTIONS.mcp_server_id),
|
|
20
20
|
previous_name: z.string().nullable().optional().describe(PARAM_DESCRIPTIONS.previous_name),
|
|
21
21
|
next_name: z.string().nullable().optional().describe(PARAM_DESCRIPTIONS.next_name),
|
|
@@ -25,7 +25,20 @@ export function updateUnofficialMirror(_server, clientFactory) {
|
|
|
25
25
|
name: 'update_unofficial_mirror',
|
|
26
26
|
description: `Update an existing unofficial mirror by its ID. Only provided fields will be updated.
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
The server_json parameter accepts server.json content directly and automatically wraps it in a { "server": ... } envelope as required by the PulseMCP Sub-Registry API.
|
|
29
|
+
|
|
30
|
+
Example request updating server_json:
|
|
31
|
+
{
|
|
32
|
+
"id": 123,
|
|
33
|
+
"server_json": {
|
|
34
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
35
|
+
"name": "com.pulsemcp.mirror/example",
|
|
36
|
+
"title": "Example Server",
|
|
37
|
+
"version": "0.0.2"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Example request updating other fields:
|
|
29
42
|
{
|
|
30
43
|
"id": 123,
|
|
31
44
|
"version": "1.1.0",
|
|
@@ -35,7 +48,7 @@ Example request:
|
|
|
35
48
|
Use cases:
|
|
36
49
|
- Link an unofficial mirror to an MCP server
|
|
37
50
|
- Update the version or name of a mirror
|
|
38
|
-
-
|
|
51
|
+
- Update the server.json configuration data
|
|
39
52
|
- Unlink a mirror from an MCP server (set mcp_server_id to null)`,
|
|
40
53
|
inputSchema: {
|
|
41
54
|
type: 'object',
|
|
@@ -43,9 +56,9 @@ Use cases:
|
|
|
43
56
|
id: { type: 'number', description: PARAM_DESCRIPTIONS.id },
|
|
44
57
|
name: { type: 'string', description: PARAM_DESCRIPTIONS.name },
|
|
45
58
|
version: { type: 'string', description: PARAM_DESCRIPTIONS.version },
|
|
46
|
-
|
|
59
|
+
server_json: {
|
|
47
60
|
oneOf: [{ type: 'object' }, { type: 'string' }],
|
|
48
|
-
description: PARAM_DESCRIPTIONS.
|
|
61
|
+
description: PARAM_DESCRIPTIONS.server_json,
|
|
49
62
|
},
|
|
50
63
|
mcp_server_id: { type: ['number', 'null'], description: PARAM_DESCRIPTIONS.mcp_server_id },
|
|
51
64
|
previous_name: { type: ['string', 'null'], description: PARAM_DESCRIPTIONS.previous_name },
|
|
@@ -57,14 +70,16 @@ Use cases:
|
|
|
57
70
|
const validatedArgs = UpdateUnofficialMirrorSchema.parse(args);
|
|
58
71
|
const client = clientFactory();
|
|
59
72
|
try {
|
|
60
|
-
const { id,
|
|
73
|
+
const { id, server_json, ...rest } = validatedArgs;
|
|
74
|
+
// If server_json provided, wrap it in { "server": ... } envelope
|
|
75
|
+
let jsonb_data;
|
|
76
|
+
if (server_json !== undefined) {
|
|
77
|
+
const serverContent = typeof server_json === 'string' ? JSON.parse(server_json) : server_json;
|
|
78
|
+
jsonb_data = { server: serverContent };
|
|
79
|
+
}
|
|
61
80
|
const params = {
|
|
62
81
|
...rest,
|
|
63
|
-
...(jsonb_data !== undefined
|
|
64
|
-
? {
|
|
65
|
-
jsonb_data: typeof jsonb_data === 'string' ? JSON.parse(jsonb_data) : jsonb_data,
|
|
66
|
-
}
|
|
67
|
-
: {}),
|
|
82
|
+
...(jsonb_data !== undefined ? { jsonb_data } : {}),
|
|
68
83
|
};
|
|
69
84
|
if (Object.keys(params).length === 0) {
|
|
70
85
|
return {
|
package/shared/types.d.ts
CHANGED
|
@@ -162,6 +162,10 @@ export interface MCPImplementation {
|
|
|
162
162
|
internal_notes?: string;
|
|
163
163
|
created_at?: string;
|
|
164
164
|
updated_at?: string;
|
|
165
|
+
created_on_override?: string;
|
|
166
|
+
recommended?: boolean;
|
|
167
|
+
package_registry?: string;
|
|
168
|
+
package_name?: string;
|
|
165
169
|
mcp_server?: MCPServer | null;
|
|
166
170
|
mcp_client?: MCPClient | null;
|
|
167
171
|
canonical?: CanonicalUrlParams[];
|