@digestseo/mcp-gsc 0.4.20 → 0.4.22
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 +14 -0
- package/README.md +3 -1
- package/package.json +3 -3
- package/scripts/glama-start.mjs +15 -0
- package/src/indexing-property-authorization.ts +3 -10
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.22] - 2026-09-22
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- The repository's Cursor plugin now bundles native `gsc-weekly-review`, `gsc-indexing-triage`, and `gsc-search-opportunities` Agent Skills that compose existing MCP tools into evidence-safe Search Console workflows without adding a second tool surface.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- The production Wrangler floor is now 4.136.3, and the Cloudflare Vitest plugin floor is 1.2.3, so runtime/test installs use Cloudflare's patched Wrangler line for the bundled `smol-toml` denial-of-service advisories GHSA-7w5x-hrqm-74c2 and GHSA-v3rj-xjv7-4jmq.
|
|
17
|
+
|
|
18
|
+
## [0.4.21] - 2026-09-22
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- The published npm launcher now fails before starting Wrangler when any required Google OAuth/token-encryption environment variable is missing or blank, reporting only the missing variable names instead of allowing a broken local OAuth session to start.
|
|
22
|
+
- URL Inspection and Indexing API authorization now follow Search Console's literal URL-prefix property semantics instead of inventing a path-segment boundary when a provider-returned property identifier does not end in `/`.
|
|
23
|
+
|
|
10
24
|
## [0.4.20] - 2026-09-22
|
|
11
25
|
|
|
12
26
|
### Fixed
|
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ The self-hosting launcher is available as [`@digestseo/mcp-gsc`](https://www.npm
|
|
|
22
22
|
npx -y @digestseo/mcp-gsc
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
The npm launcher starts a loopback-only **Streamable HTTP** Worker on `127.0.0.1` (port `8080` by default); it is not a stdio MCP process. You can run the `npx` command from any directory because the launcher resolves its bundled Worker configuration from the installed package. Clients that launch the package should connect to `http://127.0.0.1:8080/mcp` after supplying the Google OAuth and token-encryption environment variables described in [SETUP.md](SETUP.md). The launcher
|
|
25
|
+
The npm launcher starts a loopback-only **Streamable HTTP** Worker on `127.0.0.1` (port `8080` by default); it is not a stdio MCP process. You can run the `npx` command from any directory because the launcher resolves its bundled Worker configuration from the installed package. Clients that launch the package should connect to `http://127.0.0.1:8080/mcp` after supplying the Google OAuth and token-encryption environment variables described in [SETUP.md](SETUP.md). The launcher exits before starting Wrangler if `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, or `TOKEN_ENCRYPTION_KEY` is missing or blank, naming only the missing variables so a broken OAuth session is not started. It keeps secret values in the child process environment and Wrangler loads them through declared local secrets; their values are not copied into Wrangler `--var` command-line arguments. Before the first OAuth sign-in, authorize the exact callback `http://127.0.0.1:8080/google/callback` in Google Cloud (or use the same custom `PORT` you launch with); the launcher prints both URLs at startup.
|
|
26
26
|
|
|
27
27
|
Local KV and Durable Object state, including the encrypted Google session, is stored in `~/.mcp-gsc/state` by default instead of inside the versioned npm cache. That keeps the local connection available across package upgrades and ordinary npm cache cleanup. Set `MCP_GSC_STATE_DIR` to use another directory; keep the same `TOKEN_ENCRYPTION_KEY` when reusing existing state because stored refresh tokens are encrypted with that key. The launcher prints the effective state directory at startup. The first release with this stable path may require one Google reconnect because older launcher releases stored local state under the npm package cache.
|
|
28
28
|
|
|
@@ -56,6 +56,8 @@ claude mcp add --transport http gsc http://127.0.0.1:8080/mcp
|
|
|
56
56
|
|
|
57
57
|
[](https://cursor.com/en/install-mcp?name=gsc&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjgwODAvbWNwIn0%3D)
|
|
58
58
|
|
|
59
|
+
When this repository is installed as a Cursor plugin, Cursor also auto-discovers three bundled Agent Skills that compose the MCP tools into evidence-safe workflows: `gsc-weekly-review`, `gsc-indexing-triage`, and `gsc-search-opportunities`. The **Add to Cursor** button above installs the MCP connection only; the bundled skills are part of the repository's Cursor plugin package.
|
|
60
|
+
|
|
59
61
|
**Kiro**
|
|
60
62
|
|
|
61
63
|
[](https://kiro.dev/launch/mcp/add?name=mcp-gsc&config=%7B%22url%22%3A%22http%3A%2F%2F127.0.0.1%3A8080%2Fmcp%22%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digestseo/mcp-gsc",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.22",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "scripts/glama-start.mjs",
|
|
6
6
|
"bin": {
|
|
@@ -76,11 +76,11 @@
|
|
|
76
76
|
"@cloudflare/workers-oauth-provider": "^0.10.3",
|
|
77
77
|
"@modelcontextprotocol/server": "2.0.0",
|
|
78
78
|
"agents": "^0.24.0",
|
|
79
|
-
"wrangler": "^4.
|
|
79
|
+
"wrangler": "^4.136.3",
|
|
80
80
|
"zod": "^4.4.3"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
|
-
"@cloudflare/vitest-plugin": "^1.
|
|
83
|
+
"@cloudflare/vitest-plugin": "^1.2.3",
|
|
84
84
|
"@cloudflare/workers-types": "^5.20260919.1",
|
|
85
85
|
"tsx": "^4.20.0",
|
|
86
86
|
"typescript": "^6.0.3",
|
package/scripts/glama-start.mjs
CHANGED
|
@@ -4,6 +4,21 @@ import { constants, homedir } from 'node:os';
|
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
|
|
7
|
+
const requiredEnvironmentVariables = [
|
|
8
|
+
'GOOGLE_CLIENT_ID',
|
|
9
|
+
'GOOGLE_CLIENT_SECRET',
|
|
10
|
+
'TOKEN_ENCRYPTION_KEY',
|
|
11
|
+
];
|
|
12
|
+
const missingRequiredEnvironmentVariables = requiredEnvironmentVariables.filter(
|
|
13
|
+
(name) => !process.env[name]?.trim(),
|
|
14
|
+
);
|
|
15
|
+
if (missingRequiredEnvironmentVariables.length > 0) {
|
|
16
|
+
console.error(
|
|
17
|
+
`[mcp-gsc] Missing required environment variables: ${missingRequiredEnvironmentVariables.join(', ')}. See SETUP.md for local launcher configuration.`,
|
|
18
|
+
);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
|
|
7
22
|
const port = process.env.PORT || '8080';
|
|
8
23
|
const localBaseUrl = `http://127.0.0.1:${port}`;
|
|
9
24
|
const mcpUrl = `${localBaseUrl}/mcp`;
|
|
@@ -60,16 +60,9 @@ function normalizeSiteUrl(siteUrl: string): string {
|
|
|
60
60
|
function isWithinUrlPrefix(target: URL, property: URL): boolean {
|
|
61
61
|
if (target.origin !== property.origin) return false;
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
? propertyPath
|
|
67
|
-
: `${propertyPath}/`;
|
|
68
|
-
|
|
69
|
-
return (
|
|
70
|
-
target.pathname === propertyPath ||
|
|
71
|
-
target.pathname.startsWith(descendantPrefix)
|
|
72
|
-
);
|
|
63
|
+
// Search Console URL-prefix properties are literal URL prefixes. Do not
|
|
64
|
+
// strengthen a provider-returned prefix into an invented path boundary.
|
|
65
|
+
return target.href.startsWith(property.href);
|
|
73
66
|
}
|
|
74
67
|
|
|
75
68
|
function isWithinDomainProperty(target: URL, domain: string): boolean {
|