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.
- package/README.md +15 -8
- package/build/shared/src/pulsemcp-admin-client/lib/add-official-mirror-to-regular-queue.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/admin-fetch.js +33 -0
- package/build/shared/src/pulsemcp-admin-client/lib/approve-official-mirror-queue-item-without-modifying.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/approve-official-mirror-queue-item.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/cleanup-good-jobs.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/create-api-key.js +51 -0
- package/build/shared/src/pulsemcp-admin-client/lib/create-mcp-implementation.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/create-mcp-json.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/create-post.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/create-redirect.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/create-tenant.js +35 -0
- package/build/shared/src/pulsemcp-admin-client/lib/create-unofficial-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/delete-mcp-json.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/delete-redirect.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/delete-unofficial-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/discard-good-job.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/force-trigger-good-job-cron.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-author-by-id.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-author-by-slug.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-authors.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-discovered-url-stats.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-discovered-urls.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-draft-mcp-implementations.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-cron-schedules.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-processes.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-good-job-statistics.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-good-job.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-good-jobs.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-client-by-id.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-client-by-slug.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-implementation-by-id.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-json.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-jsons.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-server-by-id.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-mcp-server-by-slug.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-moz-backlinks.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-moz-metrics.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-moz-stored-metrics.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror-queue-item.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror-queue-items.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-official-mirrors.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-post.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-posts.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-proctor-metadata.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-proctor-runs.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-provider-by-id.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-redirect.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-redirects.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-tenant.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-tenants.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-unified-mcp-server.js +3 -2
- package/build/shared/src/pulsemcp-admin-client/lib/get-unified-mcp-servers.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-unofficial-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/get-unofficial-mirrors.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/mark-discovered-url-processed.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/recache-mcp-server.js +24 -0
- package/build/shared/src/pulsemcp-admin-client/lib/reject-official-mirror-queue-item.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/reschedule-good-job.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/retry-good-job.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/run-exam-for-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/save-mcp-implementation.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/save-results-for-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/search-mcp-implementations.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/search-providers.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/send-email.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/unlink-official-mirror-queue-item.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/update-mcp-json.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/update-post.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/update-redirect.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/update-unofficial-mirror.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/lib/upload-image.js +2 -1
- package/build/shared/src/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +27 -0
- package/build/shared/src/server.js +13 -1
- package/build/shared/src/tools/create-api-key.js +78 -0
- package/build/shared/src/tools/create-tenant.js +58 -0
- package/build/shared/src/tools/recache-mcp-server.js +49 -0
- package/build/shared/src/tools.js +13 -2
- package/package.json +2 -2
- package/shared/pulsemcp-admin-client/lib/add-official-mirror-to-regular-queue.js +2 -1
- package/shared/pulsemcp-admin-client/lib/admin-fetch.d.ts +6 -0
- package/shared/pulsemcp-admin-client/lib/admin-fetch.js +33 -0
- package/shared/pulsemcp-admin-client/lib/approve-official-mirror-queue-item-without-modifying.js +2 -1
- package/shared/pulsemcp-admin-client/lib/approve-official-mirror-queue-item.js +2 -1
- package/shared/pulsemcp-admin-client/lib/cleanup-good-jobs.js +2 -1
- package/shared/pulsemcp-admin-client/lib/create-api-key.d.ts +3 -0
- package/shared/pulsemcp-admin-client/lib/create-api-key.js +51 -0
- package/shared/pulsemcp-admin-client/lib/create-mcp-implementation.js +2 -1
- package/shared/pulsemcp-admin-client/lib/create-mcp-json.js +2 -1
- package/shared/pulsemcp-admin-client/lib/create-post.js +2 -1
- package/shared/pulsemcp-admin-client/lib/create-redirect.js +2 -1
- package/shared/pulsemcp-admin-client/lib/create-tenant.d.ts +3 -0
- package/shared/pulsemcp-admin-client/lib/create-tenant.js +35 -0
- package/shared/pulsemcp-admin-client/lib/create-unofficial-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/delete-mcp-json.js +2 -1
- package/shared/pulsemcp-admin-client/lib/delete-redirect.js +2 -1
- package/shared/pulsemcp-admin-client/lib/delete-unofficial-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/discard-good-job.js +2 -1
- package/shared/pulsemcp-admin-client/lib/force-trigger-good-job-cron.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-author-by-id.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-author-by-slug.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-authors.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-discovered-url-stats.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-discovered-urls.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-draft-mcp-implementations.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-good-job-cron-schedules.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-good-job-processes.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-good-job-statistics.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-good-job.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-good-jobs.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-client-by-id.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-client-by-slug.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-implementation-by-id.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-json.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-jsons.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-server-by-id.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-mcp-server-by-slug.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-moz-backlinks.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-moz-metrics.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-moz-stored-metrics.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-official-mirror-queue-item.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-official-mirror-queue-items.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-official-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-official-mirrors.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-post.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-posts.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-proctor-metadata.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-proctor-runs.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-provider-by-id.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-redirect.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-redirects.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-tenant.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-tenants.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-unified-mcp-server.js +3 -2
- package/shared/pulsemcp-admin-client/lib/get-unified-mcp-servers.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-unofficial-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/get-unofficial-mirrors.js +2 -1
- package/shared/pulsemcp-admin-client/lib/mark-discovered-url-processed.js +2 -1
- package/shared/pulsemcp-admin-client/lib/recache-mcp-server.d.ts +3 -0
- package/shared/pulsemcp-admin-client/lib/recache-mcp-server.js +24 -0
- package/shared/pulsemcp-admin-client/lib/reject-official-mirror-queue-item.js +2 -1
- package/shared/pulsemcp-admin-client/lib/reschedule-good-job.js +2 -1
- package/shared/pulsemcp-admin-client/lib/retry-good-job.js +2 -1
- package/shared/pulsemcp-admin-client/lib/run-exam-for-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/save-mcp-implementation.js +2 -1
- package/shared/pulsemcp-admin-client/lib/save-results-for-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/search-mcp-implementations.js +2 -1
- package/shared/pulsemcp-admin-client/lib/search-providers.js +2 -1
- package/shared/pulsemcp-admin-client/lib/send-email.js +2 -1
- package/shared/pulsemcp-admin-client/lib/unlink-official-mirror-queue-item.js +2 -1
- package/shared/pulsemcp-admin-client/lib/update-mcp-json.js +2 -1
- package/shared/pulsemcp-admin-client/lib/update-post.js +2 -1
- package/shared/pulsemcp-admin-client/lib/update-redirect.js +2 -1
- package/shared/pulsemcp-admin-client/lib/update-unofficial-mirror.js +2 -1
- package/shared/pulsemcp-admin-client/lib/upload-image.js +2 -1
- package/shared/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +27 -0
- package/shared/server.d.ts +18 -1
- package/shared/server.js +13 -1
- package/shared/tools/create-api-key.d.ts +39 -0
- package/shared/tools/create-api-key.js +78 -0
- package/shared/tools/create-tenant.d.ts +30 -0
- package/shared/tools/create-tenant.js +58 -0
- package/shared/tools/recache-mcp-server.d.ts +30 -0
- package/shared/tools/recache-mcp-server.js +49 -0
- package/shared/tools.d.ts +2 -1
- package/shared/tools.js +13 -2
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|
package/shared/server.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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;
|