pulsemcp-cms-admin-mcp-server 0.9.13 → 0.9.15

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.
Files changed (168) hide show
  1. package/README.md +15 -8
  2. package/build/shared/src/pulsemcp-admin-client/lib/add-official-mirror-to-regular-queue.js +2 -1
  3. package/build/shared/src/pulsemcp-admin-client/lib/admin-fetch.js +33 -0
  4. package/build/shared/src/pulsemcp-admin-client/lib/approve-official-mirror-queue-item-without-modifying.js +2 -1
  5. package/build/shared/src/pulsemcp-admin-client/lib/approve-official-mirror-queue-item.js +2 -1
  6. package/build/shared/src/pulsemcp-admin-client/lib/cleanup-good-jobs.js +2 -1
  7. package/build/shared/src/pulsemcp-admin-client/lib/create-api-key.js +51 -0
  8. package/build/shared/src/pulsemcp-admin-client/lib/create-mcp-implementation.js +2 -1
  9. package/build/shared/src/pulsemcp-admin-client/lib/create-mcp-json.js +2 -1
  10. package/build/shared/src/pulsemcp-admin-client/lib/create-post.js +2 -1
  11. package/build/shared/src/pulsemcp-admin-client/lib/create-redirect.js +2 -1
  12. package/build/shared/src/pulsemcp-admin-client/lib/create-tenant.js +35 -0
  13. package/build/shared/src/pulsemcp-admin-client/lib/create-unofficial-mirror.js +2 -1
  14. package/build/shared/src/pulsemcp-admin-client/lib/delete-mcp-json.js +2 -1
  15. package/build/shared/src/pulsemcp-admin-client/lib/delete-redirect.js +2 -1
  16. package/build/shared/src/pulsemcp-admin-client/lib/delete-unofficial-mirror.js +2 -1
  17. package/build/shared/src/pulsemcp-admin-client/lib/discard-good-job.js +2 -1
  18. package/build/shared/src/pulsemcp-admin-client/lib/force-trigger-good-job-cron.js +2 -1
  19. package/build/shared/src/pulsemcp-admin-client/lib/get-author-by-id.js +2 -1
  20. package/build/shared/src/pulsemcp-admin-client/lib/get-author-by-slug.js +2 -1
  21. package/build/shared/src/pulsemcp-admin-client/lib/get-authors.js +2 -1
  22. package/build/shared/src/pulsemcp-admin-client/lib/get-discovered-url-stats.js +2 -1
  23. package/build/shared/src/pulsemcp-admin-client/lib/get-discovered-urls.js +2 -1
  24. package/build/shared/src/pulsemcp-admin-client/lib/get-draft-mcp-implementations.js +2 -1
  25. package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-cron-schedules.js +2 -1
  26. package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-processes.js +2 -1
  27. package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-statistics.js +2 -1
  28. package/build/shared/src/pulsemcp-admin-client/lib/get-good-job.js +2 -1
  29. package/build/shared/src/pulsemcp-admin-client/lib/get-good-jobs.js +2 -1
  30. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-client-by-id.js +2 -1
  31. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-client-by-slug.js +2 -1
  32. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-implementation-by-id.js +2 -1
  33. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-json.js +2 -1
  34. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-jsons.js +2 -1
  35. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-server-by-id.js +2 -1
  36. package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-server-by-slug.js +2 -1
  37. package/build/shared/src/pulsemcp-admin-client/lib/get-moz-backlinks.js +2 -1
  38. package/build/shared/src/pulsemcp-admin-client/lib/get-moz-metrics.js +2 -1
  39. package/build/shared/src/pulsemcp-admin-client/lib/get-moz-stored-metrics.js +2 -1
  40. package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror-queue-item.js +2 -1
  41. package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror-queue-items.js +2 -1
  42. package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror.js +2 -1
  43. package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirrors.js +2 -1
  44. package/build/shared/src/pulsemcp-admin-client/lib/get-post.js +2 -1
  45. package/build/shared/src/pulsemcp-admin-client/lib/get-posts.js +2 -1
  46. package/build/shared/src/pulsemcp-admin-client/lib/get-proctor-metadata.js +2 -1
  47. package/build/shared/src/pulsemcp-admin-client/lib/get-proctor-runs.js +2 -1
  48. package/build/shared/src/pulsemcp-admin-client/lib/get-provider-by-id.js +2 -1
  49. package/build/shared/src/pulsemcp-admin-client/lib/get-redirect.js +2 -1
  50. package/build/shared/src/pulsemcp-admin-client/lib/get-redirects.js +2 -1
  51. package/build/shared/src/pulsemcp-admin-client/lib/get-tenant.js +2 -1
  52. package/build/shared/src/pulsemcp-admin-client/lib/get-tenants.js +2 -1
  53. package/build/shared/src/pulsemcp-admin-client/lib/get-unified-mcp-server.js +3 -2
  54. package/build/shared/src/pulsemcp-admin-client/lib/get-unified-mcp-servers.js +2 -1
  55. package/build/shared/src/pulsemcp-admin-client/lib/get-unofficial-mirror.js +2 -1
  56. package/build/shared/src/pulsemcp-admin-client/lib/get-unofficial-mirrors.js +2 -1
  57. package/build/shared/src/pulsemcp-admin-client/lib/mark-discovered-url-processed.js +2 -1
  58. package/build/shared/src/pulsemcp-admin-client/lib/recache-mcp-server.js +24 -0
  59. package/build/shared/src/pulsemcp-admin-client/lib/reject-official-mirror-queue-item.js +2 -1
  60. package/build/shared/src/pulsemcp-admin-client/lib/reschedule-good-job.js +2 -1
  61. package/build/shared/src/pulsemcp-admin-client/lib/retry-good-job.js +2 -1
  62. package/build/shared/src/pulsemcp-admin-client/lib/run-exam-for-mirror.js +2 -1
  63. package/build/shared/src/pulsemcp-admin-client/lib/save-mcp-implementation.js +2 -1
  64. package/build/shared/src/pulsemcp-admin-client/lib/save-results-for-mirror.js +2 -1
  65. package/build/shared/src/pulsemcp-admin-client/lib/search-mcp-implementations.js +2 -1
  66. package/build/shared/src/pulsemcp-admin-client/lib/search-providers.js +2 -1
  67. package/build/shared/src/pulsemcp-admin-client/lib/send-email.js +2 -1
  68. package/build/shared/src/pulsemcp-admin-client/lib/unlink-official-mirror-queue-item.js +2 -1
  69. package/build/shared/src/pulsemcp-admin-client/lib/update-mcp-json.js +2 -1
  70. package/build/shared/src/pulsemcp-admin-client/lib/update-post.js +2 -1
  71. package/build/shared/src/pulsemcp-admin-client/lib/update-redirect.js +2 -1
  72. package/build/shared/src/pulsemcp-admin-client/lib/update-unofficial-mirror.js +2 -1
  73. package/build/shared/src/pulsemcp-admin-client/lib/upload-image.js +2 -1
  74. package/build/shared/src/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +27 -0
  75. package/build/shared/src/server.js +13 -1
  76. package/build/shared/src/tools/create-api-key.js +78 -0
  77. package/build/shared/src/tools/create-tenant.js +58 -0
  78. package/build/shared/src/tools/recache-mcp-server.js +49 -0
  79. package/build/shared/src/tools.js +13 -2
  80. package/package.json +2 -2
  81. package/shared/pulsemcp-admin-client/lib/add-official-mirror-to-regular-queue.js +2 -1
  82. package/shared/pulsemcp-admin-client/lib/admin-fetch.d.ts +6 -0
  83. package/shared/pulsemcp-admin-client/lib/admin-fetch.js +33 -0
  84. package/shared/pulsemcp-admin-client/lib/approve-official-mirror-queue-item-without-modifying.js +2 -1
  85. package/shared/pulsemcp-admin-client/lib/approve-official-mirror-queue-item.js +2 -1
  86. package/shared/pulsemcp-admin-client/lib/cleanup-good-jobs.js +2 -1
  87. package/shared/pulsemcp-admin-client/lib/create-api-key.d.ts +3 -0
  88. package/shared/pulsemcp-admin-client/lib/create-api-key.js +51 -0
  89. package/shared/pulsemcp-admin-client/lib/create-mcp-implementation.js +2 -1
  90. package/shared/pulsemcp-admin-client/lib/create-mcp-json.js +2 -1
  91. package/shared/pulsemcp-admin-client/lib/create-post.js +2 -1
  92. package/shared/pulsemcp-admin-client/lib/create-redirect.js +2 -1
  93. package/shared/pulsemcp-admin-client/lib/create-tenant.d.ts +3 -0
  94. package/shared/pulsemcp-admin-client/lib/create-tenant.js +35 -0
  95. package/shared/pulsemcp-admin-client/lib/create-unofficial-mirror.js +2 -1
  96. package/shared/pulsemcp-admin-client/lib/delete-mcp-json.js +2 -1
  97. package/shared/pulsemcp-admin-client/lib/delete-redirect.js +2 -1
  98. package/shared/pulsemcp-admin-client/lib/delete-unofficial-mirror.js +2 -1
  99. package/shared/pulsemcp-admin-client/lib/discard-good-job.js +2 -1
  100. package/shared/pulsemcp-admin-client/lib/force-trigger-good-job-cron.js +2 -1
  101. package/shared/pulsemcp-admin-client/lib/get-author-by-id.js +2 -1
  102. package/shared/pulsemcp-admin-client/lib/get-author-by-slug.js +2 -1
  103. package/shared/pulsemcp-admin-client/lib/get-authors.js +2 -1
  104. package/shared/pulsemcp-admin-client/lib/get-discovered-url-stats.js +2 -1
  105. package/shared/pulsemcp-admin-client/lib/get-discovered-urls.js +2 -1
  106. package/shared/pulsemcp-admin-client/lib/get-draft-mcp-implementations.js +2 -1
  107. package/shared/pulsemcp-admin-client/lib/get-good-job-cron-schedules.js +2 -1
  108. package/shared/pulsemcp-admin-client/lib/get-good-job-processes.js +2 -1
  109. package/shared/pulsemcp-admin-client/lib/get-good-job-statistics.js +2 -1
  110. package/shared/pulsemcp-admin-client/lib/get-good-job.js +2 -1
  111. package/shared/pulsemcp-admin-client/lib/get-good-jobs.js +2 -1
  112. package/shared/pulsemcp-admin-client/lib/get-mcp-client-by-id.js +2 -1
  113. package/shared/pulsemcp-admin-client/lib/get-mcp-client-by-slug.js +2 -1
  114. package/shared/pulsemcp-admin-client/lib/get-mcp-implementation-by-id.js +2 -1
  115. package/shared/pulsemcp-admin-client/lib/get-mcp-json.js +2 -1
  116. package/shared/pulsemcp-admin-client/lib/get-mcp-jsons.js +2 -1
  117. package/shared/pulsemcp-admin-client/lib/get-mcp-server-by-id.js +2 -1
  118. package/shared/pulsemcp-admin-client/lib/get-mcp-server-by-slug.js +2 -1
  119. package/shared/pulsemcp-admin-client/lib/get-moz-backlinks.js +2 -1
  120. package/shared/pulsemcp-admin-client/lib/get-moz-metrics.js +2 -1
  121. package/shared/pulsemcp-admin-client/lib/get-moz-stored-metrics.js +2 -1
  122. package/shared/pulsemcp-admin-client/lib/get-official-mirror-queue-item.js +2 -1
  123. package/shared/pulsemcp-admin-client/lib/get-official-mirror-queue-items.js +2 -1
  124. package/shared/pulsemcp-admin-client/lib/get-official-mirror.js +2 -1
  125. package/shared/pulsemcp-admin-client/lib/get-official-mirrors.js +2 -1
  126. package/shared/pulsemcp-admin-client/lib/get-post.js +2 -1
  127. package/shared/pulsemcp-admin-client/lib/get-posts.js +2 -1
  128. package/shared/pulsemcp-admin-client/lib/get-proctor-metadata.js +2 -1
  129. package/shared/pulsemcp-admin-client/lib/get-proctor-runs.js +2 -1
  130. package/shared/pulsemcp-admin-client/lib/get-provider-by-id.js +2 -1
  131. package/shared/pulsemcp-admin-client/lib/get-redirect.js +2 -1
  132. package/shared/pulsemcp-admin-client/lib/get-redirects.js +2 -1
  133. package/shared/pulsemcp-admin-client/lib/get-tenant.js +2 -1
  134. package/shared/pulsemcp-admin-client/lib/get-tenants.js +2 -1
  135. package/shared/pulsemcp-admin-client/lib/get-unified-mcp-server.js +3 -2
  136. package/shared/pulsemcp-admin-client/lib/get-unified-mcp-servers.js +2 -1
  137. package/shared/pulsemcp-admin-client/lib/get-unofficial-mirror.js +2 -1
  138. package/shared/pulsemcp-admin-client/lib/get-unofficial-mirrors.js +2 -1
  139. package/shared/pulsemcp-admin-client/lib/mark-discovered-url-processed.js +2 -1
  140. package/shared/pulsemcp-admin-client/lib/recache-mcp-server.d.ts +3 -0
  141. package/shared/pulsemcp-admin-client/lib/recache-mcp-server.js +24 -0
  142. package/shared/pulsemcp-admin-client/lib/reject-official-mirror-queue-item.js +2 -1
  143. package/shared/pulsemcp-admin-client/lib/reschedule-good-job.js +2 -1
  144. package/shared/pulsemcp-admin-client/lib/retry-good-job.js +2 -1
  145. package/shared/pulsemcp-admin-client/lib/run-exam-for-mirror.js +2 -1
  146. package/shared/pulsemcp-admin-client/lib/save-mcp-implementation.js +2 -1
  147. package/shared/pulsemcp-admin-client/lib/save-results-for-mirror.js +2 -1
  148. package/shared/pulsemcp-admin-client/lib/search-mcp-implementations.js +2 -1
  149. package/shared/pulsemcp-admin-client/lib/search-providers.js +2 -1
  150. package/shared/pulsemcp-admin-client/lib/send-email.js +2 -1
  151. package/shared/pulsemcp-admin-client/lib/unlink-official-mirror-queue-item.js +2 -1
  152. package/shared/pulsemcp-admin-client/lib/update-mcp-json.js +2 -1
  153. package/shared/pulsemcp-admin-client/lib/update-post.js +2 -1
  154. package/shared/pulsemcp-admin-client/lib/update-redirect.js +2 -1
  155. package/shared/pulsemcp-admin-client/lib/update-unofficial-mirror.js +2 -1
  156. package/shared/pulsemcp-admin-client/lib/upload-image.js +2 -1
  157. package/shared/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +27 -0
  158. package/shared/server.d.ts +18 -1
  159. package/shared/server.js +13 -1
  160. package/shared/tools/create-api-key.d.ts +39 -0
  161. package/shared/tools/create-api-key.js +78 -0
  162. package/shared/tools/create-tenant.d.ts +30 -0
  163. package/shared/tools/create-tenant.js +58 -0
  164. package/shared/tools/recache-mcp-server.d.ts +30 -0
  165. package/shared/tools/recache-mcp-server.js +49 -0
  166. package/shared/tools.d.ts +2 -1
  167. package/shared/tools.js +13 -2
  168. package/shared/types.d.ts +22 -0
@@ -1,3 +1,4 @@
1
+ import { adminFetch } from './admin-fetch.js';
1
2
  export async function updatePost(apiKey, baseUrl, slug, params) {
2
3
  const url = new URL(`/posts/${slug}`, baseUrl);
3
4
  // Build form data for the PUT request
@@ -50,7 +51,7 @@ export async function updatePost(apiKey, baseUrl, slug, params) {
50
51
  formData.append('post[featured_mcp_client_ids][]', id.toString());
51
52
  });
52
53
  }
53
- const response = await fetch(url.toString(), {
54
+ const response = await adminFetch(url.toString(), {
54
55
  method: 'PUT',
55
56
  headers: {
56
57
  'X-API-Key': apiKey,
@@ -1,3 +1,4 @@
1
+ import { adminFetch } from './admin-fetch.js';
1
2
  export async function updateRedirect(apiKey, baseUrl, id, params) {
2
3
  const url = new URL(`/api/redirects/${id}`, baseUrl);
3
4
  const body = {};
@@ -10,7 +11,7 @@ export async function updateRedirect(apiKey, baseUrl, id, params) {
10
11
  if (params.status !== undefined) {
11
12
  body.status = params.status;
12
13
  }
13
- const response = await fetch(url.toString(), {
14
+ const response = await adminFetch(url.toString(), {
14
15
  method: 'PUT',
15
16
  headers: {
16
17
  'X-API-Key': apiKey,
@@ -1,3 +1,4 @@
1
+ import { adminFetch } from './admin-fetch.js';
1
2
  export async function updateUnofficialMirror(apiKey, baseUrl, id, params) {
2
3
  const url = new URL(`/api/unofficial_mirrors/${id}`, baseUrl);
3
4
  const body = {};
@@ -20,7 +21,7 @@ export async function updateUnofficialMirror(apiKey, baseUrl, id, params) {
20
21
  if (params.next_name !== undefined) {
21
22
  body.next_name = params.next_name;
22
23
  }
23
- const response = await fetch(url.toString(), {
24
+ const response = await adminFetch(url.toString(), {
24
25
  method: 'PUT',
25
26
  headers: {
26
27
  'X-API-Key': apiKey,
@@ -1,3 +1,4 @@
1
+ import { adminFetch } from './admin-fetch.js';
1
2
  export async function uploadImage(apiKey, baseUrl, postSlug, fileName, fileData) {
2
3
  const url = new URL('/upload_image', baseUrl);
3
4
  // Create form data for multipart upload
@@ -9,7 +10,7 @@ export async function uploadImage(apiKey, baseUrl, postSlug, fileName, fileData)
9
10
  // Add folder and filepath as documented in the API
10
11
  formData.append('folder', `posts/${postSlug}`);
11
12
  formData.append('filepath', fileName);
12
- const response = await fetch(url.toString(), {
13
+ const response = await adminFetch(url.toString(), {
13
14
  method: 'POST',
14
15
  headers: {
15
16
  'X-API-Key': apiKey,
@@ -1023,5 +1023,32 @@ export function createMockPulseMCPAdminClient(mockData) {
1023
1023
  },
1024
1024
  };
1025
1025
  },
1026
+ async createTenant(params) {
1027
+ return {
1028
+ id: 99,
1029
+ slug: params.slug,
1030
+ is_admin: false,
1031
+ enrichments: {},
1032
+ created_at: '2024-01-01T00:00:00Z',
1033
+ updated_at: '2024-01-01T00:00:00Z',
1034
+ };
1035
+ },
1036
+ async createApiKey(params) {
1037
+ return {
1038
+ id: 99,
1039
+ name: params.name,
1040
+ tenant_id: 1,
1041
+ tenant_slug: params.tenant_slug,
1042
+ tenant_is_admin: false,
1043
+ permission_level: (params.permission_level || 'full_access'),
1044
+ key: '00000000-0000-0000-0000-000000000000',
1045
+ created_at: '2024-01-01T00:00:00Z',
1046
+ };
1047
+ },
1048
+ async recacheMCPServer(slug) {
1049
+ return {
1050
+ message: `Cache successfully refreshed for ${slug}.`,
1051
+ };
1052
+ },
1026
1053
  };
1027
1054
  }
@@ -1,5 +1,5 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import type { Post, PostsResponse, CreatePostParams, UpdatePostParams, ImageUploadResponse, Author, AuthorsResponse, MCPServer, MCPClient, MCPImplementation, MCPImplementationsResponse, SaveMCPImplementationParams, CreateMCPImplementationParams, Provider, ProvidersResponse, OfficialMirrorQueueStatus, OfficialMirrorQueueResponse, OfficialMirrorQueueItemDetail, OfficialMirrorQueueActionResponse, UnofficialMirror, UnofficialMirrorsResponse, CreateUnofficialMirrorParams, UpdateUnofficialMirrorParams, OfficialMirrorRest, OfficialMirrorsResponse, Tenant, TenantsResponse, McpJson, McpJsonsResponse, CreateMcpJsonParams, UpdateMcpJsonParams, UnifiedMCPServer, UnifiedMCPServersResponse, UpdateUnifiedMCPServerParams, Redirect, RedirectsResponse, RedirectStatus, CreateRedirectParams, UpdateRedirectParams, GoodJob, GoodJobsResponse, GoodJobStatus, GoodJobCronSchedule, GoodJobProcess, GoodJobStatistics, GoodJobActionResponse, GoodJobCleanupResponse, ProctorRunExamParams, ProctorRunExamResponse, ProctorSaveResultsParams, ProctorSaveResultsResponse, ProctorRunsResponse, GetProctorRunsParams, ProctorMetadataResponse, DiscoveredUrlsResponse, MarkDiscoveredUrlProcessedParams, MarkDiscoveredUrlProcessedResponse, DiscoveredUrlStats, MozMetricsResponse, MozBacklinksResponse, MozStoredMetricsResponse } from './types.js';
2
+ import type { Post, PostsResponse, CreatePostParams, UpdatePostParams, ImageUploadResponse, Author, AuthorsResponse, MCPServer, MCPClient, MCPImplementation, MCPImplementationsResponse, SaveMCPImplementationParams, CreateMCPImplementationParams, Provider, ProvidersResponse, OfficialMirrorQueueStatus, OfficialMirrorQueueResponse, OfficialMirrorQueueItemDetail, OfficialMirrorQueueActionResponse, UnofficialMirror, UnofficialMirrorsResponse, CreateUnofficialMirrorParams, UpdateUnofficialMirrorParams, OfficialMirrorRest, OfficialMirrorsResponse, Tenant, TenantsResponse, McpJson, McpJsonsResponse, CreateMcpJsonParams, UpdateMcpJsonParams, UnifiedMCPServer, UnifiedMCPServersResponse, UpdateUnifiedMCPServerParams, Redirect, RedirectsResponse, RedirectStatus, CreateRedirectParams, UpdateRedirectParams, GoodJob, GoodJobsResponse, GoodJobStatus, GoodJobCronSchedule, GoodJobProcess, GoodJobStatistics, GoodJobActionResponse, GoodJobCleanupResponse, ProctorRunExamParams, ProctorRunExamResponse, ProctorSaveResultsParams, ProctorSaveResultsResponse, ProctorRunsResponse, GetProctorRunsParams, ProctorMetadataResponse, DiscoveredUrlsResponse, MarkDiscoveredUrlProcessedParams, MarkDiscoveredUrlProcessedResponse, DiscoveredUrlStats, MozMetricsResponse, MozBacklinksResponse, MozStoredMetricsResponse, CreateTenantParams, ApiKey, CreateApiKeyParams, RecacheMCPServerResponse } from './types.js';
3
3
  export interface IPulseMCPAdminClient {
4
4
  getPosts(params?: {
5
5
  search?: string;
@@ -102,6 +102,8 @@ export interface IPulseMCPAdminClient {
102
102
  offset?: number;
103
103
  }): Promise<TenantsResponse>;
104
104
  getTenant(idOrSlug: number | string): Promise<Tenant>;
105
+ createTenant(params: CreateTenantParams): Promise<Tenant>;
106
+ createApiKey(params: CreateApiKeyParams): Promise<ApiKey>;
105
107
  getMcpJsons(params?: {
106
108
  unofficial_mirror_id?: number;
107
109
  q?: string;
@@ -124,6 +126,7 @@ export interface IPulseMCPAdminClient {
124
126
  }): Promise<UnifiedMCPServersResponse>;
125
127
  getUnifiedMCPServer(slug: string): Promise<UnifiedMCPServer>;
126
128
  updateUnifiedMCPServer(implementationId: number, params: UpdateUnifiedMCPServerParams): Promise<UnifiedMCPServer>;
129
+ recacheMCPServer(slug: string): Promise<RecacheMCPServerResponse>;
127
130
  getRedirects(params?: {
128
131
  q?: string;
129
132
  status?: RedirectStatus;
@@ -290,6 +293,8 @@ export declare class PulseMCPAdminClient implements IPulseMCPAdminClient {
290
293
  offset?: number;
291
294
  }): Promise<TenantsResponse>;
292
295
  getTenant(idOrSlug: number | string): Promise<Tenant>;
296
+ createTenant(params: CreateTenantParams): Promise<Tenant>;
297
+ createApiKey(params: CreateApiKeyParams): Promise<ApiKey>;
293
298
  getMcpJsons(params?: {
294
299
  unofficial_mirror_id?: number;
295
300
  q?: string;
@@ -312,6 +317,7 @@ export declare class PulseMCPAdminClient implements IPulseMCPAdminClient {
312
317
  }): Promise<UnifiedMCPServersResponse>;
313
318
  getUnifiedMCPServer(slug: string): Promise<UnifiedMCPServer>;
314
319
  updateUnifiedMCPServer(implementationId: number, params: UpdateUnifiedMCPServerParams): Promise<UnifiedMCPServer>;
320
+ recacheMCPServer(slug: string): Promise<RecacheMCPServerResponse>;
315
321
  getRedirects(params?: {
316
322
  q?: string;
317
323
  status?: RedirectStatus;
@@ -385,6 +391,9 @@ export declare function createMCPServer(options: CreateMCPServerOptions): {
385
391
  _meta?: {
386
392
  [x: string]: unknown;
387
393
  progressToken?: string | number | undefined;
394
+ "io.modelcontextprotocol/related-task"?: {
395
+ taskId: string;
396
+ } | undefined;
388
397
  } | undefined;
389
398
  } | undefined;
390
399
  }, {
@@ -393,12 +402,20 @@ export declare function createMCPServer(options: CreateMCPServerOptions): {
393
402
  [x: string]: unknown;
394
403
  _meta?: {
395
404
  [x: string]: unknown;
405
+ progressToken?: string | number | undefined;
406
+ "io.modelcontextprotocol/related-task"?: {
407
+ taskId: string;
408
+ } | undefined;
396
409
  } | undefined;
397
410
  } | undefined;
398
411
  }, {
399
412
  [x: string]: unknown;
400
413
  _meta?: {
401
414
  [x: string]: unknown;
415
+ progressToken?: string | number | undefined;
416
+ "io.modelcontextprotocol/related-task"?: {
417
+ taskId: string;
418
+ } | undefined;
402
419
  } | undefined;
403
420
  }>;
404
421
  registerHandlers: (server: Server, clientFactory?: ClientFactory) => Promise<void>;
package/shared/server.js CHANGED
@@ -71,6 +71,9 @@ import { getDiscoveredUrlStats } from './pulsemcp-admin-client/lib/get-discovere
71
71
  import { getMozMetrics } from './pulsemcp-admin-client/lib/get-moz-metrics.js';
72
72
  import { getMozBacklinks } from './pulsemcp-admin-client/lib/get-moz-backlinks.js';
73
73
  import { getMozStoredMetrics } from './pulsemcp-admin-client/lib/get-moz-stored-metrics.js';
74
+ import { recacheMCPServer } from './pulsemcp-admin-client/lib/recache-mcp-server.js';
75
+ import { createTenant } from './pulsemcp-admin-client/lib/create-tenant.js';
76
+ import { createApiKey } from './pulsemcp-admin-client/lib/create-api-key.js';
74
77
  // PulseMCP Admin API client implementation
75
78
  export class PulseMCPAdminClient {
76
79
  apiKey;
@@ -184,13 +187,19 @@ export class PulseMCPAdminClient {
184
187
  async getOfficialMirror(id) {
185
188
  return getOfficialMirror(this.apiKey, this.baseUrl, id);
186
189
  }
187
- // Tenant REST API methods (read-only)
190
+ // Tenant REST API methods
188
191
  async getTenants(params) {
189
192
  return getTenants(this.apiKey, this.baseUrl, params);
190
193
  }
191
194
  async getTenant(idOrSlug) {
192
195
  return getTenant(this.apiKey, this.baseUrl, idOrSlug);
193
196
  }
197
+ async createTenant(params) {
198
+ return createTenant(this.apiKey, this.baseUrl, params);
199
+ }
200
+ async createApiKey(params) {
201
+ return createApiKey(this.apiKey, this.baseUrl, params);
202
+ }
194
203
  // MCP JSON REST API methods
195
204
  async getMcpJsons(params) {
196
205
  return getMcpJsons(this.apiKey, this.baseUrl, params);
@@ -217,6 +226,9 @@ export class PulseMCPAdminClient {
217
226
  async updateUnifiedMCPServer(implementationId, params) {
218
227
  return updateUnifiedMCPServer(this.apiKey, this.baseUrl, implementationId, params);
219
228
  }
229
+ async recacheMCPServer(slug) {
230
+ return recacheMCPServer(this.apiKey, this.baseUrl, slug);
231
+ }
220
232
  // Redirect REST API methods
221
233
  async getRedirects(params) {
222
234
  return getRedirects(this.apiKey, this.baseUrl, params);
@@ -0,0 +1,39 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import type { ClientFactory } from '../server.js';
3
+ export declare function createApiKey(_server: Server, clientFactory: ClientFactory): {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: string;
8
+ properties: {
9
+ tenant_slug: {
10
+ type: string;
11
+ description: "The slug of the tenant to create the API key for";
12
+ };
13
+ name: {
14
+ type: string;
15
+ description: "Optional display name for the API key";
16
+ };
17
+ permission_level: {
18
+ type: string;
19
+ enum: string[];
20
+ description: "Permission level for the key: read_only, read_and_upsert, or full_access. Defaults to full_access.";
21
+ };
22
+ };
23
+ required: string[];
24
+ };
25
+ handler: (args: unknown) => Promise<{
26
+ content: {
27
+ type: string;
28
+ text: string;
29
+ }[];
30
+ isError?: undefined;
31
+ } | {
32
+ content: {
33
+ type: string;
34
+ text: string;
35
+ }[];
36
+ isError: boolean;
37
+ }>;
38
+ };
39
+ //# sourceMappingURL=create-api-key.d.ts.map
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ const PARAM_DESCRIPTIONS = {
3
+ tenant_slug: 'The slug of the tenant to create the API key for',
4
+ name: 'Optional display name for the API key',
5
+ permission_level: 'Permission level for the key: read_only, read_and_upsert, or full_access. Defaults to full_access.',
6
+ };
7
+ const CreateApiKeySchema = z.object({
8
+ tenant_slug: z.string().describe(PARAM_DESCRIPTIONS.tenant_slug),
9
+ name: z.string().optional().describe(PARAM_DESCRIPTIONS.name),
10
+ permission_level: z
11
+ .enum(['read_only', 'read_and_upsert', 'full_access'])
12
+ .optional()
13
+ .describe(PARAM_DESCRIPTIONS.permission_level),
14
+ });
15
+ export function createApiKey(_server, clientFactory) {
16
+ return {
17
+ name: 'create_api_key',
18
+ description: `Create an API key for a specified tenant. Returns the raw key value, which is only available at creation time.
19
+
20
+ Example request:
21
+ {
22
+ "tenant_slug": "acme-corp",
23
+ "name": "Production Key",
24
+ "permission_level": "read_and_upsert"
25
+ }
26
+
27
+ Use cases:
28
+ - Provision API access for a new tenant
29
+ - Create keys with specific permission levels for different use cases
30
+ - Generate read-only keys for monitoring integrations`,
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ tenant_slug: { type: 'string', description: PARAM_DESCRIPTIONS.tenant_slug },
35
+ name: { type: 'string', description: PARAM_DESCRIPTIONS.name },
36
+ permission_level: {
37
+ type: 'string',
38
+ enum: ['read_only', 'read_and_upsert', 'full_access'],
39
+ description: PARAM_DESCRIPTIONS.permission_level,
40
+ },
41
+ },
42
+ required: ['tenant_slug'],
43
+ },
44
+ handler: async (args) => {
45
+ const validatedArgs = CreateApiKeySchema.parse(args);
46
+ const client = clientFactory();
47
+ try {
48
+ const apiKey = await client.createApiKey({
49
+ tenant_slug: validatedArgs.tenant_slug,
50
+ name: validatedArgs.name,
51
+ permission_level: validatedArgs.permission_level,
52
+ });
53
+ let content = `Successfully created API key!\n\n`;
54
+ content += `**ID:** ${apiKey.id}\n`;
55
+ if (apiKey.name) {
56
+ content += `**Name:** ${apiKey.name}\n`;
57
+ }
58
+ content += `**Tenant:** ${apiKey.tenant_slug} (ID: ${apiKey.tenant_id})\n`;
59
+ content += `**Permission Level:** ${apiKey.permission_level}\n`;
60
+ content += `**Key:** \`${apiKey.key}\`\n`;
61
+ content += `**Created:** ${apiKey.created_at}\n`;
62
+ content += `\n> **Important:** Save this key now — it cannot be retrieved again.`;
63
+ return { content: [{ type: 'text', text: content }] };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ content: [
68
+ {
69
+ type: 'text',
70
+ text: `Error creating API key: ${error instanceof Error ? error.message : String(error)}`,
71
+ },
72
+ ],
73
+ isError: true,
74
+ };
75
+ }
76
+ },
77
+ };
78
+ }
@@ -0,0 +1,30 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import type { ClientFactory } from '../server.js';
3
+ export declare function createTenant(_server: Server, clientFactory: ClientFactory): {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: string;
8
+ properties: {
9
+ slug: {
10
+ type: string;
11
+ description: "Unique slug identifier for the new tenant (e.g., \"acme-corp\")";
12
+ };
13
+ };
14
+ required: string[];
15
+ };
16
+ handler: (args: unknown) => Promise<{
17
+ content: {
18
+ type: string;
19
+ text: string;
20
+ }[];
21
+ isError?: undefined;
22
+ } | {
23
+ content: {
24
+ type: string;
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ }>;
29
+ };
30
+ //# sourceMappingURL=create-tenant.d.ts.map
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ const PARAM_DESCRIPTIONS = {
3
+ slug: 'Unique slug identifier for the new tenant (e.g., "acme-corp")',
4
+ };
5
+ const CreateTenantSchema = z.object({
6
+ slug: z.string().describe(PARAM_DESCRIPTIONS.slug),
7
+ });
8
+ export function createTenant(_server, clientFactory) {
9
+ return {
10
+ name: 'create_tenant',
11
+ description: `Create a new tenant for sub-registry provisioning.
12
+
13
+ Example request:
14
+ {
15
+ "slug": "acme-corp"
16
+ }
17
+
18
+ Use cases:
19
+ - Provision a new sub-registry tenant
20
+ - Set up a new organization in the PulseMCP platform`,
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {
24
+ slug: { type: 'string', description: PARAM_DESCRIPTIONS.slug },
25
+ },
26
+ required: ['slug'],
27
+ },
28
+ handler: async (args) => {
29
+ const validatedArgs = CreateTenantSchema.parse(args);
30
+ const client = clientFactory();
31
+ try {
32
+ const tenant = await client.createTenant({ slug: validatedArgs.slug });
33
+ let content = `Successfully created tenant!\n\n`;
34
+ content += `**ID:** ${tenant.id}\n`;
35
+ content += `**Slug:** ${tenant.slug}\n`;
36
+ content += `**Admin:** ${tenant.is_admin ? 'Yes' : 'No'}\n`;
37
+ if (tenant.enrichments && Object.keys(tenant.enrichments).length > 0) {
38
+ content += `**Enrichments:** ${Object.keys(tenant.enrichments).join(', ')}\n`;
39
+ }
40
+ if (tenant.created_at) {
41
+ content += `**Created:** ${tenant.created_at}\n`;
42
+ }
43
+ return { content: [{ type: 'text', text: content }] };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: 'text',
50
+ text: `Error creating tenant: ${error instanceof Error ? error.message : String(error)}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ },
57
+ };
58
+ }
@@ -0,0 +1,30 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import type { ClientFactory } from '../server.js';
3
+ export declare function recacheMCPServer(_server: Server, clientFactory: ClientFactory): {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: string;
8
+ properties: {
9
+ slug: {
10
+ type: string;
11
+ description: "The slug of the MCP server to recache (e.g., \"filesystem\")";
12
+ };
13
+ };
14
+ required: string[];
15
+ };
16
+ handler: (args: unknown) => Promise<{
17
+ content: {
18
+ type: string;
19
+ text: string;
20
+ }[];
21
+ isError?: undefined;
22
+ } | {
23
+ content: {
24
+ type: string;
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ }>;
29
+ };
30
+ //# sourceMappingURL=recache-mcp-server.d.ts.map
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ const PARAM_DESCRIPTIONS = {
3
+ slug: 'The slug of the MCP server to recache (e.g., "filesystem")',
4
+ };
5
+ const RecacheMCPServerSchema = z.object({
6
+ slug: z.string().describe(PARAM_DESCRIPTIONS.slug),
7
+ });
8
+ export function recacheMCPServer(_server, clientFactory) {
9
+ return {
10
+ name: 'recache_mcp_server',
11
+ description: `Refresh the cache for a specific MCP server. Clears and warms the show page, card fragments across all sort variations, canonical URLs, and parent pages.
12
+
13
+ Example request:
14
+ {
15
+ "slug": "filesystem"
16
+ }
17
+
18
+ Use cases:
19
+ - Force a cache refresh after updating server data
20
+ - Fix stale cache entries for a specific server
21
+ - Warm caches after content changes`,
22
+ inputSchema: {
23
+ type: 'object',
24
+ properties: {
25
+ slug: { type: 'string', description: PARAM_DESCRIPTIONS.slug },
26
+ },
27
+ required: ['slug'],
28
+ },
29
+ handler: async (args) => {
30
+ const validatedArgs = RecacheMCPServerSchema.parse(args);
31
+ const client = clientFactory();
32
+ try {
33
+ const result = await client.recacheMCPServer(validatedArgs.slug);
34
+ return { content: [{ type: 'text', text: result.message }] };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: `Error recaching MCP server: ${error instanceof Error ? error.message : String(error)}`,
42
+ },
43
+ ],
44
+ isError: true,
45
+ };
46
+ }
47
+ },
48
+ };
49
+ }
package/shared/tools.d.ts CHANGED
@@ -18,7 +18,7 @@ import { ClientFactory } from './server.js';
18
18
  * - official_queue / official_queue_readonly: Official mirror queue tools (list, get, approve, reject, unlink)
19
19
  * - unofficial_mirrors / unofficial_mirrors_readonly: Unofficial mirror CRUD tools
20
20
  * - official_mirrors_readonly: Official mirrors read-only tools (REST API)
21
- * - tenants_readonly: Tenant read-only tools
21
+ * - tenants / tenants_readonly: Tenant management tools (CRUD + API key provisioning)
22
22
  * - mcp_jsons / mcp_jsons_readonly: MCP JSON configuration tools
23
23
  * - mcp_servers / mcp_servers_readonly: Unified MCP server tools (abstracted interface)
24
24
  * - redirects / redirects_readonly: URL redirect management tools
@@ -60,6 +60,7 @@ export declare function parseEnabledToolGroups(enabledGroupsParam?: string): Too
60
60
  * - unofficial_mirrors: Unofficial mirror CRUD tools (read + write)
61
61
  * - unofficial_mirrors_readonly: Unofficial mirror tools (read only)
62
62
  * - official_mirrors_readonly: Official mirrors REST API tools (read only)
63
+ * - tenants: Tenant management tools including API key provisioning (read + write)
63
64
  * - tenants_readonly: Tenant tools (read only)
64
65
  * - mcp_jsons: MCP JSON configuration tools (read + write)
65
66
  * - mcp_jsons_readonly: MCP JSON tools (read only)
package/shared/tools.js CHANGED
@@ -26,9 +26,11 @@ import { deleteUnofficialMirror } from './tools/delete-unofficial-mirror.js';
26
26
  // Official mirrors REST tools (read-only)
27
27
  import { getOfficialMirrors } from './tools/get-official-mirrors.js';
28
28
  import { getOfficialMirror } from './tools/get-official-mirror.js';
29
- // Tenant tools (read-only)
29
+ // Tenant tools
30
30
  import { getTenants } from './tools/get-tenants.js';
31
31
  import { getTenant } from './tools/get-tenant.js';
32
+ import { createTenant } from './tools/create-tenant.js';
33
+ import { createApiKey } from './tools/create-api-key.js';
32
34
  // MCP JSON tools
33
35
  import { getMcpJsons } from './tools/get-mcp-jsons.js';
34
36
  import { getMcpJson } from './tools/get-mcp-json.js';
@@ -39,6 +41,7 @@ import { deleteMcpJson } from './tools/delete-mcp-json.js';
39
41
  import { listMCPServers } from './tools/list-mcp-servers.js';
40
42
  import { getMCPServer } from './tools/get-mcp-server.js';
41
43
  import { updateMCPServer } from './tools/update-mcp-server.js';
44
+ import { recacheMCPServer } from './tools/recache-mcp-server.js';
42
45
  // Redirect tools
43
46
  import { getRedirects } from './tools/get-redirects.js';
44
47
  import { getRedirect } from './tools/get-redirect.js';
@@ -170,9 +173,11 @@ const ALL_TOOLS = [
170
173
  groups: ['official_mirrors', 'server_directory'],
171
174
  isWriteOperation: false,
172
175
  },
173
- // Tenant tools (read-only)
176
+ // Tenant tools
174
177
  { factory: getTenants, groups: ['tenants'], isWriteOperation: false },
175
178
  { factory: getTenant, groups: ['tenants'], isWriteOperation: false },
179
+ { factory: createTenant, groups: ['tenants'], isWriteOperation: true },
180
+ { factory: createApiKey, groups: ['tenants'], isWriteOperation: true },
176
181
  // MCP JSON tools (CRUD) (also in server_directory)
177
182
  {
178
183
  factory: getMcpJsons,
@@ -215,6 +220,11 @@ const ALL_TOOLS = [
215
220
  groups: ['mcp_servers', 'server_directory'],
216
221
  isWriteOperation: true,
217
222
  },
223
+ {
224
+ factory: recacheMCPServer,
225
+ groups: ['mcp_servers', 'server_directory'],
226
+ isWriteOperation: true,
227
+ },
218
228
  // Redirect tools (CRUD)
219
229
  { factory: getRedirects, groups: ['redirects'], isWriteOperation: false },
220
230
  { factory: getRedirect, groups: ['redirects'], isWriteOperation: false },
@@ -372,6 +382,7 @@ function shouldIncludeTool(toolDef, enabledGroups) {
372
382
  * - unofficial_mirrors: Unofficial mirror CRUD tools (read + write)
373
383
  * - unofficial_mirrors_readonly: Unofficial mirror tools (read only)
374
384
  * - official_mirrors_readonly: Official mirrors REST API tools (read only)
385
+ * - tenants: Tenant management tools including API key provisioning (read + write)
375
386
  * - tenants_readonly: Tenant tools (read only)
376
387
  * - mcp_jsons: MCP JSON configuration tools (read + write)
377
388
  * - mcp_jsons_readonly: MCP JSON tools (read only)
package/shared/types.d.ts CHANGED
@@ -786,6 +786,28 @@ export interface DiscoveredUrlStats {
786
786
  rejected_today: number;
787
787
  errored_today: number;
788
788
  }
789
+ export interface CreateTenantParams {
790
+ slug: string;
791
+ }
792
+ export type ApiKeyPermissionLevel = 'read_only' | 'read_and_upsert' | 'full_access';
793
+ export interface ApiKey {
794
+ id: number;
795
+ name?: string;
796
+ tenant_id: number;
797
+ tenant_slug: string;
798
+ tenant_is_admin: boolean;
799
+ permission_level: ApiKeyPermissionLevel;
800
+ key: string;
801
+ created_at: string;
802
+ }
803
+ export interface CreateApiKeyParams {
804
+ tenant_slug: string;
805
+ name?: string;
806
+ permission_level?: ApiKeyPermissionLevel;
807
+ }
808
+ export interface RecacheMCPServerResponse {
809
+ message: string;
810
+ }
789
811
  export interface MozMetrics {
790
812
  page_authority?: number;
791
813
  domain_authority?: number;