pulsemcp-cms-admin-mcp-server 0.10.2 → 0.10.4
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 +70 -69
- package/build/shared/src/pulsemcp-admin-client/lib/set-github-repository-classification.js +38 -0
- package/build/shared/src/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +6 -0
- package/build/shared/src/server.js +4 -0
- package/build/shared/src/tools/set-github-repository-classification.js +73 -0
- package/build/shared/src/tools.js +11 -0
- package/package.json +3 -3
- package/shared/pulsemcp-admin-client/lib/set-github-repository-classification.d.ts +3 -0
- package/shared/pulsemcp-admin-client/lib/set-github-repository-classification.js +38 -0
- package/shared/pulsemcp-admin-client/pulsemcp-admin-client.integration-mock.js +6 -0
- package/shared/server.d.ts +3 -1
- package/shared/server.js +4 -0
- package/shared/tools/set-github-repository-classification.d.ts +41 -0
- package/shared/tools/set-github-repository-classification.js +73 -0
- package/shared/tools.js +11 -0
- package/shared/types.d.ts +5 -0
package/README.md
CHANGED
|
@@ -40,75 +40,76 @@ This is an MCP ([Model Context Protocol](https://modelcontextprotocol.io/)) Serv
|
|
|
40
40
|
|
|
41
41
|
This server is built and tested on macOS with Claude Desktop. It should work with other MCP clients as well.
|
|
42
42
|
|
|
43
|
-
| Tool Name | Tool Group | Read/Write | Description
|
|
44
|
-
| -------------------------------------- | ------------------- | ---------- |
|
|
45
|
-
| `get_newsletter_posts` | newsletter | read | List newsletter posts with search, sorting, and pagination options.
|
|
46
|
-
| `get_newsletter_post` | newsletter | read | Retrieve a specific newsletter post by its unique slug.
|
|
47
|
-
| `draft_newsletter_post` | newsletter | write | Create a new draft newsletter post with title, body, and metadata.
|
|
48
|
-
| `update_newsletter_post` | newsletter | write | Update an existing newsletter post's content and metadata (except status).
|
|
49
|
-
| `upload_image` | newsletter | write | Upload an image and attach it to a specific newsletter post.
|
|
50
|
-
| `get_authors` | newsletter | read | Get a list of authors with optional search and pagination.
|
|
51
|
-
| `search_mcp_implementations` | server_directory | read | Search for MCP servers and clients in the PulseMCP registry.
|
|
52
|
-
| `get_draft_mcp_implementations` | server_directory | read | Retrieve paginated list of draft MCP implementations needing review.
|
|
53
|
-
| `find_providers` | server_directory | read | Search for providers by ID, name, URL, or slug.
|
|
54
|
-
| `save_mcp_implementation` | server_directory | write | Update an MCP implementation (replicates Admin panel "Save Changes" button).
|
|
55
|
-
| `send_impl_posted_notif` | server_directory | write | Send email notification when MCP implementation goes live.
|
|
56
|
-
| `get_official_mirror_queue_items` | official_queue | read | List and filter official mirror queue entries with pagination and search.
|
|
57
|
-
| `get_official_mirror_queue_item` | official_queue | read | Get detailed information about a single official mirror queue entry.
|
|
58
|
-
| `approve_official_mirror_queue_item` | official_queue | write | Approve a queue entry and link it to an existing MCP server (async).
|
|
59
|
-
| `approve_mirror_no_modify` | official_queue | write | Approve without updating the linked server.
|
|
60
|
-
| `reject_official_mirror_queue_item` | official_queue | write | Reject a queue entry (async operation).
|
|
61
|
-
| `add_official_mirror_to_regular_queue` | official_queue | write | Convert a queue entry to a draft MCP implementation (async).
|
|
62
|
-
| `unlink_official_mirror_queue_item` | official_queue | write | Unlink a queue entry from its linked MCP server.
|
|
63
|
-
| `get_unofficial_mirrors` | unofficial_mirrors | read | List unofficial mirrors with search, pagination, and MCP server filtering.
|
|
64
|
-
| `get_unofficial_mirror` | unofficial_mirrors | read | Get detailed unofficial mirror info by ID or name.
|
|
65
|
-
| `create_unofficial_mirror` | unofficial_mirrors | write | Create a new unofficial mirror entry with JSON data.
|
|
66
|
-
| `update_unofficial_mirror` | unofficial_mirrors | write | Update an existing unofficial mirror by ID.
|
|
67
|
-
| `delete_unofficial_mirror` | unofficial_mirrors | write | Delete an unofficial mirror by ID (irreversible).
|
|
68
|
-
| `get_official_mirrors` | official_mirrors | read | List official mirrors with search, status, and processing filters.
|
|
69
|
-
| `get_official_mirror` | official_mirrors | read | Get detailed official mirror info by ID or name.
|
|
70
|
-
| `get_tenants` | tenants | read | List tenants with search and admin status filtering.
|
|
71
|
-
| `get_tenant` | tenants | read | Get detailed tenant info by ID or slug.
|
|
72
|
-
| `create_tenant` | tenants | write | Create a new tenant for sub-registry provisioning.
|
|
73
|
-
| `create_api_key` | tenants | write | Create an API key for a tenant. Returns the raw key (only available at creation time).
|
|
74
|
-
| `revoke_api_key` | tenants | write | Revoke an API key by ID, immediately invalidating it. Idempotent. Requires elicitation approval.
|
|
75
|
-
| `delete_tenant` | tenants_destructive | write | Permanently delete a tenant. Requires elicitation approval. With `force: true`, cascades to dependents.
|
|
76
|
-
| `delete_api_key` | tenants_destructive | write | Permanently revoke (delete) an API key. Idempotent. Requires elicitation approval.
|
|
77
|
-
| `get_mcp_jsons` | mcp_jsons | read | List MCP JSON configs with mirror and server filtering.
|
|
78
|
-
| `get_mcp_json` | mcp_jsons | read | Get a single MCP JSON configuration by ID.
|
|
79
|
-
| `create_mcp_json` | mcp_jsons | write | Create a new MCP JSON configuration for an unofficial mirror.
|
|
80
|
-
| `update_mcp_json` | mcp_jsons | write | Update an existing MCP JSON configuration by ID.
|
|
81
|
-
| `delete_mcp_json` | mcp_jsons | write | Delete an MCP JSON configuration by ID (irreversible).
|
|
82
|
-
| `list_mcp_servers` | mcp_servers | read | List/search MCP servers with filtering by status, classification, pagination.
|
|
83
|
-
| `get_mcp_server` | mcp_servers | read | Get detailed MCP server info by slug (unified view of all admin UI fields).
|
|
84
|
-
| `update_mcp_server` | mcp_servers | write | Update an MCP server's fields (all admin UI fields supported).
|
|
85
|
-
| `recache_mcp_server` | mcp_servers | write | Refresh the cache for a specific MCP server (show page, cards, canonicals, parent pages).
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
43
|
+
| Tool Name | Tool Group | Read/Write | Description |
|
|
44
|
+
| -------------------------------------- | ------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
45
|
+
| `get_newsletter_posts` | newsletter | read | List newsletter posts with search, sorting, and pagination options. |
|
|
46
|
+
| `get_newsletter_post` | newsletter | read | Retrieve a specific newsletter post by its unique slug. |
|
|
47
|
+
| `draft_newsletter_post` | newsletter | write | Create a new draft newsletter post with title, body, and metadata. |
|
|
48
|
+
| `update_newsletter_post` | newsletter | write | Update an existing newsletter post's content and metadata (except status). |
|
|
49
|
+
| `upload_image` | newsletter | write | Upload an image and attach it to a specific newsletter post. |
|
|
50
|
+
| `get_authors` | newsletter | read | Get a list of authors with optional search and pagination. |
|
|
51
|
+
| `search_mcp_implementations` | server_directory | read | Search for MCP servers and clients in the PulseMCP registry. |
|
|
52
|
+
| `get_draft_mcp_implementations` | server_directory | read | Retrieve paginated list of draft MCP implementations needing review. |
|
|
53
|
+
| `find_providers` | server_directory | read | Search for providers by ID, name, URL, or slug. |
|
|
54
|
+
| `save_mcp_implementation` | server_directory | write | Update an MCP implementation (replicates Admin panel "Save Changes" button). |
|
|
55
|
+
| `send_impl_posted_notif` | server_directory | write | Send email notification when MCP implementation goes live. |
|
|
56
|
+
| `get_official_mirror_queue_items` | official_queue | read | List and filter official mirror queue entries with pagination and search. |
|
|
57
|
+
| `get_official_mirror_queue_item` | official_queue | read | Get detailed information about a single official mirror queue entry. |
|
|
58
|
+
| `approve_official_mirror_queue_item` | official_queue | write | Approve a queue entry and link it to an existing MCP server (async). |
|
|
59
|
+
| `approve_mirror_no_modify` | official_queue | write | Approve without updating the linked server. |
|
|
60
|
+
| `reject_official_mirror_queue_item` | official_queue | write | Reject a queue entry (async operation). |
|
|
61
|
+
| `add_official_mirror_to_regular_queue` | official_queue | write | Convert a queue entry to a draft MCP implementation (async). |
|
|
62
|
+
| `unlink_official_mirror_queue_item` | official_queue | write | Unlink a queue entry from its linked MCP server. |
|
|
63
|
+
| `get_unofficial_mirrors` | unofficial_mirrors | read | List unofficial mirrors with search, pagination, and MCP server filtering. |
|
|
64
|
+
| `get_unofficial_mirror` | unofficial_mirrors | read | Get detailed unofficial mirror info by ID or name. |
|
|
65
|
+
| `create_unofficial_mirror` | unofficial_mirrors | write | Create a new unofficial mirror entry with JSON data. |
|
|
66
|
+
| `update_unofficial_mirror` | unofficial_mirrors | write | Update an existing unofficial mirror by ID. |
|
|
67
|
+
| `delete_unofficial_mirror` | unofficial_mirrors | write | Delete an unofficial mirror by ID (irreversible). |
|
|
68
|
+
| `get_official_mirrors` | official_mirrors | read | List official mirrors with search, status, and processing filters. |
|
|
69
|
+
| `get_official_mirror` | official_mirrors | read | Get detailed official mirror info by ID or name. |
|
|
70
|
+
| `get_tenants` | tenants | read | List tenants with search and admin status filtering. |
|
|
71
|
+
| `get_tenant` | tenants | read | Get detailed tenant info by ID or slug. |
|
|
72
|
+
| `create_tenant` | tenants | write | Create a new tenant for sub-registry provisioning. |
|
|
73
|
+
| `create_api_key` | tenants | write | Create an API key for a tenant. Returns the raw key (only available at creation time). |
|
|
74
|
+
| `revoke_api_key` | tenants | write | Revoke an API key by ID, immediately invalidating it. Idempotent. Requires elicitation approval. |
|
|
75
|
+
| `delete_tenant` | tenants_destructive | write | Permanently delete a tenant. Requires elicitation approval. With `force: true`, cascades to dependents. |
|
|
76
|
+
| `delete_api_key` | tenants_destructive | write | Permanently revoke (delete) an API key. Idempotent. Requires elicitation approval. |
|
|
77
|
+
| `get_mcp_jsons` | mcp_jsons | read | List MCP JSON configs with mirror and server filtering. |
|
|
78
|
+
| `get_mcp_json` | mcp_jsons | read | Get a single MCP JSON configuration by ID. |
|
|
79
|
+
| `create_mcp_json` | mcp_jsons | write | Create a new MCP JSON configuration for an unofficial mirror. |
|
|
80
|
+
| `update_mcp_json` | mcp_jsons | write | Update an existing MCP JSON configuration by ID. |
|
|
81
|
+
| `delete_mcp_json` | mcp_jsons | write | Delete an MCP JSON configuration by ID (irreversible). |
|
|
82
|
+
| `list_mcp_servers` | mcp_servers | read | List/search MCP servers with filtering by status, classification, pagination. |
|
|
83
|
+
| `get_mcp_server` | mcp_servers | read | Get detailed MCP server info by slug (unified view of all admin UI fields). |
|
|
84
|
+
| `update_mcp_server` | mcp_servers | write | Update an MCP server's fields (all admin UI fields supported). |
|
|
85
|
+
| `recache_mcp_server` | mcp_servers | write | Refresh the cache for a specific MCP server (show page, cards, canonicals, parent pages). |
|
|
86
|
+
| `set_github_repository_classification` | mcp_servers | write | Set a GitHub repository's `classification` (e.g. `other` to drop a non-MCP-driven platform repo from the gh_stars popularity path). |
|
|
87
|
+
| `get_redirects` | redirects | read | List URL redirects with search, status filtering, and pagination. |
|
|
88
|
+
| `get_redirect` | redirects | read | Get detailed redirect info by ID. |
|
|
89
|
+
| `create_redirect` | redirects | write | Create a new URL redirect entry. |
|
|
90
|
+
| `update_redirect` | redirects | write | Update an existing URL redirect by ID. |
|
|
91
|
+
| `delete_redirect` | redirects | write | Delete a URL redirect by ID (irreversible). |
|
|
92
|
+
| `list_good_jobs` | good_jobs | read | List and filter background jobs by queue, status, job class, and date range. |
|
|
93
|
+
| `get_good_job` | good_jobs | read | Get detailed information about a specific background job. |
|
|
94
|
+
| `list_good_job_cron_schedules` | good_jobs | read | List all configured cron schedules. |
|
|
95
|
+
| `list_good_job_processes` | good_jobs | read | List active worker processes. |
|
|
96
|
+
| `get_good_job_queue_statistics` | good_jobs | read | Get aggregate job statistics by status. |
|
|
97
|
+
| `retry_good_job` | good_jobs | write | Retry a failed or discarded background job. |
|
|
98
|
+
| `discard_good_job` | good_jobs | write | Discard a background job to prevent retries. |
|
|
99
|
+
| `reschedule_good_job` | good_jobs | write | Reschedule a background job to a new time. |
|
|
100
|
+
| `force_trigger_good_job_cron` | good_jobs | write | Force trigger a cron schedule immediately. |
|
|
101
|
+
| `cleanup_good_jobs` | good_jobs | write | Clean up old background jobs by status and age. |
|
|
102
|
+
| `run_exam_for_mirror` | proctor | write | Run proctor exams against unofficial mirrors via Fly Machines. Returns truncated summary with `result_id`. |
|
|
103
|
+
| `get_exam_result` | proctor | read | Retrieve full untruncated exam results by `result_id`, with optional section/mirror filtering. |
|
|
104
|
+
| `save_results_for_mirror` | proctor | write | Save proctor exam results via `result_id` from `run_exam_for_mirror`. |
|
|
105
|
+
| `list_proctor_runs` | proctor | read | List proctor runs with filtering by name, recommended status, and tenant IDs. |
|
|
106
|
+
| `get_proctor_metadata` | proctor | read | Get available proctor runtimes and exam types. |
|
|
107
|
+
| `list_discovered_urls` | discovered_urls | read | List discovered URLs with status filtering and pagination. |
|
|
108
|
+
| `mark_discovered_url_processed` | discovered_urls | write | Mark a discovered URL as processed with a result status. |
|
|
109
|
+
| `get_discovered_url_stats` | discovered_urls | read | Get summary statistics for discovered URLs pipeline. |
|
|
110
|
+
| `get_moz_metrics` | moz | read | Fetch live URL metrics from the MOZ API (page authority, domain authority, spam score, link counts). |
|
|
111
|
+
| `get_moz_backlinks` | moz | read | Fetch live backlink data from the MOZ API (source pages, anchor text, domain authority). |
|
|
112
|
+
| `get_moz_stored_metrics` | moz | read | List stored/historical MOZ data for a server's canonicals with pagination. |
|
|
112
113
|
|
|
113
114
|
# Tool Groups
|
|
114
115
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { adminFetch } from './admin-fetch.js';
|
|
2
|
+
export async function setGithubRepositoryClassification(apiKey, baseUrl, id, classification) {
|
|
3
|
+
const url = new URL(`/api/github_repositories/${id}/classification`, baseUrl);
|
|
4
|
+
const body = {
|
|
5
|
+
classification,
|
|
6
|
+
};
|
|
7
|
+
const response = await adminFetch(url.toString(), {
|
|
8
|
+
method: 'POST',
|
|
9
|
+
headers: {
|
|
10
|
+
'X-API-Key': apiKey,
|
|
11
|
+
Accept: 'application/json',
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify(body),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
if (response.status === 401) {
|
|
18
|
+
throw new Error('Invalid API key');
|
|
19
|
+
}
|
|
20
|
+
if (response.status === 403) {
|
|
21
|
+
throw new Error('User lacks write privileges');
|
|
22
|
+
}
|
|
23
|
+
if (response.status === 404) {
|
|
24
|
+
throw new Error(`GitHub repository not found: ${id}`);
|
|
25
|
+
}
|
|
26
|
+
if (response.status === 400) {
|
|
27
|
+
const errBody = (await response.json().catch(() => ({})));
|
|
28
|
+
throw new Error(errBody.error ?? 'Bad request');
|
|
29
|
+
}
|
|
30
|
+
if (response.status === 422) {
|
|
31
|
+
const errBody = (await response.json().catch(() => ({})));
|
|
32
|
+
const detailStr = errBody.details?.length ? ` (${errBody.details.join(', ')})` : '';
|
|
33
|
+
throw new Error(`${errBody.error ?? 'Validation failed'}${detailStr}`);
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`Failed to set github_repository classification: ${response.status} ${response.statusText}`);
|
|
36
|
+
}
|
|
37
|
+
return (await response.json());
|
|
38
|
+
}
|
|
@@ -1099,5 +1099,11 @@ export function createMockPulseMCPAdminClient(mockData) {
|
|
|
1099
1099
|
: (knownMissingInitToolsListFilterTo ?? null),
|
|
1100
1100
|
};
|
|
1101
1101
|
},
|
|
1102
|
+
async setGithubRepositoryClassification(id, classification) {
|
|
1103
|
+
return {
|
|
1104
|
+
id,
|
|
1105
|
+
classification,
|
|
1106
|
+
};
|
|
1107
|
+
},
|
|
1102
1108
|
};
|
|
1103
1109
|
}
|
|
@@ -74,6 +74,7 @@ import { getMozBacklinks } from './pulsemcp-admin-client/lib/get-moz-backlinks.j
|
|
|
74
74
|
import { getMozStoredMetrics } from './pulsemcp-admin-client/lib/get-moz-stored-metrics.js';
|
|
75
75
|
import { recacheMCPServer } from './pulsemcp-admin-client/lib/recache-mcp-server.js';
|
|
76
76
|
import { setKnownMissingInitToolsList } from './pulsemcp-admin-client/lib/set-known-missing-init-tools-list.js';
|
|
77
|
+
import { setGithubRepositoryClassification } from './pulsemcp-admin-client/lib/set-github-repository-classification.js';
|
|
77
78
|
import { createTenant } from './pulsemcp-admin-client/lib/create-tenant.js';
|
|
78
79
|
import { createApiKey } from './pulsemcp-admin-client/lib/create-api-key.js';
|
|
79
80
|
import { deleteTenant } from './pulsemcp-admin-client/lib/delete-tenant.js';
|
|
@@ -250,6 +251,9 @@ export class PulseMCPAdminClient {
|
|
|
250
251
|
async setKnownMissingInitToolsList(id, knownMissingInitToolsList, knownMissingInitToolsListFilterTo) {
|
|
251
252
|
return setKnownMissingInitToolsList(this.apiKey, this.baseUrl, id, knownMissingInitToolsList, knownMissingInitToolsListFilterTo);
|
|
252
253
|
}
|
|
254
|
+
async setGithubRepositoryClassification(id, classification) {
|
|
255
|
+
return setGithubRepositoryClassification(this.apiKey, this.baseUrl, id, classification);
|
|
256
|
+
}
|
|
253
257
|
// Redirect REST API methods
|
|
254
258
|
async getRedirects(params) {
|
|
255
259
|
return getRedirects(this.apiKey, this.baseUrl, params);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const CLASSIFICATION_VALUES = [
|
|
3
|
+
'single_mcp_server',
|
|
4
|
+
'single_mcp_client',
|
|
5
|
+
'multiple_mcp_servers',
|
|
6
|
+
'multiple_mcp_clients',
|
|
7
|
+
'other',
|
|
8
|
+
];
|
|
9
|
+
const PARAM_DESCRIPTIONS = {
|
|
10
|
+
id: 'The integer id of the GitHub repository record (github_repositories.id).',
|
|
11
|
+
classification: `The classification to set on the GitHub repository. One of: ${CLASSIFICATION_VALUES.join(', ')}.
|
|
12
|
+
|
|
13
|
+
- single_mcp_server: the repo is a single MCP server (counts toward the gh_stars popularity path).
|
|
14
|
+
- single_mcp_client: the repo is a single MCP client.
|
|
15
|
+
- multiple_mcp_servers: the repo hosts multiple MCP servers.
|
|
16
|
+
- multiple_mcp_clients: the repo hosts multiple MCP clients.
|
|
17
|
+
- other: NOT a single MCP server (e.g. a broader platform where MCP is one incidental feature). Setting "other" excludes the repo from the gh_stars popularity path — int_github_repositories.sql maps it to mcp_server_count = 0, dropping it from the normalized downloads estimate.`,
|
|
18
|
+
};
|
|
19
|
+
const SetGithubRepositoryClassificationSchema = z.object({
|
|
20
|
+
id: z.number().int().describe(PARAM_DESCRIPTIONS.id),
|
|
21
|
+
classification: z.enum(CLASSIFICATION_VALUES).describe(PARAM_DESCRIPTIONS.classification),
|
|
22
|
+
});
|
|
23
|
+
export function setGithubRepositoryClassification(_server, clientFactory) {
|
|
24
|
+
return {
|
|
25
|
+
name: 'set_github_repository_classification',
|
|
26
|
+
description: `Set the \`classification\` field on a GitHub repository record (github_repositories). Identifies the repository by its integer id.
|
|
27
|
+
|
|
28
|
+
The primary use case is tagging a repository as \`other\` ("not a single MCP server") so it stops inflating PulseMCP popularity estimates. When a broad platform repo (e.g. heyputer/puter) carries a large GitHub-star count, the gh_stars path overstates MCP adoption; setting \`classification: "other"\` drops the repo out of that path (int_github_repositories.sql maps "other" to mcp_server_count = 0). The corrected estimate propagates on the next BigQuery warehouse rebuild and the subsequent UpdatePopularityEstimatesFromBigqueryJob run.
|
|
29
|
+
|
|
30
|
+
Example request:
|
|
31
|
+
{
|
|
32
|
+
"id": 12345,
|
|
33
|
+
"classification": "other"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Use cases:
|
|
37
|
+
- Tag a non-MCP-driven platform repo as "other" to exclude it from gh_stars-based popularity
|
|
38
|
+
- Correct a misclassified repository (e.g. a client repo tagged as a server)`,
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: 'object',
|
|
41
|
+
properties: {
|
|
42
|
+
id: { type: 'integer', description: PARAM_DESCRIPTIONS.id },
|
|
43
|
+
classification: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
enum: [...CLASSIFICATION_VALUES],
|
|
46
|
+
description: PARAM_DESCRIPTIONS.classification,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
required: ['id', 'classification'],
|
|
50
|
+
},
|
|
51
|
+
handler: async (args) => {
|
|
52
|
+
const validatedArgs = SetGithubRepositoryClassificationSchema.parse(args);
|
|
53
|
+
const client = clientFactory();
|
|
54
|
+
try {
|
|
55
|
+
const result = await client.setGithubRepositoryClassification(validatedArgs.id, validatedArgs.classification);
|
|
56
|
+
const text = `Updated GitHub repository (id: ${result.id}):
|
|
57
|
+
- classification: ${result.classification}`;
|
|
58
|
+
return { content: [{ type: 'text', text }] };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `Error setting github_repository classification: ${error instanceof Error ? error.message : String(error)}`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -48,6 +48,7 @@ import { listMCPServers } from './tools/list-mcp-servers.js';
|
|
|
48
48
|
import { getMCPServer } from './tools/get-mcp-server.js';
|
|
49
49
|
import { updateMCPServer } from './tools/update-mcp-server.js';
|
|
50
50
|
import { recacheMCPServer } from './tools/recache-mcp-server.js';
|
|
51
|
+
import { setGithubRepositoryClassification } from './tools/set-github-repository-classification.js';
|
|
51
52
|
// Redirect tools
|
|
52
53
|
import { getRedirects } from './tools/get-redirects.js';
|
|
53
54
|
import { getRedirect } from './tools/get-redirect.js';
|
|
@@ -281,6 +282,16 @@ const ALL_TOOLS = [
|
|
|
281
282
|
groups: ['mcp_servers', 'server_directory'],
|
|
282
283
|
isWriteOperation: true,
|
|
283
284
|
},
|
|
285
|
+
// setGithubRepositoryClassification writes the `classification` field on a
|
|
286
|
+
// `github_repository` record (e.g. tagging a non-MCP-driven platform repo as
|
|
287
|
+
// `other` so it drops out of the gh_stars popularity path). It lives in the
|
|
288
|
+
// mcp_servers / server_directory groups alongside the other server-directory
|
|
289
|
+
// data-correction tools.
|
|
290
|
+
{
|
|
291
|
+
factory: setGithubRepositoryClassification,
|
|
292
|
+
groups: ['mcp_servers', 'server_directory'],
|
|
293
|
+
isWriteOperation: true,
|
|
294
|
+
},
|
|
284
295
|
// Discovered URLs tools
|
|
285
296
|
{ factory: listDiscoveredUrls, groups: ['discovered_urls'], isWriteOperation: false },
|
|
286
297
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pulsemcp-cms-admin-mcp-server",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.4",
|
|
4
4
|
"description": "Local implementation of PulseMCP CMS Admin MCP server",
|
|
5
5
|
"mcpName": "com.pulsemcp/pulsemcp-cms-admin",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
39
39
|
"@pulsemcp/mcp-elicitation": "file:../../../libs/elicitation",
|
|
40
|
-
"zod": "^3.
|
|
40
|
+
"zod": "^3.25.76"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^22.10.6",
|
|
44
|
-
"tsx": "^4.
|
|
44
|
+
"tsx": "^4.22.4",
|
|
45
45
|
"typescript": "^5.7.3"
|
|
46
46
|
},
|
|
47
47
|
"keywords": [],
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GithubRepositoryClassification, SetGithubRepositoryClassificationResponse } from '../../types.js';
|
|
2
|
+
export declare function setGithubRepositoryClassification(apiKey: string, baseUrl: string, id: number, classification: GithubRepositoryClassification): Promise<SetGithubRepositoryClassificationResponse>;
|
|
3
|
+
//# sourceMappingURL=set-github-repository-classification.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { adminFetch } from './admin-fetch.js';
|
|
2
|
+
export async function setGithubRepositoryClassification(apiKey, baseUrl, id, classification) {
|
|
3
|
+
const url = new URL(`/api/github_repositories/${id}/classification`, baseUrl);
|
|
4
|
+
const body = {
|
|
5
|
+
classification,
|
|
6
|
+
};
|
|
7
|
+
const response = await adminFetch(url.toString(), {
|
|
8
|
+
method: 'POST',
|
|
9
|
+
headers: {
|
|
10
|
+
'X-API-Key': apiKey,
|
|
11
|
+
Accept: 'application/json',
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify(body),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
if (response.status === 401) {
|
|
18
|
+
throw new Error('Invalid API key');
|
|
19
|
+
}
|
|
20
|
+
if (response.status === 403) {
|
|
21
|
+
throw new Error('User lacks write privileges');
|
|
22
|
+
}
|
|
23
|
+
if (response.status === 404) {
|
|
24
|
+
throw new Error(`GitHub repository not found: ${id}`);
|
|
25
|
+
}
|
|
26
|
+
if (response.status === 400) {
|
|
27
|
+
const errBody = (await response.json().catch(() => ({})));
|
|
28
|
+
throw new Error(errBody.error ?? 'Bad request');
|
|
29
|
+
}
|
|
30
|
+
if (response.status === 422) {
|
|
31
|
+
const errBody = (await response.json().catch(() => ({})));
|
|
32
|
+
const detailStr = errBody.details?.length ? ` (${errBody.details.join(', ')})` : '';
|
|
33
|
+
throw new Error(`${errBody.error ?? 'Validation failed'}${detailStr}`);
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`Failed to set github_repository classification: ${response.status} ${response.statusText}`);
|
|
36
|
+
}
|
|
37
|
+
return (await response.json());
|
|
38
|
+
}
|
|
@@ -1099,5 +1099,11 @@ export function createMockPulseMCPAdminClient(mockData) {
|
|
|
1099
1099
|
: (knownMissingInitToolsListFilterTo ?? null),
|
|
1100
1100
|
};
|
|
1101
1101
|
},
|
|
1102
|
+
async setGithubRepositoryClassification(id, classification) {
|
|
1103
|
+
return {
|
|
1104
|
+
id,
|
|
1105
|
+
classification,
|
|
1106
|
+
};
|
|
1107
|
+
},
|
|
1102
1108
|
};
|
|
1103
1109
|
}
|
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, ListTenantServersResponse, BulkUpdateTenantServersParams, BulkUpdateTenantServersResponse, McpJson, McpJsonsResponse, CreateMcpJsonParams, UpdateMcpJsonParams, UnifiedMCPServer, UnifiedMCPServersResponse, UpdateUnifiedMCPServerParams, Redirect, RedirectsResponse, RedirectStatus, CreateRedirectParams, UpdateRedirectParams, GoodJob, GoodJobsResponse, GoodJobStatus, GoodJobCronSchedule, GoodJobProcess, GoodJobStatistics, GoodJobActionResponse, GoodJobCleanupResponse, PopularityDropBypassStatus, ProctorRunExamParams, ProctorRunExamResponse, ProctorSaveResultsParams, ProctorSaveResultsResponse, ProctorRunsResponse, GetProctorRunsParams, ProctorMetadataResponse, DiscoveredUrlsResponse, MarkDiscoveredUrlProcessedParams, MarkDiscoveredUrlProcessedResponse, DiscoveredUrlStats, MozMetricsResponse, MozBacklinksResponse, MozStoredMetricsResponse, CreateTenantParams, ApiKey, CreateApiKeyParams, DeleteTenantParams, DeleteTenantResponse, DeleteApiKeyResponse, RecacheMCPServerResponse, SetKnownMissingInitToolsListResponse } 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, ListTenantServersResponse, BulkUpdateTenantServersParams, BulkUpdateTenantServersResponse, McpJson, McpJsonsResponse, CreateMcpJsonParams, UpdateMcpJsonParams, UnifiedMCPServer, UnifiedMCPServersResponse, UpdateUnifiedMCPServerParams, Redirect, RedirectsResponse, RedirectStatus, CreateRedirectParams, UpdateRedirectParams, GoodJob, GoodJobsResponse, GoodJobStatus, GoodJobCronSchedule, GoodJobProcess, GoodJobStatistics, GoodJobActionResponse, GoodJobCleanupResponse, PopularityDropBypassStatus, ProctorRunExamParams, ProctorRunExamResponse, ProctorSaveResultsParams, ProctorSaveResultsResponse, ProctorRunsResponse, GetProctorRunsParams, ProctorMetadataResponse, DiscoveredUrlsResponse, MarkDiscoveredUrlProcessedParams, MarkDiscoveredUrlProcessedResponse, DiscoveredUrlStats, MozMetricsResponse, MozBacklinksResponse, MozStoredMetricsResponse, CreateTenantParams, ApiKey, CreateApiKeyParams, DeleteTenantParams, DeleteTenantResponse, DeleteApiKeyResponse, RecacheMCPServerResponse, SetKnownMissingInitToolsListResponse, GithubRepositoryClassification, SetGithubRepositoryClassificationResponse } from './types.js';
|
|
3
3
|
export interface IPulseMCPAdminClient {
|
|
4
4
|
getPosts(params?: {
|
|
5
5
|
search?: string;
|
|
@@ -136,6 +136,7 @@ export interface IPulseMCPAdminClient {
|
|
|
136
136
|
updateUnifiedMCPServer(implementationId: number, params: UpdateUnifiedMCPServerParams): Promise<UnifiedMCPServer>;
|
|
137
137
|
recacheMCPServer(slug: string): Promise<RecacheMCPServerResponse>;
|
|
138
138
|
setKnownMissingInitToolsList(id: number, knownMissingInitToolsList: boolean, knownMissingInitToolsListFilterTo?: string | null): Promise<SetKnownMissingInitToolsListResponse>;
|
|
139
|
+
setGithubRepositoryClassification(id: number, classification: GithubRepositoryClassification): Promise<SetGithubRepositoryClassificationResponse>;
|
|
139
140
|
getRedirects(params?: {
|
|
140
141
|
q?: string;
|
|
141
142
|
status?: RedirectStatus;
|
|
@@ -337,6 +338,7 @@ export declare class PulseMCPAdminClient implements IPulseMCPAdminClient {
|
|
|
337
338
|
updateUnifiedMCPServer(implementationId: number, params: UpdateUnifiedMCPServerParams): Promise<UnifiedMCPServer>;
|
|
338
339
|
recacheMCPServer(slug: string): Promise<RecacheMCPServerResponse>;
|
|
339
340
|
setKnownMissingInitToolsList(id: number, knownMissingInitToolsList: boolean, knownMissingInitToolsListFilterTo?: string | null): Promise<SetKnownMissingInitToolsListResponse>;
|
|
341
|
+
setGithubRepositoryClassification(id: number, classification: GithubRepositoryClassification): Promise<SetGithubRepositoryClassificationResponse>;
|
|
340
342
|
getRedirects(params?: {
|
|
341
343
|
q?: string;
|
|
342
344
|
status?: RedirectStatus;
|
package/shared/server.js
CHANGED
|
@@ -74,6 +74,7 @@ import { getMozBacklinks } from './pulsemcp-admin-client/lib/get-moz-backlinks.j
|
|
|
74
74
|
import { getMozStoredMetrics } from './pulsemcp-admin-client/lib/get-moz-stored-metrics.js';
|
|
75
75
|
import { recacheMCPServer } from './pulsemcp-admin-client/lib/recache-mcp-server.js';
|
|
76
76
|
import { setKnownMissingInitToolsList } from './pulsemcp-admin-client/lib/set-known-missing-init-tools-list.js';
|
|
77
|
+
import { setGithubRepositoryClassification } from './pulsemcp-admin-client/lib/set-github-repository-classification.js';
|
|
77
78
|
import { createTenant } from './pulsemcp-admin-client/lib/create-tenant.js';
|
|
78
79
|
import { createApiKey } from './pulsemcp-admin-client/lib/create-api-key.js';
|
|
79
80
|
import { deleteTenant } from './pulsemcp-admin-client/lib/delete-tenant.js';
|
|
@@ -250,6 +251,9 @@ export class PulseMCPAdminClient {
|
|
|
250
251
|
async setKnownMissingInitToolsList(id, knownMissingInitToolsList, knownMissingInitToolsListFilterTo) {
|
|
251
252
|
return setKnownMissingInitToolsList(this.apiKey, this.baseUrl, id, knownMissingInitToolsList, knownMissingInitToolsListFilterTo);
|
|
252
253
|
}
|
|
254
|
+
async setGithubRepositoryClassification(id, classification) {
|
|
255
|
+
return setGithubRepositoryClassification(this.apiKey, this.baseUrl, id, classification);
|
|
256
|
+
}
|
|
253
257
|
// Redirect REST API methods
|
|
254
258
|
async getRedirects(params) {
|
|
255
259
|
return getRedirects(this.apiKey, this.baseUrl, params);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import type { ClientFactory } from '../server.js';
|
|
3
|
+
export declare function setGithubRepositoryClassification(_server: Server, clientFactory: ClientFactory): {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: string;
|
|
8
|
+
properties: {
|
|
9
|
+
id: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: "The integer id of the GitHub repository record (github_repositories.id).";
|
|
12
|
+
};
|
|
13
|
+
classification: {
|
|
14
|
+
type: string;
|
|
15
|
+
enum: ("other" | "single_mcp_server" | "single_mcp_client" | "multiple_mcp_servers" | "multiple_mcp_clients")[];
|
|
16
|
+
description: `The classification to set on the GitHub repository. One of: ${string}.
|
|
17
|
+
|
|
18
|
+
- single_mcp_server: the repo is a single MCP server (counts toward the gh_stars popularity path).
|
|
19
|
+
- single_mcp_client: the repo is a single MCP client.
|
|
20
|
+
- multiple_mcp_servers: the repo hosts multiple MCP servers.
|
|
21
|
+
- multiple_mcp_clients: the repo hosts multiple MCP clients.
|
|
22
|
+
- other: NOT a single MCP server (e.g. a broader platform where MCP is one incidental feature). Setting "other" excludes the repo from the gh_stars popularity path \u2014 int_github_repositories.sql maps it to mcp_server_count = 0, dropping it from the normalized downloads estimate.`;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
required: string[];
|
|
26
|
+
};
|
|
27
|
+
handler: (args: unknown) => Promise<{
|
|
28
|
+
content: {
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}[];
|
|
32
|
+
isError?: undefined;
|
|
33
|
+
} | {
|
|
34
|
+
content: {
|
|
35
|
+
type: string;
|
|
36
|
+
text: string;
|
|
37
|
+
}[];
|
|
38
|
+
isError: boolean;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=set-github-repository-classification.d.ts.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const CLASSIFICATION_VALUES = [
|
|
3
|
+
'single_mcp_server',
|
|
4
|
+
'single_mcp_client',
|
|
5
|
+
'multiple_mcp_servers',
|
|
6
|
+
'multiple_mcp_clients',
|
|
7
|
+
'other',
|
|
8
|
+
];
|
|
9
|
+
const PARAM_DESCRIPTIONS = {
|
|
10
|
+
id: 'The integer id of the GitHub repository record (github_repositories.id).',
|
|
11
|
+
classification: `The classification to set on the GitHub repository. One of: ${CLASSIFICATION_VALUES.join(', ')}.
|
|
12
|
+
|
|
13
|
+
- single_mcp_server: the repo is a single MCP server (counts toward the gh_stars popularity path).
|
|
14
|
+
- single_mcp_client: the repo is a single MCP client.
|
|
15
|
+
- multiple_mcp_servers: the repo hosts multiple MCP servers.
|
|
16
|
+
- multiple_mcp_clients: the repo hosts multiple MCP clients.
|
|
17
|
+
- other: NOT a single MCP server (e.g. a broader platform where MCP is one incidental feature). Setting "other" excludes the repo from the gh_stars popularity path — int_github_repositories.sql maps it to mcp_server_count = 0, dropping it from the normalized downloads estimate.`,
|
|
18
|
+
};
|
|
19
|
+
const SetGithubRepositoryClassificationSchema = z.object({
|
|
20
|
+
id: z.number().int().describe(PARAM_DESCRIPTIONS.id),
|
|
21
|
+
classification: z.enum(CLASSIFICATION_VALUES).describe(PARAM_DESCRIPTIONS.classification),
|
|
22
|
+
});
|
|
23
|
+
export function setGithubRepositoryClassification(_server, clientFactory) {
|
|
24
|
+
return {
|
|
25
|
+
name: 'set_github_repository_classification',
|
|
26
|
+
description: `Set the \`classification\` field on a GitHub repository record (github_repositories). Identifies the repository by its integer id.
|
|
27
|
+
|
|
28
|
+
The primary use case is tagging a repository as \`other\` ("not a single MCP server") so it stops inflating PulseMCP popularity estimates. When a broad platform repo (e.g. heyputer/puter) carries a large GitHub-star count, the gh_stars path overstates MCP adoption; setting \`classification: "other"\` drops the repo out of that path (int_github_repositories.sql maps "other" to mcp_server_count = 0). The corrected estimate propagates on the next BigQuery warehouse rebuild and the subsequent UpdatePopularityEstimatesFromBigqueryJob run.
|
|
29
|
+
|
|
30
|
+
Example request:
|
|
31
|
+
{
|
|
32
|
+
"id": 12345,
|
|
33
|
+
"classification": "other"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Use cases:
|
|
37
|
+
- Tag a non-MCP-driven platform repo as "other" to exclude it from gh_stars-based popularity
|
|
38
|
+
- Correct a misclassified repository (e.g. a client repo tagged as a server)`,
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: 'object',
|
|
41
|
+
properties: {
|
|
42
|
+
id: { type: 'integer', description: PARAM_DESCRIPTIONS.id },
|
|
43
|
+
classification: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
enum: [...CLASSIFICATION_VALUES],
|
|
46
|
+
description: PARAM_DESCRIPTIONS.classification,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
required: ['id', 'classification'],
|
|
50
|
+
},
|
|
51
|
+
handler: async (args) => {
|
|
52
|
+
const validatedArgs = SetGithubRepositoryClassificationSchema.parse(args);
|
|
53
|
+
const client = clientFactory();
|
|
54
|
+
try {
|
|
55
|
+
const result = await client.setGithubRepositoryClassification(validatedArgs.id, validatedArgs.classification);
|
|
56
|
+
const text = `Updated GitHub repository (id: ${result.id}):
|
|
57
|
+
- classification: ${result.classification}`;
|
|
58
|
+
return { content: [{ type: 'text', text }] };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `Error setting github_repository classification: ${error instanceof Error ? error.message : String(error)}`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
package/shared/tools.js
CHANGED
|
@@ -48,6 +48,7 @@ import { listMCPServers } from './tools/list-mcp-servers.js';
|
|
|
48
48
|
import { getMCPServer } from './tools/get-mcp-server.js';
|
|
49
49
|
import { updateMCPServer } from './tools/update-mcp-server.js';
|
|
50
50
|
import { recacheMCPServer } from './tools/recache-mcp-server.js';
|
|
51
|
+
import { setGithubRepositoryClassification } from './tools/set-github-repository-classification.js';
|
|
51
52
|
// Redirect tools
|
|
52
53
|
import { getRedirects } from './tools/get-redirects.js';
|
|
53
54
|
import { getRedirect } from './tools/get-redirect.js';
|
|
@@ -281,6 +282,16 @@ const ALL_TOOLS = [
|
|
|
281
282
|
groups: ['mcp_servers', 'server_directory'],
|
|
282
283
|
isWriteOperation: true,
|
|
283
284
|
},
|
|
285
|
+
// setGithubRepositoryClassification writes the `classification` field on a
|
|
286
|
+
// `github_repository` record (e.g. tagging a non-MCP-driven platform repo as
|
|
287
|
+
// `other` so it drops out of the gh_stars popularity path). It lives in the
|
|
288
|
+
// mcp_servers / server_directory groups alongside the other server-directory
|
|
289
|
+
// data-correction tools.
|
|
290
|
+
{
|
|
291
|
+
factory: setGithubRepositoryClassification,
|
|
292
|
+
groups: ['mcp_servers', 'server_directory'],
|
|
293
|
+
isWriteOperation: true,
|
|
294
|
+
},
|
|
284
295
|
// Discovered URLs tools
|
|
285
296
|
{ factory: listDiscoveredUrls, groups: ['discovered_urls'], isWriteOperation: false },
|
|
286
297
|
{
|
package/shared/types.d.ts
CHANGED
|
@@ -897,6 +897,11 @@ export interface SetKnownMissingInitToolsListResponse {
|
|
|
897
897
|
known_missing_init_tools_list: boolean;
|
|
898
898
|
known_missing_init_tools_list_filter_to: string | null;
|
|
899
899
|
}
|
|
900
|
+
export type GithubRepositoryClassification = 'single_mcp_server' | 'single_mcp_client' | 'multiple_mcp_servers' | 'multiple_mcp_clients' | 'other';
|
|
901
|
+
export interface SetGithubRepositoryClassificationResponse {
|
|
902
|
+
id: number;
|
|
903
|
+
classification: GithubRepositoryClassification;
|
|
904
|
+
}
|
|
900
905
|
export interface PopularityDropBypassStatus {
|
|
901
906
|
enabled: boolean;
|
|
902
907
|
enabled_at: string | null;
|