@digestseo/mcp-gsc 0.4.13 → 0.4.14
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/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/index.ts +18 -4
- package/src/write-tool-annotations.ts +9 -8
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.14] - 2026-09-22
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- `sites.add` now explicitly reports that adding a Search Console property does not perform ownership verification, preventing agents from confusing the Search Console Sites API with Google's separate Site Verification workflow.
|
|
14
|
+
- MCP write annotations now classify `sites.add` and `sitemaps.submit` as additive (`destructiveHint: false`) while keeping the delete tools destructive, matching the protocol's risk vocabulary instead of labeling every external mutation as destructive.
|
|
15
|
+
|
|
10
16
|
## [0.4.13] - 2026-09-22
|
|
11
17
|
|
|
12
18
|
### Fixed
|
package/README.md
CHANGED
|
@@ -85,7 +85,7 @@ By default (`GSC_ACCESS_MODE=readwrite`), this server exposes 21 tools. Read-onl
|
|
|
85
85
|
| **`insights.quick_wins`** / **`insights.cannibalization`** / **`insights.content_decay`** | Read | Surface average-position opportunity rows, query/page overlap, and evidence-ranked click declines. Quick-win candidates are observed query/page rows selected by aggregate Search Console average position, not proof of a stable current rank, and CTR is context rather than an eligibility filter. Cannibalization candidate totals/shares are scoped to observed query/page rows rather than true query-level property totals; content-decay results compare only pages returned in both periods and do not turn one-sided row absence into zero traffic. |
|
|
86
86
|
| **`indexing.list_pages`** / **`analytics.compare`** | Read | Analyze pages receiving Search Console impressions and compare two periods, optionally using the same search type and query/page/country/device/search-appearance filters for both periods. `analytics.compare` compares only dimension keys returned in both period responses; a key absent from one non-exhaustive Search Analytics response is not assumed to have zero metrics. Because its comparison contract includes average position, it excludes Discover and Google News. `indexing.list_pages` is performance data, not index coverage: a missing URL may still be indexed; use `urls.inspect` / `urls.inspect_many` for URL-level index status. |
|
|
87
87
|
| **`reports.weekly_digest`** | Read | Generate a plain-language seven-day performance report with movers, top pages, and one recommended action. Query movers compare only rows returned in both weekly Search Analytics result sets; a query missing from one bounded response is not treated as zero because Google does not guarantee every data row. |
|
|
88
|
-
| **`sites.add`** / **`sites.delete`** | Write | Add or remove a Search Console property. |
|
|
88
|
+
| **`sites.add`** / **`sites.delete`** | Write | Add or remove a Search Console property. `sites.add` only adds the property to the connected account's Search Console site set; it returns `ownership_verification_performed: false` because ownership verification is a separate Google Site Verification/Search Console workflow. |
|
|
89
89
|
| **`sitemaps.submit`** / **`sitemaps.delete`** | Write | Submit or remove a sitemap. |
|
|
90
90
|
| **`indexing.request`** | Write | Requests indexing through Google's Indexing API. Google currently restricts this API to pages containing `JobPosting` structured data or livestream pages containing `BroadcastEvent` inside `VideoObject`. It is not available for general webpage submission. |
|
|
91
91
|
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -210,6 +210,9 @@ const SITE_DETAIL_OUTPUT_SCHEMA = {
|
|
|
210
210
|
site: z.object(SITE_OUTPUT_SCHEMA),
|
|
211
211
|
};
|
|
212
212
|
|
|
213
|
+
const SITE_ADD_VERIFICATION_NOTE =
|
|
214
|
+
"Google Search Console Sites.add only adds the property to the user's Search Console site set; it does not verify ownership. Ownership verification is a separate Google Site Verification/Search Console workflow.";
|
|
215
|
+
|
|
213
216
|
const URL_INSPECTION_SCOPE_NOTE =
|
|
214
217
|
"Google's URL Inspection API reports the version currently known in Google's index; it does not run a live URL test or prove current live-page indexability. The mobileUsabilityResult field is deprecated and may be absent.";
|
|
215
218
|
|
|
@@ -279,6 +282,12 @@ const MESSAGE_OUTPUT_SCHEMA = {
|
|
|
279
282
|
message: z.string(),
|
|
280
283
|
};
|
|
281
284
|
|
|
285
|
+
const SITE_ADD_OUTPUT_SCHEMA = {
|
|
286
|
+
message: z.string(),
|
|
287
|
+
ownership_verification_performed: z.literal(false),
|
|
288
|
+
ownership_verification_note: z.string(),
|
|
289
|
+
};
|
|
290
|
+
|
|
282
291
|
const SEARCH_ANALYTICS_PAGINATION_OUTPUT_SCHEMA = z.object({
|
|
283
292
|
rows_fetched: z.number().int().nonnegative(),
|
|
284
293
|
pages_fetched: z.number().int().positive(),
|
|
@@ -573,7 +582,7 @@ const TOOL_CATALOG = [
|
|
|
573
582
|
{
|
|
574
583
|
name: 'sites.add',
|
|
575
584
|
description:
|
|
576
|
-
'Add a
|
|
585
|
+
'Add a website property to the connected Google account\'s Search Console site set. This does not verify ownership; Google handles ownership verification through a separate Site Verification/Search Console workflow.',
|
|
577
586
|
},
|
|
578
587
|
{
|
|
579
588
|
name: 'sites.delete',
|
|
@@ -1356,11 +1365,11 @@ class GscMcpRuntime {
|
|
|
1356
1365
|
'sites.add',
|
|
1357
1366
|
{
|
|
1358
1367
|
title: 'Add Search Console property',
|
|
1359
|
-
description: 'Add a
|
|
1368
|
+
description: 'Add a website property to the connected Google account\'s Search Console site set. This does not verify ownership. Domain properties require an sc-domain prefix (e.g., sc-domain:example.com); URL-prefix properties require a full URL (e.g., https://example.com/).',
|
|
1360
1369
|
inputSchema: {
|
|
1361
1370
|
site_url: SEARCH_CONSOLE_PROPERTY_SCHEMA,
|
|
1362
1371
|
},
|
|
1363
|
-
outputSchema:
|
|
1372
|
+
outputSchema: SITE_ADD_OUTPUT_SCHEMA,
|
|
1364
1373
|
annotations: WRITE_TOOL_ANNOTATIONS['sites.add'],
|
|
1365
1374
|
},
|
|
1366
1375
|
async ({ site_url }) => {
|
|
@@ -1370,7 +1379,12 @@ class GscMcpRuntime {
|
|
|
1370
1379
|
const accessToken = await this.getAccessToken(googleId);
|
|
1371
1380
|
await addSite(accessToken, site_url);
|
|
1372
1381
|
const message = `Successfully added site property: ${site_url}`;
|
|
1373
|
-
|
|
1382
|
+
const payload = {
|
|
1383
|
+
message,
|
|
1384
|
+
ownership_verification_performed: false as const,
|
|
1385
|
+
ownership_verification_note: SITE_ADD_VERIFICATION_NOTE,
|
|
1386
|
+
};
|
|
1387
|
+
return toolResponse(`${message}\n\n${SITE_ADD_VERIFICATION_NOTE}`, payload);
|
|
1374
1388
|
},
|
|
1375
1389
|
);
|
|
1376
1390
|
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP hints for each mutation exposed by this server.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* MCP defines destructiveHint=false for non-read-only tools that perform only
|
|
5
|
+
* additive updates. Search Console's site addition and sitemap submission are
|
|
6
|
+
* additive PUT operations; the corresponding DELETE operations remain
|
|
7
|
+
* destructive. Indexing publishes a URL_UPDATED notification with POST; each
|
|
8
|
+
* call can consume quota and change Google's indexing state, so it remains
|
|
9
|
+
* conservative (destructive + non-idempotent). Tool annotations are client
|
|
10
|
+
* hints, not an enforcement or confirmation mechanism.
|
|
10
11
|
*/
|
|
11
12
|
export const WRITE_TOOL_ANNOTATIONS = {
|
|
12
13
|
'sites.add': {
|
|
13
14
|
readOnlyHint: false,
|
|
14
|
-
destructiveHint:
|
|
15
|
+
destructiveHint: false,
|
|
15
16
|
idempotentHint: true,
|
|
16
17
|
openWorldHint: true,
|
|
17
18
|
},
|
|
@@ -23,7 +24,7 @@ export const WRITE_TOOL_ANNOTATIONS = {
|
|
|
23
24
|
},
|
|
24
25
|
'sitemaps.submit': {
|
|
25
26
|
readOnlyHint: false,
|
|
26
|
-
destructiveHint:
|
|
27
|
+
destructiveHint: false,
|
|
27
28
|
idempotentHint: true,
|
|
28
29
|
openWorldHint: true,
|
|
29
30
|
},
|