@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,358 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const dateSchema = z.string()
|
|
3
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in ISO 8601 format (YYYY-MM-DD)')
|
|
4
|
+
.refine((date) => {
|
|
5
|
+
const d = new Date(date);
|
|
6
|
+
return !isNaN(d.getTime());
|
|
7
|
+
}, 'Invalid date value')
|
|
8
|
+
.refine((date) => {
|
|
9
|
+
const d = new Date(date);
|
|
10
|
+
d.setHours(0, 0, 0, 0);
|
|
11
|
+
const today = new Date();
|
|
12
|
+
today.setHours(0, 0, 0, 0);
|
|
13
|
+
return d <= today;
|
|
14
|
+
}, 'Date cannot be in the future')
|
|
15
|
+
.refine((date) => {
|
|
16
|
+
const d = new Date(date);
|
|
17
|
+
d.setHours(0, 0, 0, 0);
|
|
18
|
+
const sixteenMonthsAgo = new Date();
|
|
19
|
+
sixteenMonthsAgo.setMonth(sixteenMonthsAgo.getMonth() - 16);
|
|
20
|
+
sixteenMonthsAgo.setHours(0, 0, 0, 0);
|
|
21
|
+
return d >= sixteenMonthsAgo;
|
|
22
|
+
}, 'Date cannot be more than 16 months in the past (GSC API limit)');
|
|
23
|
+
export const dateRangeSchema = z.object({
|
|
24
|
+
startDate: dateSchema,
|
|
25
|
+
endDate: dateSchema,
|
|
26
|
+
}).refine((data) => new Date(data.startDate) <= new Date(data.endDate), {
|
|
27
|
+
message: 'startDate must be before or equal to endDate',
|
|
28
|
+
path: ['endDate'],
|
|
29
|
+
});
|
|
30
|
+
export const propertyUrlSchema = z.string()
|
|
31
|
+
.min(1, 'Property URL is required')
|
|
32
|
+
.refine((url) => {
|
|
33
|
+
if (url.startsWith('sc-domain:')) {
|
|
34
|
+
return /^sc-domain:[a-z0-9.-]+\.[a-z]{2,}$/i.test(url);
|
|
35
|
+
}
|
|
36
|
+
return /^https?:\/\/.+/.test(url);
|
|
37
|
+
}, 'Property URL must be a domain property (sc-domain:example.com) or URL prefix (https://example.com/)');
|
|
38
|
+
export const dimensionSchema = z.enum([
|
|
39
|
+
'query',
|
|
40
|
+
'page',
|
|
41
|
+
'country',
|
|
42
|
+
'device',
|
|
43
|
+
'searchAppearance',
|
|
44
|
+
'date'
|
|
45
|
+
], {
|
|
46
|
+
errorMap: () => ({ message: 'Invalid dimension. Must be one of: query, page, country, device, searchAppearance, date' })
|
|
47
|
+
});
|
|
48
|
+
export const dimensionsSchema = z.array(dimensionSchema)
|
|
49
|
+
.min(1, 'At least one dimension is required')
|
|
50
|
+
.max(3, 'Maximum 3 dimensions allowed per query (GSC API limit)');
|
|
51
|
+
export const searchTypeSchema = z.enum([
|
|
52
|
+
'web',
|
|
53
|
+
'image',
|
|
54
|
+
'video',
|
|
55
|
+
'news',
|
|
56
|
+
'discover',
|
|
57
|
+
'googleNews'
|
|
58
|
+
], {
|
|
59
|
+
errorMap: () => ({ message: 'Invalid search type. Must be one of: web, image, video, news, discover, googleNews' })
|
|
60
|
+
}).default('web');
|
|
61
|
+
export const filterOperatorSchema = z.enum([
|
|
62
|
+
'equals',
|
|
63
|
+
'notEquals',
|
|
64
|
+
'contains',
|
|
65
|
+
'notContains',
|
|
66
|
+
'includingRegex',
|
|
67
|
+
'excludingRegex'
|
|
68
|
+
], {
|
|
69
|
+
errorMap: () => ({ message: 'Invalid filter operator' })
|
|
70
|
+
});
|
|
71
|
+
export const filterSchema = z.object({
|
|
72
|
+
dimension: dimensionSchema,
|
|
73
|
+
operator: filterOperatorSchema,
|
|
74
|
+
expression: z.string().min(1, 'Filter expression cannot be empty'),
|
|
75
|
+
});
|
|
76
|
+
export const filterGroupSchema = z.object({
|
|
77
|
+
filters: z.array(filterSchema).min(1, 'Filter group must contain at least one filter'),
|
|
78
|
+
groupType: z.literal('and').optional(),
|
|
79
|
+
});
|
|
80
|
+
export const rowLimitSchema = z.number()
|
|
81
|
+
.int('Row limit must be an integer')
|
|
82
|
+
.min(1, 'Row limit must be at least 1')
|
|
83
|
+
.max(25000, 'Row limit cannot exceed 25,000 (GSC API limit)');
|
|
84
|
+
export const deviceTypeSchema = z.enum([
|
|
85
|
+
'desktop',
|
|
86
|
+
'mobile',
|
|
87
|
+
'tablet'
|
|
88
|
+
], {
|
|
89
|
+
errorMap: () => ({ message: 'Invalid device type. Must be one of: desktop, mobile, tablet' })
|
|
90
|
+
});
|
|
91
|
+
export const countryCodeSchema = z.string()
|
|
92
|
+
.length(3, 'Country code must be exactly 3 letters')
|
|
93
|
+
.regex(/^[a-zA-Z]{3}$/, 'Country code must be 3 letters (ISO 3166-1 alpha-3)')
|
|
94
|
+
.transform((val) => val.toLowerCase());
|
|
95
|
+
export const aggregationTypeSchema = z.enum([
|
|
96
|
+
'auto',
|
|
97
|
+
'byProperty',
|
|
98
|
+
'byPage'
|
|
99
|
+
], {
|
|
100
|
+
errorMap: () => ({ message: 'Invalid aggregation type. Must be one of: auto, byProperty, byPage' })
|
|
101
|
+
});
|
|
102
|
+
export const sortOrderSchema = z.enum(['asc', 'desc'], {
|
|
103
|
+
errorMap: () => ({ message: 'Sort order must be "asc" or "desc"' })
|
|
104
|
+
});
|
|
105
|
+
export const sortByMetricSchema = z.enum([
|
|
106
|
+
'clicks',
|
|
107
|
+
'impressions',
|
|
108
|
+
'ctr',
|
|
109
|
+
'position'
|
|
110
|
+
], {
|
|
111
|
+
errorMap: () => ({ message: 'Invalid sort metric. Must be one of: clicks, impressions, ctr, position' })
|
|
112
|
+
});
|
|
113
|
+
export const baseQueryParamsSchema = z.object({
|
|
114
|
+
property: propertyUrlSchema,
|
|
115
|
+
startDate: dateSchema,
|
|
116
|
+
endDate: dateSchema,
|
|
117
|
+
searchType: searchTypeSchema.optional(),
|
|
118
|
+
deviceType: deviceTypeSchema.optional(),
|
|
119
|
+
country: countryCodeSchema.optional(),
|
|
120
|
+
}).refine((data) => new Date(data.startDate) <= new Date(data.endDate), {
|
|
121
|
+
message: 'startDate must be before or equal to endDate',
|
|
122
|
+
path: ['endDate'],
|
|
123
|
+
});
|
|
124
|
+
export const keywordSchema = z.string()
|
|
125
|
+
.min(1, 'Keyword cannot be empty')
|
|
126
|
+
.max(500, 'Keyword too long (max 500 characters)');
|
|
127
|
+
export const keywordsSchema = z.array(keywordSchema)
|
|
128
|
+
.min(1, 'At least one keyword is required')
|
|
129
|
+
.max(100, 'Maximum 100 keywords per request (to respect rate limits)');
|
|
130
|
+
export const pageUrlSchema = z.string()
|
|
131
|
+
.min(1, 'Page URL is required')
|
|
132
|
+
.url('Must be a valid URL')
|
|
133
|
+
.refine((url) => {
|
|
134
|
+
return url.startsWith('http://') || url.startsWith('https://');
|
|
135
|
+
}, 'URL must start with http:// or https://');
|
|
136
|
+
export function validateDateRange(startDate, endDate) {
|
|
137
|
+
return new Date(startDate) <= new Date(endDate);
|
|
138
|
+
}
|
|
139
|
+
export function validateDateRangeStrict(startDate, endDate) {
|
|
140
|
+
const start = new Date(startDate);
|
|
141
|
+
const end = new Date(endDate);
|
|
142
|
+
const now = new Date();
|
|
143
|
+
now.setHours(0, 0, 0, 0);
|
|
144
|
+
if (isNaN(start.getTime()) || isNaN(end.getTime())) {
|
|
145
|
+
throw new Error('Invalid date format. Use YYYY-MM-DD.');
|
|
146
|
+
}
|
|
147
|
+
if (start > now || end > now) {
|
|
148
|
+
throw new Error('Future dates are not allowed.');
|
|
149
|
+
}
|
|
150
|
+
if (start > end) {
|
|
151
|
+
throw new Error('startDate must be before or equal to endDate.');
|
|
152
|
+
}
|
|
153
|
+
const monthsDiff = (end.getFullYear() - start.getFullYear()) * 12 + (end.getMonth() - start.getMonth());
|
|
154
|
+
if (monthsDiff > 16) {
|
|
155
|
+
throw new Error(`Date range exceeds 16 months maximum. Requested: ${monthsDiff} months.`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export function validateDimensions(dimensions, maxDimensions = 3) {
|
|
159
|
+
if (dimensions.length > maxDimensions) {
|
|
160
|
+
throw new Error(`Maximum ${maxDimensions} dimensions allowed. Provided: ${dimensions.length}.`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function isWithin16Months(date) {
|
|
164
|
+
const d = new Date(date);
|
|
165
|
+
d.setHours(0, 0, 0, 0);
|
|
166
|
+
const sixteenMonthsAgo = new Date();
|
|
167
|
+
sixteenMonthsAgo.setMonth(sixteenMonthsAgo.getMonth() - 16);
|
|
168
|
+
sixteenMonthsAgo.setHours(0, 0, 0, 0);
|
|
169
|
+
return d >= sixteenMonthsAgo;
|
|
170
|
+
}
|
|
171
|
+
export function isValidPropertyUrl(url) {
|
|
172
|
+
if (url.startsWith('sc-domain:')) {
|
|
173
|
+
return /^sc-domain:[a-z0-9.-]+\.[a-z]{2,}$/i.test(url);
|
|
174
|
+
}
|
|
175
|
+
return /^https?:\/\/.+/.test(url);
|
|
176
|
+
}
|
|
177
|
+
export function formatDate(date) {
|
|
178
|
+
return date.toISOString().split('T')[0];
|
|
179
|
+
}
|
|
180
|
+
export function getDaysAgo(days) {
|
|
181
|
+
const date = new Date();
|
|
182
|
+
date.setDate(date.getDate() - days);
|
|
183
|
+
return formatDate(date);
|
|
184
|
+
}
|
|
185
|
+
export function getSixteenMonthsAgo() {
|
|
186
|
+
const date = new Date();
|
|
187
|
+
date.setMonth(date.getMonth() - 16);
|
|
188
|
+
return formatDate(date);
|
|
189
|
+
}
|
|
190
|
+
export function getToday() {
|
|
191
|
+
return formatDate(new Date());
|
|
192
|
+
}
|
|
193
|
+
export function formatValidationErrors(error) {
|
|
194
|
+
return error.issues.map(issue => {
|
|
195
|
+
const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
|
|
196
|
+
return `${path}${issue.message}`;
|
|
197
|
+
}).join('; ');
|
|
198
|
+
}
|
|
199
|
+
export function safeValidate(schema, data) {
|
|
200
|
+
const result = schema.safeParse(data);
|
|
201
|
+
if (result.success) {
|
|
202
|
+
return { success: true, data: result.data };
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
error: formatValidationErrors(result.error),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
export const comparisonSortBySchema = z.enum([
|
|
210
|
+
'clicks',
|
|
211
|
+
'impressions',
|
|
212
|
+
'ctr',
|
|
213
|
+
'position',
|
|
214
|
+
'clicks_change',
|
|
215
|
+
'clicks_percent_change',
|
|
216
|
+
'impressions_change',
|
|
217
|
+
'impressions_percent_change',
|
|
218
|
+
'position_change'
|
|
219
|
+
], {
|
|
220
|
+
errorMap: () => ({ message: 'Invalid comparison sort metric' })
|
|
221
|
+
});
|
|
222
|
+
export const positionRangeSchema = z.object({
|
|
223
|
+
min: z.number()
|
|
224
|
+
.positive('Minimum position must be positive')
|
|
225
|
+
.min(1, 'Minimum position must be at least 1'),
|
|
226
|
+
max: z.number()
|
|
227
|
+
.positive('Maximum position must be positive')
|
|
228
|
+
.min(1, 'Maximum position must be at least 1'),
|
|
229
|
+
}).refine((data) => data.min <= data.max, {
|
|
230
|
+
message: 'Minimum position must be less than or equal to maximum position',
|
|
231
|
+
path: ['max'],
|
|
232
|
+
});
|
|
233
|
+
export const topNLimitSchema = z.number()
|
|
234
|
+
.int('Limit must be an integer')
|
|
235
|
+
.min(1, 'Limit must be at least 1')
|
|
236
|
+
.max(1000, 'Limit cannot exceed 1,000')
|
|
237
|
+
.default(20);
|
|
238
|
+
export const minClicksSchema = z.number()
|
|
239
|
+
.int('Minimum clicks must be an integer')
|
|
240
|
+
.min(0, 'Minimum clicks cannot be negative')
|
|
241
|
+
.optional();
|
|
242
|
+
export const minImpressionsSchema = z.number()
|
|
243
|
+
.int('Minimum impressions must be an integer')
|
|
244
|
+
.min(0, 'Minimum impressions cannot be negative')
|
|
245
|
+
.optional();
|
|
246
|
+
export const queryAdvancedParamsSchema = z.object({
|
|
247
|
+
property: propertyUrlSchema,
|
|
248
|
+
startDate: dateSchema,
|
|
249
|
+
endDate: dateSchema,
|
|
250
|
+
dimensions: dimensionsSchema,
|
|
251
|
+
filters: z.array(filterSchema).optional(),
|
|
252
|
+
rowLimit: rowLimitSchema.default(25000),
|
|
253
|
+
sortBy: sortByMetricSchema.default('clicks'),
|
|
254
|
+
sortOrder: sortOrderSchema.default('desc'),
|
|
255
|
+
searchType: searchTypeSchema.optional(),
|
|
256
|
+
offset: z.number().int().min(0).optional().default(0),
|
|
257
|
+
limit: z.number().int().min(1).max(25000).optional(),
|
|
258
|
+
}).refine((data) => new Date(data.startDate) <= new Date(data.endDate), {
|
|
259
|
+
message: 'startDate must be before or equal to endDate',
|
|
260
|
+
path: ['endDate'],
|
|
261
|
+
});
|
|
262
|
+
export const getTopQueriesParamsSchema = z.object({
|
|
263
|
+
property: propertyUrlSchema,
|
|
264
|
+
startDate: dateSchema,
|
|
265
|
+
endDate: dateSchema,
|
|
266
|
+
limit: topNLimitSchema,
|
|
267
|
+
sortBy: sortByMetricSchema.default('clicks'),
|
|
268
|
+
sortOrder: sortOrderSchema.default('desc'),
|
|
269
|
+
searchType: searchTypeSchema.optional(),
|
|
270
|
+
deviceType: deviceTypeSchema.optional(),
|
|
271
|
+
country: countryCodeSchema.optional(),
|
|
272
|
+
minClicks: minClicksSchema,
|
|
273
|
+
minImpressions: minImpressionsSchema,
|
|
274
|
+
positionRange: positionRangeSchema.optional(),
|
|
275
|
+
}).refine((data) => new Date(data.startDate) <= new Date(data.endDate), {
|
|
276
|
+
message: 'startDate must be before or equal to endDate',
|
|
277
|
+
path: ['endDate'],
|
|
278
|
+
});
|
|
279
|
+
export const getTopPagesParamsSchema = z.object({
|
|
280
|
+
property: propertyUrlSchema,
|
|
281
|
+
startDate: dateSchema,
|
|
282
|
+
endDate: dateSchema,
|
|
283
|
+
limit: topNLimitSchema,
|
|
284
|
+
sortBy: sortByMetricSchema.default('clicks'),
|
|
285
|
+
sortOrder: sortOrderSchema.default('desc'),
|
|
286
|
+
searchType: searchTypeSchema.optional(),
|
|
287
|
+
deviceType: deviceTypeSchema.optional(),
|
|
288
|
+
country: countryCodeSchema.optional(),
|
|
289
|
+
minClicks: minClicksSchema,
|
|
290
|
+
minImpressions: minImpressionsSchema,
|
|
291
|
+
positionRange: positionRangeSchema.optional(),
|
|
292
|
+
}).refine((data) => new Date(data.startDate) <= new Date(data.endDate), {
|
|
293
|
+
message: 'startDate must be before or equal to endDate',
|
|
294
|
+
path: ['endDate'],
|
|
295
|
+
});
|
|
296
|
+
export const compareDateRangesParamsSchema = z.object({
|
|
297
|
+
property: propertyUrlSchema,
|
|
298
|
+
dimension: z.enum(['query', 'page'], {
|
|
299
|
+
errorMap: () => ({ message: 'Dimension must be either "query" or "page"' })
|
|
300
|
+
}),
|
|
301
|
+
currentStartDate: dateSchema,
|
|
302
|
+
currentEndDate: dateSchema,
|
|
303
|
+
previousStartDate: dateSchema,
|
|
304
|
+
previousEndDate: dateSchema,
|
|
305
|
+
limit: topNLimitSchema.default(50),
|
|
306
|
+
sortBy: comparisonSortBySchema.default('clicks_change'),
|
|
307
|
+
searchType: searchTypeSchema.optional(),
|
|
308
|
+
minCurrentClicks: minClicksSchema,
|
|
309
|
+
deviceType: deviceTypeSchema.optional(),
|
|
310
|
+
country: countryCodeSchema.optional(),
|
|
311
|
+
}).refine((data) => new Date(data.currentStartDate) <= new Date(data.currentEndDate), {
|
|
312
|
+
message: 'currentStartDate must be before or equal to currentEndDate',
|
|
313
|
+
path: ['currentEndDate'],
|
|
314
|
+
}).refine((data) => new Date(data.previousStartDate) <= new Date(data.previousEndDate), {
|
|
315
|
+
message: 'previousStartDate must be before or equal to previousEndDate',
|
|
316
|
+
path: ['previousEndDate'],
|
|
317
|
+
}).refine((data) => new Date(data.currentEndDate) < new Date(data.previousStartDate) ||
|
|
318
|
+
new Date(data.previousEndDate) < new Date(data.currentStartDate), {
|
|
319
|
+
message: 'Date ranges should not overlap for meaningful comparison',
|
|
320
|
+
path: ['currentStartDate'],
|
|
321
|
+
});
|
|
322
|
+
export const getPropertyInfoParamsSchema = z.object({
|
|
323
|
+
propertyUrl: propertyUrlSchema,
|
|
324
|
+
});
|
|
325
|
+
export const VALID_GSC_DIMENSIONS = [
|
|
326
|
+
'query',
|
|
327
|
+
'page',
|
|
328
|
+
'country',
|
|
329
|
+
'device',
|
|
330
|
+
'searchAppearance',
|
|
331
|
+
'date'
|
|
332
|
+
];
|
|
333
|
+
export const VALID_FILTER_OPERATORS = [
|
|
334
|
+
'equals',
|
|
335
|
+
'notEquals',
|
|
336
|
+
'contains',
|
|
337
|
+
'notContains',
|
|
338
|
+
'includingRegex',
|
|
339
|
+
'excludingRegex'
|
|
340
|
+
];
|
|
341
|
+
export const VALID_SORT_METRICS = [
|
|
342
|
+
'clicks',
|
|
343
|
+
'impressions',
|
|
344
|
+
'ctr',
|
|
345
|
+
'position'
|
|
346
|
+
];
|
|
347
|
+
export const VALID_COMPARISON_SORT_METRICS = [
|
|
348
|
+
'clicks',
|
|
349
|
+
'impressions',
|
|
350
|
+
'ctr',
|
|
351
|
+
'position',
|
|
352
|
+
'clicks_change',
|
|
353
|
+
'clicks_percent_change',
|
|
354
|
+
'impressions_change',
|
|
355
|
+
'impressions_percent_change',
|
|
356
|
+
'position_change'
|
|
357
|
+
];
|
|
358
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@disruptorganic/mcp-google-search-console",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Google Search Console MCP server for Claude Code - Query GSC data with AI",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-gsc": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
".env.example"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18.0.0"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"prepare": "npm run build",
|
|
22
|
+
"_prepublishOnly": "npm run test && npm run build",
|
|
23
|
+
"start": "node dist/index.js",
|
|
24
|
+
"dev": "tsx src/index.ts",
|
|
25
|
+
"test": "jest",
|
|
26
|
+
"test:watch": "jest --watch",
|
|
27
|
+
"test:coverage": "jest --coverage",
|
|
28
|
+
"clean": "rm -rf dist",
|
|
29
|
+
"rebuild": "npm run clean && npm run build"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"model-context-protocol",
|
|
34
|
+
"google-search-console",
|
|
35
|
+
"gsc",
|
|
36
|
+
"claude",
|
|
37
|
+
"claude-code",
|
|
38
|
+
"ai",
|
|
39
|
+
"search-analytics",
|
|
40
|
+
"seo",
|
|
41
|
+
"webmaster-tools"
|
|
42
|
+
],
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/The-SEO-Hustler/mcp-google-search-console.git"
|
|
46
|
+
},
|
|
47
|
+
"homepage": "https://github.com/The-SEO-Hustler/mcp-google-search-console#readme",
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/The-SEO-Hustler/mcp-google-search-console/issues"
|
|
50
|
+
},
|
|
51
|
+
"author": "Zac Almeida <zac@disruptorganic.com>",
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
58
|
+
"google-auth-library": "^9.0.0",
|
|
59
|
+
"googleapis": "^143.0.0",
|
|
60
|
+
"node-cache": "^5.1.0",
|
|
61
|
+
"winston": "^3.11.0",
|
|
62
|
+
"zod": "^3.22.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/jest": "^29.0.0",
|
|
66
|
+
"@types/node": "^20.19.25",
|
|
67
|
+
"@types/node-cache": "^4.1.3",
|
|
68
|
+
"jest": "^29.0.0",
|
|
69
|
+
"ts-jest": "^29.0.0",
|
|
70
|
+
"tsx": "^4.20.6",
|
|
71
|
+
"typescript": "^5.0.0"
|
|
72
|
+
}
|
|
73
|
+
}
|