@disruptorganic/mcp-google-search-console 1.0.0
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/.env.example +141 -0
- package/LICENSE +21 -0
- package/README.md +0 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth2.d.ts +31 -0
- package/dist/auth/oauth2.d.ts.map +1 -0
- package/dist/auth/oauth2.js +380 -0
- package/dist/auth/oauth2.js.map +1 -0
- package/dist/config/index.d.ts +36 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +87 -0
- package/dist/config/index.js.map +1 -0
- package/dist/gsc/client.d.ts +72 -0
- package/dist/gsc/client.d.ts.map +1 -0
- package/dist/gsc/client.js +243 -0
- package/dist/gsc/client.js.map +1 -0
- package/dist/gsc/index.d.ts +3 -0
- package/dist/gsc/index.d.ts.map +1 -0
- package/dist/gsc/index.js +3 -0
- package/dist/gsc/index.js.map +1 -0
- package/dist/gsc/properties.d.ts +42 -0
- package/dist/gsc/properties.d.ts.map +1 -0
- package/dist/gsc/properties.js +393 -0
- package/dist/gsc/properties.js.map +1 -0
- package/dist/gsc/queries.d.ts +73 -0
- package/dist/gsc/queries.d.ts.map +1 -0
- package/dist/gsc/queries.js +390 -0
- package/dist/gsc/queries.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/compare-date-ranges.d.ts +83 -0
- package/dist/tools/compare-date-ranges.d.ts.map +1 -0
- package/dist/tools/compare-date-ranges.js +462 -0
- package/dist/tools/compare-date-ranges.js.map +1 -0
- package/dist/tools/get-property-info.d.ts +30 -0
- package/dist/tools/get-property-info.d.ts.map +1 -0
- package/dist/tools/get-property-info.js +174 -0
- package/dist/tools/get-property-info.js.map +1 -0
- package/dist/tools/get-top-pages.d.ts +103 -0
- package/dist/tools/get-top-pages.d.ts.map +1 -0
- package/dist/tools/get-top-pages.js +254 -0
- package/dist/tools/get-top-pages.js.map +1 -0
- package/dist/tools/get-top-queries.d.ts +103 -0
- package/dist/tools/get-top-queries.d.ts.map +1 -0
- package/dist/tools/get-top-queries.js +254 -0
- package/dist/tools/get-top-queries.js.map +1 -0
- package/dist/tools/health-check.d.ts +12 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +107 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/index.d.ts +1124 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +70 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-properties.d.ts +50 -0
- package/dist/tools/list-properties.d.ts.map +1 -0
- package/dist/tools/list-properties.js +234 -0
- package/dist/tools/list-properties.js.map +1 -0
- package/dist/tools/query-advanced.d.ts +109 -0
- package/dist/tools/query-advanced.d.ts.map +1 -0
- package/dist/tools/query-advanced.js +378 -0
- package/dist/tools/query-advanced.js.map +1 -0
- package/dist/tools/query-by-keyword.d.ts +115 -0
- package/dist/tools/query-by-keyword.d.ts.map +1 -0
- package/dist/tools/query-by-keyword.js +339 -0
- package/dist/tools/query-by-keyword.js.map +1 -0
- package/dist/tools/query-by-url.d.ts +116 -0
- package/dist/tools/query-by-url.d.ts.map +1 -0
- package/dist/tools/query-by-url.js +366 -0
- package/dist/tools/query-by-url.js.map +1 -0
- package/dist/utils/cache.d.ts +22 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +75 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +9 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +54 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +24 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +175 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +33 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +226 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/dist/utils/types.d.ts +68 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +13 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/validators.d.ts +579 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +358 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
const configSchema = z.object({
|
|
5
|
+
clientId: z.string().min(1, 'GSC_CLIENT_ID is required'),
|
|
6
|
+
clientSecret: z.string().min(1, 'GSC_CLIENT_SECRET is required'),
|
|
7
|
+
tokenPath: z.string().default(path.join(os.homedir(), '.mcp-gsc', 'tokens.json')),
|
|
8
|
+
redirectUri: z.string().default('urn:ietf:wg:oauth:2.0:oob'),
|
|
9
|
+
logLevel: z.enum(['error', 'warn', 'info', 'debug']).default('info'),
|
|
10
|
+
});
|
|
11
|
+
function loadConfig() {
|
|
12
|
+
const rawConfig = {
|
|
13
|
+
clientId: process.env.GSC_CLIENT_ID,
|
|
14
|
+
clientSecret: process.env.GSC_CLIENT_SECRET,
|
|
15
|
+
tokenPath: process.env.GSC_TOKEN_PATH,
|
|
16
|
+
redirectUri: process.env.GSC_REDIRECT_URI,
|
|
17
|
+
logLevel: process.env.LOG_LEVEL,
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
return configSchema.parse(rawConfig);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof z.ZodError) {
|
|
24
|
+
const missingFields = error.issues
|
|
25
|
+
.map(issue => {
|
|
26
|
+
const field = issue.path.join('.');
|
|
27
|
+
return ` - ${field}: ${issue.message}`;
|
|
28
|
+
})
|
|
29
|
+
.join('\n');
|
|
30
|
+
const errorMessage = `
|
|
31
|
+
Configuration Error: Missing or invalid environment variables
|
|
32
|
+
|
|
33
|
+
${missingFields}
|
|
34
|
+
|
|
35
|
+
Please set the required environment variables:
|
|
36
|
+
- GSC_CLIENT_ID: Your Google OAuth2 Client ID
|
|
37
|
+
- GSC_CLIENT_SECRET: Your Google OAuth2 Client Secret
|
|
38
|
+
|
|
39
|
+
Optional environment variables (with defaults):
|
|
40
|
+
- GSC_TOKEN_PATH: Token storage path (default: ~/.mcp-gsc/tokens.json)
|
|
41
|
+
- GSC_REDIRECT_URI: OAuth redirect URI (default: urn:ietf:wg:oauth:2.0:oob)
|
|
42
|
+
- LOG_LEVEL: Logging level (default: info, options: error, warn, info, debug)
|
|
43
|
+
|
|
44
|
+
To obtain OAuth2 credentials:
|
|
45
|
+
1. Go to https://console.cloud.google.com/apis/credentials
|
|
46
|
+
2. Create a new OAuth 2.0 Client ID (Desktop application type)
|
|
47
|
+
3. Enable the Google Search Console API for your project
|
|
48
|
+
4. Copy the Client ID and Client Secret
|
|
49
|
+
|
|
50
|
+
See .env.example for a complete configuration template.
|
|
51
|
+
`.trim();
|
|
52
|
+
throw new Error(errorMessage);
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export const config = loadConfig();
|
|
58
|
+
export function getTokenDirectory() {
|
|
59
|
+
return path.dirname(config.tokenPath);
|
|
60
|
+
}
|
|
61
|
+
export function isDevelopment() {
|
|
62
|
+
return process.env.NODE_ENV === 'development';
|
|
63
|
+
}
|
|
64
|
+
export function isProduction() {
|
|
65
|
+
return process.env.NODE_ENV === 'production';
|
|
66
|
+
}
|
|
67
|
+
export function getEnvironment() {
|
|
68
|
+
return process.env.NODE_ENV || 'development';
|
|
69
|
+
}
|
|
70
|
+
export function getConfigSummary() {
|
|
71
|
+
return {
|
|
72
|
+
clientId: config.clientId.substring(0, 8) + '...',
|
|
73
|
+
clientSecret: '***',
|
|
74
|
+
tokenPath: config.tokenPath,
|
|
75
|
+
redirectUri: config.redirectUri,
|
|
76
|
+
logLevel: config.logLevel,
|
|
77
|
+
environment: getEnvironment(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function logConfigSummary() {
|
|
81
|
+
console.log('Configuration loaded successfully:');
|
|
82
|
+
const summary = getConfigSummary();
|
|
83
|
+
Object.entries(summary).forEach(([key, value]) => {
|
|
84
|
+
console.log(` ${key}: ${value}`);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { OAuth2Client } from 'google-auth-library';
|
|
2
|
+
import { TokenBucketRateLimiter } from '../utils/rate-limiter.js';
|
|
3
|
+
export interface PropertyInfo {
|
|
4
|
+
propertyUrl: string;
|
|
5
|
+
permissionLevel: string;
|
|
6
|
+
}
|
|
7
|
+
export interface QueryParams {
|
|
8
|
+
propertyUrl: string;
|
|
9
|
+
startDate: string;
|
|
10
|
+
endDate: string;
|
|
11
|
+
dimensions?: string[];
|
|
12
|
+
filters?: FilterGroup[];
|
|
13
|
+
rowLimit?: number;
|
|
14
|
+
startRow?: number;
|
|
15
|
+
aggregationType?: 'auto' | 'byProperty' | 'byPage';
|
|
16
|
+
searchType?: 'web' | 'image' | 'video' | 'news' | 'discover' | 'googleNews';
|
|
17
|
+
dataState?: 'final' | 'all';
|
|
18
|
+
}
|
|
19
|
+
export interface FilterGroup {
|
|
20
|
+
filters: Filter[];
|
|
21
|
+
}
|
|
22
|
+
export interface Filter {
|
|
23
|
+
dimension: string;
|
|
24
|
+
operator: 'equals' | 'notEquals' | 'contains' | 'notContains' | 'includingRegex' | 'excludingRegex';
|
|
25
|
+
expression: string;
|
|
26
|
+
}
|
|
27
|
+
export interface QueryResponse {
|
|
28
|
+
rows?: QueryRow[];
|
|
29
|
+
responseAggregationType?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface QueryRow {
|
|
32
|
+
keys?: string[];
|
|
33
|
+
clicks?: number;
|
|
34
|
+
impressions?: number;
|
|
35
|
+
ctr?: number;
|
|
36
|
+
position?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface PropertyMetadata {
|
|
39
|
+
propertyUrl: string;
|
|
40
|
+
permissionLevel: string;
|
|
41
|
+
siteUrl?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare class GSCApiError extends Error {
|
|
44
|
+
code: string;
|
|
45
|
+
statusCode?: number | undefined;
|
|
46
|
+
retriable: boolean;
|
|
47
|
+
userMessage?: string | undefined;
|
|
48
|
+
constructor(message: string, code: string, statusCode?: number | undefined, retriable?: boolean, userMessage?: string | undefined);
|
|
49
|
+
}
|
|
50
|
+
export declare class GSCClient {
|
|
51
|
+
private webmasters;
|
|
52
|
+
private rateLimiter;
|
|
53
|
+
private _oauth2Client;
|
|
54
|
+
constructor(oauth2Client: OAuth2Client);
|
|
55
|
+
getOAuth2Client(): OAuth2Client;
|
|
56
|
+
validateConnection(): Promise<boolean>;
|
|
57
|
+
listProperties(): Promise<PropertyInfo[]>;
|
|
58
|
+
getPropertyInfo(propertyUrl: string): Promise<PropertyMetadata>;
|
|
59
|
+
query(params: QueryParams): Promise<QueryResponse>;
|
|
60
|
+
queryMultiple(paramsArray: QueryParams[]): Promise<QueryResponse[]>;
|
|
61
|
+
private validateQueryParams;
|
|
62
|
+
private mapError;
|
|
63
|
+
getRateLimitStatus(): {
|
|
64
|
+
availableTokens: number;
|
|
65
|
+
maxTokens: number;
|
|
66
|
+
pendingAcquisitions: number;
|
|
67
|
+
refillRate: number;
|
|
68
|
+
queriesPerMinute: number;
|
|
69
|
+
};
|
|
70
|
+
getRateLimiter(): TokenBucketRateLimiter;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/gsc/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
import { TokenBucketRateLimiter, withExponentialBackoff } from '../utils/rate-limiter.js';
|
|
4
|
+
export class GSCApiError extends Error {
|
|
5
|
+
constructor(message, code, statusCode, retriable = false, userMessage) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.statusCode = statusCode;
|
|
9
|
+
this.retriable = retriable;
|
|
10
|
+
this.userMessage = userMessage;
|
|
11
|
+
this.name = 'GSCApiError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
let sharedRateLimiter = null;
|
|
15
|
+
function getSharedRateLimiter() {
|
|
16
|
+
if (!sharedRateLimiter) {
|
|
17
|
+
sharedRateLimiter = new TokenBucketRateLimiter(18, 18);
|
|
18
|
+
logger.info('Shared rate limiter initialized', {
|
|
19
|
+
maxTokens: 18,
|
|
20
|
+
refillRate: 18,
|
|
21
|
+
queriesPerMinute: 1080,
|
|
22
|
+
safetyMargin: '90% of official limit',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return sharedRateLimiter;
|
|
26
|
+
}
|
|
27
|
+
export class GSCClient {
|
|
28
|
+
constructor(oauth2Client) {
|
|
29
|
+
this._oauth2Client = oauth2Client;
|
|
30
|
+
this.webmasters = google.webmasters({ version: 'v3', auth: oauth2Client });
|
|
31
|
+
this.rateLimiter = getSharedRateLimiter();
|
|
32
|
+
}
|
|
33
|
+
getOAuth2Client() {
|
|
34
|
+
return this._oauth2Client;
|
|
35
|
+
}
|
|
36
|
+
async validateConnection() {
|
|
37
|
+
try {
|
|
38
|
+
await this.listProperties();
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async listProperties() {
|
|
46
|
+
await this.rateLimiter.acquire();
|
|
47
|
+
return withExponentialBackoff(async () => {
|
|
48
|
+
try {
|
|
49
|
+
const response = await this.webmasters.sites.list();
|
|
50
|
+
if (!response.data.siteEntry) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
return response.data.siteEntry.map((site) => ({
|
|
54
|
+
propertyUrl: site.siteUrl,
|
|
55
|
+
permissionLevel: site.permissionLevel
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw this.mapError(error, 'Failed to list properties');
|
|
60
|
+
}
|
|
61
|
+
}, {
|
|
62
|
+
maxRetries: 3,
|
|
63
|
+
initialDelay: 1000,
|
|
64
|
+
maxDelay: 30000,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async getPropertyInfo(propertyUrl) {
|
|
68
|
+
await this.rateLimiter.acquire();
|
|
69
|
+
return withExponentialBackoff(async () => {
|
|
70
|
+
try {
|
|
71
|
+
const response = await this.webmasters.sites.get({
|
|
72
|
+
siteUrl: propertyUrl
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
propertyUrl: response.data.siteUrl,
|
|
76
|
+
permissionLevel: response.data.permissionLevel,
|
|
77
|
+
siteUrl: response.data.siteUrl
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw this.mapError(error, `Failed to get property info for: ${propertyUrl}`);
|
|
82
|
+
}
|
|
83
|
+
}, {
|
|
84
|
+
maxRetries: 3,
|
|
85
|
+
initialDelay: 1000,
|
|
86
|
+
maxDelay: 30000,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async query(params) {
|
|
90
|
+
this.validateQueryParams(params);
|
|
91
|
+
await this.rateLimiter.acquire();
|
|
92
|
+
return withExponentialBackoff(async () => {
|
|
93
|
+
try {
|
|
94
|
+
const requestBody = {
|
|
95
|
+
startDate: params.startDate,
|
|
96
|
+
endDate: params.endDate,
|
|
97
|
+
dimensions: params.dimensions || [],
|
|
98
|
+
rowLimit: params.rowLimit || 25000,
|
|
99
|
+
startRow: params.startRow || 0
|
|
100
|
+
};
|
|
101
|
+
if (params.filters && params.filters.length > 0) {
|
|
102
|
+
requestBody.dimensionFilterGroups = params.filters.map(group => ({
|
|
103
|
+
filters: group.filters.map(filter => ({
|
|
104
|
+
dimension: filter.dimension,
|
|
105
|
+
operator: filter.operator,
|
|
106
|
+
expression: filter.expression
|
|
107
|
+
}))
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
if (params.aggregationType) {
|
|
111
|
+
requestBody.aggregationType = params.aggregationType;
|
|
112
|
+
}
|
|
113
|
+
if (params.searchType) {
|
|
114
|
+
requestBody.type = params.searchType;
|
|
115
|
+
}
|
|
116
|
+
if (params.dataState) {
|
|
117
|
+
requestBody.dataState = params.dataState;
|
|
118
|
+
}
|
|
119
|
+
const response = await this.webmasters.searchanalytics.query({
|
|
120
|
+
siteUrl: params.propertyUrl,
|
|
121
|
+
requestBody
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
rows: response.data.rows || [],
|
|
125
|
+
responseAggregationType: response.data.responseAggregationType
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw this.mapError(error, 'Query execution failed');
|
|
130
|
+
}
|
|
131
|
+
}, {
|
|
132
|
+
maxRetries: 3,
|
|
133
|
+
initialDelay: 1000,
|
|
134
|
+
maxDelay: 30000,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async queryMultiple(paramsArray) {
|
|
138
|
+
const results = [];
|
|
139
|
+
logger.info('Executing multiple queries sequentially', {
|
|
140
|
+
count: paramsArray.length,
|
|
141
|
+
});
|
|
142
|
+
for (let i = 0; i < paramsArray.length; i++) {
|
|
143
|
+
const params = paramsArray[i];
|
|
144
|
+
if (!params) {
|
|
145
|
+
logger.warn('Skipping undefined query params', { index: i + 1 });
|
|
146
|
+
results.push({ rows: [] });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
logger.debug('Executing sequential query', {
|
|
151
|
+
index: i + 1,
|
|
152
|
+
total: paramsArray.length,
|
|
153
|
+
propertyUrl: params.propertyUrl,
|
|
154
|
+
});
|
|
155
|
+
const result = await this.query(params);
|
|
156
|
+
results.push(result);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
logger.error('Query execution failed in batch', {
|
|
160
|
+
error: error instanceof Error ? error.message : String(error),
|
|
161
|
+
index: i + 1,
|
|
162
|
+
total: paramsArray.length,
|
|
163
|
+
params: {
|
|
164
|
+
propertyUrl: params.propertyUrl,
|
|
165
|
+
startDate: params.startDate,
|
|
166
|
+
endDate: params.endDate,
|
|
167
|
+
dimensions: params.dimensions,
|
|
168
|
+
rowLimit: params.rowLimit
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
results.push({ rows: [] });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
logger.info('Sequential queries completed', {
|
|
175
|
+
total: paramsArray.length,
|
|
176
|
+
successful: results.filter(r => r.rows && r.rows.length > 0).length,
|
|
177
|
+
});
|
|
178
|
+
return results;
|
|
179
|
+
}
|
|
180
|
+
validateQueryParams(params) {
|
|
181
|
+
const startDate = new Date(params.startDate);
|
|
182
|
+
const endDate = new Date(params.endDate);
|
|
183
|
+
const now = new Date();
|
|
184
|
+
const sixteenMonthsAgo = new Date();
|
|
185
|
+
sixteenMonthsAgo.setMonth(now.getMonth() - 16);
|
|
186
|
+
if (startDate < sixteenMonthsAgo) {
|
|
187
|
+
throw new GSCApiError('Start date exceeds 16-month historical limit', 'INVALID_DATE_RANGE', 400, false, `Start date must be within the last 16 months (after ${sixteenMonthsAgo.toISOString().split('T')[0]})`);
|
|
188
|
+
}
|
|
189
|
+
if (startDate > endDate) {
|
|
190
|
+
throw new GSCApiError('Start date must be before or equal to end date', 'INVALID_DATE_RANGE', 400, false, 'Start date must be before or equal to end date');
|
|
191
|
+
}
|
|
192
|
+
if (endDate > now) {
|
|
193
|
+
throw new GSCApiError('End date cannot be in the future', 'INVALID_DATE_RANGE', 400, false, 'End date cannot be in the future');
|
|
194
|
+
}
|
|
195
|
+
if (params.dimensions && params.dimensions.length > 3) {
|
|
196
|
+
throw new GSCApiError('Maximum 3 dimensions allowed', 'INVALID_DIMENSIONS', 400, false, 'Google Search Console API allows a maximum of 3 dimensions per query');
|
|
197
|
+
}
|
|
198
|
+
if (params.rowLimit && (params.rowLimit < 1 || params.rowLimit > 25000)) {
|
|
199
|
+
throw new GSCApiError('Row limit must be between 1 and 25,000', 'INVALID_ROW_LIMIT', 400, false, 'Row limit must be between 1 and 25,000');
|
|
200
|
+
}
|
|
201
|
+
if (!params.propertyUrl || params.propertyUrl.trim() === '') {
|
|
202
|
+
throw new GSCApiError('Property URL is required', 'MISSING_PROPERTY', 400, false, 'Property URL is required. Use list_properties tool first to get available properties.');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
mapError(error, context) {
|
|
206
|
+
const statusCode = error.response?.status || error.code;
|
|
207
|
+
const errorMessage = error.response?.data?.error?.message || error.message || 'Unknown error';
|
|
208
|
+
switch (statusCode) {
|
|
209
|
+
case 401:
|
|
210
|
+
return new GSCApiError(`Authentication failed: ${errorMessage}`, 'AUTHENTICATION_FAILED', 401, false, 'Authentication failed. Please re-authenticate with Google Search Console.');
|
|
211
|
+
case 403:
|
|
212
|
+
return new GSCApiError(`Access denied: ${errorMessage}`, 'ACCESS_DENIED', 403, false, 'Access denied. Ensure you have permission to access this property in Google Search Console.');
|
|
213
|
+
case 404:
|
|
214
|
+
return new GSCApiError(`Property not found: ${errorMessage}`, 'PROPERTY_NOT_FOUND', 404, false, 'Property not found. Use list_properties tool to see available properties.');
|
|
215
|
+
case 429:
|
|
216
|
+
return new GSCApiError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT_EXCEEDED', 429, true, 'Rate limit exceeded. Please wait a moment and try again.');
|
|
217
|
+
case 500:
|
|
218
|
+
case 502:
|
|
219
|
+
case 503:
|
|
220
|
+
case 504:
|
|
221
|
+
return new GSCApiError(`Google API service error: ${errorMessage}`, 'SERVICE_ERROR', statusCode, true, 'Google Search Console API is temporarily unavailable. Please try again in a moment.');
|
|
222
|
+
case 'ENOTFOUND':
|
|
223
|
+
case 'ETIMEDOUT':
|
|
224
|
+
case 'ECONNRESET':
|
|
225
|
+
return new GSCApiError(`Network error: ${errorMessage}`, 'NETWORK_ERROR', undefined, true, 'Network error occurred. Please check your connection and try again.');
|
|
226
|
+
default:
|
|
227
|
+
return new GSCApiError(`${context}: ${errorMessage}`, 'UNKNOWN_ERROR', statusCode, false, `An unexpected error occurred: ${errorMessage}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
getRateLimitStatus() {
|
|
231
|
+
return {
|
|
232
|
+
availableTokens: this.rateLimiter.getAvailableTokens(),
|
|
233
|
+
maxTokens: 18,
|
|
234
|
+
pendingAcquisitions: this.rateLimiter.getPendingAcquisitions(),
|
|
235
|
+
refillRate: 18,
|
|
236
|
+
queriesPerMinute: 1200,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
getRateLimiter() {
|
|
240
|
+
return this.rateLimiter;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gsc/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { GSCClient, GSCApiError, type PropertyInfo, type QueryParams, type QueryResponse, type QueryRow, type FilterGroup, type Filter, type PropertyMetadata } from './client.js';
|
|
2
|
+
export { executeParallelQueries, queryMultipleKeywords, aggregateResults, sortResults, filterResults, getResultStatistics, type QueryRequest, type GSCRow, type QueryError, type AggregatedQueryResults } from './queries.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gsc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gsc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,WAAW,EAQZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EAKpB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GSCClient } from './client.js';
|
|
2
|
+
export type PropertyType = 'domain' | 'url_prefix' | 'unknown';
|
|
3
|
+
export interface Property {
|
|
4
|
+
propertyUrl: string;
|
|
5
|
+
propertyType: PropertyType;
|
|
6
|
+
permissionLevel: string;
|
|
7
|
+
domain?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
protocol?: 'http' | 'https';
|
|
10
|
+
}
|
|
11
|
+
export interface GroupedProperties {
|
|
12
|
+
domain: Property[];
|
|
13
|
+
url_prefix: Property[];
|
|
14
|
+
counts: {
|
|
15
|
+
domain: number;
|
|
16
|
+
url_prefix: number;
|
|
17
|
+
total: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export type PropertyMatchType = 'exact_domain' | 'exact_url_https' | 'exact_url_http' | 'fuzzy_domain' | 'fuzzy_url' | 'none';
|
|
21
|
+
export interface PropertyMatchResult {
|
|
22
|
+
matched: Property | null;
|
|
23
|
+
matchType: PropertyMatchType;
|
|
24
|
+
alternatives?: Property[];
|
|
25
|
+
normalizedInput: string;
|
|
26
|
+
searchInput: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function detectPropertyType(propertyUrl: string): PropertyType;
|
|
29
|
+
export declare function formatProperties(rawProperties: any[]): Property[];
|
|
30
|
+
export declare function groupPropertiesByType(properties: Property[]): GroupedProperties;
|
|
31
|
+
export declare function matchProperty(searchInput: string, availableProperties: Property[]): PropertyMatchResult;
|
|
32
|
+
export declare function generatePropertyMatchError(result: PropertyMatchResult, availableProperties: Property[]): string;
|
|
33
|
+
export declare function listProperties(client: GSCClient, forceRefresh?: boolean): Promise<Property[]>;
|
|
34
|
+
export declare function findProperty(properties: Property[], searchUrl: string): Property | undefined;
|
|
35
|
+
export declare function getPropertySuggestions(properties: Property[], partialUrl: string, limit?: number): Property[];
|
|
36
|
+
export declare function invalidatePropertiesCache(): void;
|
|
37
|
+
export declare function getPropertiesCacheInfo(): {
|
|
38
|
+
isCached: boolean;
|
|
39
|
+
ttl?: number;
|
|
40
|
+
cachedCount?: number;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=properties.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/gsc/properties.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAcxC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAK/D,MAAM,WAAW,QAAQ;IAEvB,WAAW,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,YAAY,CAAC;IAE3B,eAAe,EAAE,MAAM,CAAC;IAExB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAKD,MAAM,WAAW,iBAAiB;IAEhC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAEnB,UAAU,EAAE,QAAQ,EAAE,CAAC;IAEvB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAKD,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,WAAW,GACX,MAAM,CAAC;AAWX,MAAM,WAAW,mBAAmB;IAElC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEzB,SAAS,EAAE,iBAAiB,CAAC;IAE7B,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC;IAE1B,eAAe,EAAE,MAAM,CAAC;IAExB,WAAW,EAAE,MAAM,CAAC;CACrB;AAqBD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAqBpE;AA4DD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,CAoEjE;AAqBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAiB/E;AAqID,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,QAAQ,EAAE,GAC9B,mBAAmB,CAuNrB;AAsBD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,mBAAmB,EAC3B,mBAAmB,EAAE,QAAQ,EAAE,GAC9B,MAAM,CAmCR;AAmCD,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoDrB;AAiBD,wBAAgB,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAoB5F;AAYD,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,QAAQ,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAU,GAChB,QAAQ,EAAE,CAeZ;AAQD,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD;AAOD,wBAAgB,sBAAsB,IAAI;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAgBA"}
|