@digestseo/mcp-gsc 0.4.18 → 0.4.19

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 CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.19] - 2026-09-22
11
+
12
+ ### Fixed
13
+ - Search Analytics freshness metadata now normalizes Google's camelCase `firstIncompleteDate` / `firstIncompleteHour` wire fields into the stable MCP `first_incomplete_date` / `first_incomplete_hour` response contract.
14
+ - The npm launcher now exits deterministically after its Wrangler child terminates by signal instead of re-signalling itself while its own `SIGINT`/`SIGTERM` listeners are installed, preventing wrapper processes from lingering after Ctrl+C or supervisor shutdown on POSIX systems.
15
+ - ChatGPT local-launcher guidance now explicitly requires Secure MCP Tunnel for the loopback `127.0.0.1` endpoint, or a separately deployed remote Worker, instead of implying that ChatGPT can connect directly to localhost.
16
+
10
17
  ## [0.4.18] - 2026-09-22
11
18
 
12
19
  ### Fixed
package/README.md CHANGED
@@ -62,7 +62,7 @@ claude mcp add --transport http gsc http://127.0.0.1:8080/mcp
62
62
 
63
63
  Start the npm launcher before using either install button. Complete its Google OAuth flow on first use.
64
64
 
65
- **ChatGPT** — add it as a custom MCP app in developer mode; see [Connect in your AI client](#connect-in-your-ai-client) below.
65
+ **ChatGPT** — ChatGPT cannot connect directly to this loopback `127.0.0.1` endpoint. Use OpenAI's **Secure MCP Tunnel** for the local launcher, or deploy your own remote Cloudflare Worker and add that `/mcp` URL as a custom MCP app in Developer mode; see [Connect in your AI client](#connect-in-your-ai-client) below.
66
66
 
67
67
  A self-hostable [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for **Google Search Console**. Connect it to Claude.ai, Cursor, ChatGPT, or any MCP-compatible client and ask your AI assistant about your site's organic search performance — impressions, clicks, top queries, index status, and sitemap health — straight from your own Google account.
68
68
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digestseo/mcp-gsc",
3
- "version": "0.4.18",
3
+ "version": "0.4.19",
4
4
  "private": false,
5
5
  "main": "scripts/glama-start.mjs",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { createRequire } from 'node:module';
3
- import { homedir } from 'node:os';
3
+ import { constants, homedir } from 'node:os';
4
4
  import { resolve } from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
6
 
@@ -51,7 +51,8 @@ process.on('SIGTERM', () => forwardSignal('SIGTERM'));
51
51
 
52
52
  child.on('exit', (code, signal) => {
53
53
  if (signal) {
54
- process.kill(process.pid, signal);
54
+ const signalNumber = constants.signals[signal];
55
+ process.exit(signalNumber === undefined ? 1 : 128 + signalNumber);
55
56
  } else {
56
57
  process.exit(code ?? 1);
57
58
  }
package/src/google.ts CHANGED
@@ -407,6 +407,11 @@ export interface SearchAnalyticsResponseMetadata {
407
407
  first_incomplete_hour?: string;
408
408
  }
409
409
 
410
+ interface GoogleSearchAnalyticsResponseMetadata {
411
+ firstIncompleteDate?: string;
412
+ firstIncompleteHour?: string;
413
+ }
414
+
410
415
  export interface SearchAnalyticsResponse {
411
416
  rows: SearchAnalyticsRow[];
412
417
  responseAggregationType?: string;
@@ -610,14 +615,25 @@ export async function querySearchAnalytics(
610
615
  const data = (await resp.json()) as {
611
616
  rows?: SearchAnalyticsRow[];
612
617
  responseAggregationType?: string;
613
- metadata?: SearchAnalyticsResponseMetadata;
618
+ metadata?: GoogleSearchAnalyticsResponseMetadata;
614
619
  };
620
+ const metadata: SearchAnalyticsResponseMetadata | undefined =
621
+ data.metadata === undefined
622
+ ? undefined
623
+ : {
624
+ ...(data.metadata.firstIncompleteDate !== undefined
625
+ ? { first_incomplete_date: data.metadata.firstIncompleteDate }
626
+ : {}),
627
+ ...(data.metadata.firstIncompleteHour !== undefined
628
+ ? { first_incomplete_hour: data.metadata.firstIncompleteHour }
629
+ : {}),
630
+ };
615
631
  return {
616
632
  rows: data.rows ?? [],
617
633
  ...(data.responseAggregationType !== undefined
618
634
  ? { responseAggregationType: data.responseAggregationType }
619
635
  : {}),
620
- ...(data.metadata !== undefined ? { metadata: data.metadata } : {}),
636
+ ...(metadata !== undefined ? { metadata } : {}),
621
637
  };
622
638
  }
623
639