pagesight 0.2.2 → 0.2.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pagesight",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "See your site the way search engines and AI see it.",
5
5
  "keywords": [
6
6
  "seo",
package/src/index.ts CHANGED
@@ -9,9 +9,11 @@ import { registerRobotsTool } from "./tools/robots.js";
9
9
  import { registerSetupTool } from "./tools/setup.js";
10
10
  import { registerSitemapsTool } from "./tools/sitemaps.js";
11
11
 
12
+ const pkg = await Bun.file(new URL("../package.json", import.meta.url)).json();
13
+
12
14
  const server = new McpServer({
13
15
  name: "pagesight",
14
- version: "0.0.0",
16
+ version: pkg.version,
15
17
  });
16
18
 
17
19
  registerCruxTool(server);
package/src/lib/auth.ts CHANGED
@@ -133,6 +133,10 @@ export async function getAccessToken(): Promise<string> {
133
133
  );
134
134
  }
135
135
 
136
+ export function clearTokenCache(): void {
137
+ cachedToken = null;
138
+ }
139
+
136
140
  export function getAuthMethod(): string {
137
141
  if (process.env.GSC_SERVICE_ACCOUNT_KEY) return "service_account";
138
142
  if (process.env.GSC_REFRESH_TOKEN) return "oauth";
package/src/lib/gsc.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { getAccessToken } from "./auth.js";
1
+ import { clearTokenCache, getAccessToken } from "./auth.js";
2
2
 
3
3
  const GSC_API = "https://searchconsole.googleapis.com/v1";
4
4
  const WEBMASTERS_API = "https://www.googleapis.com/webmasters/v3";
@@ -15,6 +15,8 @@ async function gscFetch(url: string, body?: unknown): Promise<Record<string, unk
15
15
  });
16
16
 
17
17
  if (!res.ok) {
18
+ // Clear cached token on 401 so next call gets a fresh one
19
+ if (res.status === 401) clearTokenCache();
18
20
  const err = await res.text();
19
21
  throw new Error(`GSC API error (${res.status}): ${err}`);
20
22
  }
package/src/tools/crux.ts CHANGED
@@ -177,7 +177,10 @@ export function registerCruxTool(server: McpServer): void {
177
177
  },
178
178
  async ({ url, origin, form_factor, metrics }) => {
179
179
  if (!url && !origin) {
180
- return { content: [{ type: "text", text: "Error: provide either url or origin." }] };
180
+ return { content: [{ type: "text", text: "Error: provide either url or origin, not both." }] };
181
+ }
182
+ if (url && origin) {
183
+ return { content: [{ type: "text", text: "Error: provide either url or origin, not both." }] };
181
184
  }
182
185
  try {
183
186
  const result = await queryCrux({
@@ -248,7 +251,10 @@ export function registerCruxTool(server: McpServer): void {
248
251
  },
249
252
  async ({ url, origin, form_factor, metrics, periods }) => {
250
253
  if (!url && !origin) {
251
- return { content: [{ type: "text", text: "Error: provide either url or origin." }] };
254
+ return { content: [{ type: "text", text: "Error: provide either url or origin, not both." }] };
255
+ }
256
+ if (url && origin) {
257
+ return { content: [{ type: "text", text: "Error: provide either url or origin, not both." }] };
252
258
  }
253
259
  try {
254
260
  const result = await queryCruxHistory({
@@ -39,7 +39,7 @@ function formatPerformance(
39
39
  totalImpressions > 0 ? rows.reduce((sum, r) => sum + r.position * r.impressions, 0) / totalImpressions : 0;
40
40
 
41
41
  lines.push(
42
- "--- Totals ---",
42
+ `--- Summary (${rows.length} rows returned) ---`,
43
43
  "",
44
44
  `Clicks: ${totalClicks.toLocaleString()}`,
45
45
  `Impressions: ${totalImpressions.toLocaleString()}`,
@@ -52,7 +52,7 @@ function formatPerformance(
52
52
 
53
53
  const top = rows.slice(0, 25);
54
54
  for (const row of top) {
55
- const keys = row.keys.join(" | ");
55
+ const keys = row.keys.map((k, i) => `${dimensions[i] ?? "key"}=${k}`).join(" | ");
56
56
  lines.push(`${keys}`);
57
57
  lines.push(
58
58
  ` Clicks: ${row.clicks} | Impressions: ${row.impressions} | CTR: ${(row.ctr * 100).toFixed(1)}% | Position: ${row.position.toFixed(1)}`,
@@ -67,9 +67,10 @@ function formatPerformance(
67
67
  }
68
68
 
69
69
  function daysAgo(n: number): string {
70
- const d = new Date();
71
- d.setDate(d.getDate() - n);
72
- return d.toISOString().split("T")[0];
70
+ // GSC dates are in PT (Pacific Time). Use UTC-8 as a stable approximation.
71
+ const now = new Date(Date.now() - 8 * 60 * 60 * 1000);
72
+ now.setDate(now.getDate() - n);
73
+ return now.toISOString().split("T")[0];
73
74
  }
74
75
 
75
76
  export function registerPerformanceTool(server: McpServer): void {