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.
@@ -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
- jsonb_data: 'The JSON data containing the mirror configuration (tools, resources, etc.)',
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
- jsonb_data: z.union([z.record(z.unknown()), z.string()]).describe(PARAM_DESCRIPTIONS.jsonb_data),
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": "@modelcontextprotocol/server-filesystem",
26
- "version": "1.0.0",
27
- "jsonb_data": {
28
- "name": "Filesystem Server",
29
- "description": "Access local filesystem",
30
- "tools": [{"name": "read_file", "description": "Read a file"}]
31
- },
32
- "mcp_server_id": 456
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
- jsonb_data: {
48
+ server_json: {
45
49
  oneOf: [{ type: 'object' }, { type: 'string' }],
46
- description: PARAM_DESCRIPTIONS.jsonb_data,
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', 'jsonb_data'],
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: typeof validatedArgs.jsonb_data === 'string'
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 updated:**\n`;
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
- jsonb_data: 'Updated JSON data containing the mirror configuration',
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
- jsonb_data: z
15
+ server_json: z
16
16
  .union([z.record(z.unknown()), z.string()])
17
17
  .optional()
18
- .describe(PARAM_DESCRIPTIONS.jsonb_data),
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
- Example request:
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
- - Modify the JSON configuration data
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
- jsonb_data: {
59
+ server_json: {
47
60
  oneOf: [{ type: 'object' }, { type: 'string' }],
48
- description: PARAM_DESCRIPTIONS.jsonb_data,
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, jsonb_data, ...rest } = validatedArgs;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulsemcp-cms-admin-mcp-server",
3
- "version": "0.6.5",
3
+ "version": "0.6.7",
4
4
  "description": "Local implementation of PulseMCP CMS Admin MCP server",
5
5
  "mcpName": "com.pulsemcp.servers/pulsemcp-cms-admin",
6
6
  "main": "build/index.js",
@@ -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
- jsonb_data: {
17
+ server_json: {
18
18
  oneOf: {
19
19
  type: string;
20
20
  }[];
21
- description: "The JSON data containing the mirror configuration (tools, resources, etc.)";
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
- jsonb_data: 'The JSON data containing the mirror configuration (tools, resources, etc.)',
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
- jsonb_data: z.union([z.record(z.unknown()), z.string()]).describe(PARAM_DESCRIPTIONS.jsonb_data),
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": "@modelcontextprotocol/server-filesystem",
26
- "version": "1.0.0",
27
- "jsonb_data": {
28
- "name": "Filesystem Server",
29
- "description": "Access local filesystem",
30
- "tools": [{"name": "read_file", "description": "Read a file"}]
31
- },
32
- "mcp_server_id": 456
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
- jsonb_data: {
48
+ server_json: {
45
49
  oneOf: [{ type: 'object' }, { type: 'string' }],
46
- description: PARAM_DESCRIPTIONS.jsonb_data,
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', 'jsonb_data'],
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: typeof validatedArgs.jsonb_data === 'string'
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 updated:**\n`;
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
- jsonb_data: {
21
+ server_json: {
22
22
  oneOf: {
23
23
  type: string;
24
24
  }[];
25
- description: "Updated JSON data containing the mirror configuration";
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
- jsonb_data: 'Updated JSON data containing the mirror configuration',
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
- jsonb_data: z
15
+ server_json: z
16
16
  .union([z.record(z.unknown()), z.string()])
17
17
  .optional()
18
- .describe(PARAM_DESCRIPTIONS.jsonb_data),
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
- Example request:
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
- - Modify the JSON configuration data
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
- jsonb_data: {
59
+ server_json: {
47
60
  oneOf: [{ type: 'object' }, { type: 'string' }],
48
- description: PARAM_DESCRIPTIONS.jsonb_data,
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, jsonb_data, ...rest } = validatedArgs;
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[];