pagesight 0.2.3 → 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 +1 -1
- package/src/lib/auth.ts +4 -0
- package/src/lib/gsc.ts +3 -1
- package/src/tools/crux.ts +8 -2
- package/src/tools/performance.ts +1 -1
package/package.json
CHANGED
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({
|
package/src/tools/performance.ts
CHANGED
|
@@ -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)}`,
|