@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.
Files changed (108) hide show
  1. package/.env.example +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/dist/auth/index.d.ts +3 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +2 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth/oauth2.d.ts +31 -0
  9. package/dist/auth/oauth2.d.ts.map +1 -0
  10. package/dist/auth/oauth2.js +380 -0
  11. package/dist/auth/oauth2.js.map +1 -0
  12. package/dist/config/index.d.ts +36 -0
  13. package/dist/config/index.d.ts.map +1 -0
  14. package/dist/config/index.js +87 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/gsc/client.d.ts +72 -0
  17. package/dist/gsc/client.d.ts.map +1 -0
  18. package/dist/gsc/client.js +243 -0
  19. package/dist/gsc/client.js.map +1 -0
  20. package/dist/gsc/index.d.ts +3 -0
  21. package/dist/gsc/index.d.ts.map +1 -0
  22. package/dist/gsc/index.js +3 -0
  23. package/dist/gsc/index.js.map +1 -0
  24. package/dist/gsc/properties.d.ts +42 -0
  25. package/dist/gsc/properties.d.ts.map +1 -0
  26. package/dist/gsc/properties.js +393 -0
  27. package/dist/gsc/properties.js.map +1 -0
  28. package/dist/gsc/queries.d.ts +73 -0
  29. package/dist/gsc/queries.d.ts.map +1 -0
  30. package/dist/gsc/queries.js +390 -0
  31. package/dist/gsc/queries.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +186 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/tools/compare-date-ranges.d.ts +83 -0
  37. package/dist/tools/compare-date-ranges.d.ts.map +1 -0
  38. package/dist/tools/compare-date-ranges.js +462 -0
  39. package/dist/tools/compare-date-ranges.js.map +1 -0
  40. package/dist/tools/get-property-info.d.ts +30 -0
  41. package/dist/tools/get-property-info.d.ts.map +1 -0
  42. package/dist/tools/get-property-info.js +174 -0
  43. package/dist/tools/get-property-info.js.map +1 -0
  44. package/dist/tools/get-top-pages.d.ts +103 -0
  45. package/dist/tools/get-top-pages.d.ts.map +1 -0
  46. package/dist/tools/get-top-pages.js +254 -0
  47. package/dist/tools/get-top-pages.js.map +1 -0
  48. package/dist/tools/get-top-queries.d.ts +103 -0
  49. package/dist/tools/get-top-queries.d.ts.map +1 -0
  50. package/dist/tools/get-top-queries.js +254 -0
  51. package/dist/tools/get-top-queries.js.map +1 -0
  52. package/dist/tools/health-check.d.ts +12 -0
  53. package/dist/tools/health-check.d.ts.map +1 -0
  54. package/dist/tools/health-check.js +107 -0
  55. package/dist/tools/health-check.js.map +1 -0
  56. package/dist/tools/index.d.ts +1124 -0
  57. package/dist/tools/index.d.ts.map +1 -0
  58. package/dist/tools/index.js +70 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/list-properties.d.ts +50 -0
  61. package/dist/tools/list-properties.d.ts.map +1 -0
  62. package/dist/tools/list-properties.js +234 -0
  63. package/dist/tools/list-properties.js.map +1 -0
  64. package/dist/tools/query-advanced.d.ts +109 -0
  65. package/dist/tools/query-advanced.d.ts.map +1 -0
  66. package/dist/tools/query-advanced.js +378 -0
  67. package/dist/tools/query-advanced.js.map +1 -0
  68. package/dist/tools/query-by-keyword.d.ts +115 -0
  69. package/dist/tools/query-by-keyword.d.ts.map +1 -0
  70. package/dist/tools/query-by-keyword.js +339 -0
  71. package/dist/tools/query-by-keyword.js.map +1 -0
  72. package/dist/tools/query-by-url.d.ts +116 -0
  73. package/dist/tools/query-by-url.d.ts.map +1 -0
  74. package/dist/tools/query-by-url.js +366 -0
  75. package/dist/tools/query-by-url.js.map +1 -0
  76. package/dist/utils/cache.d.ts +22 -0
  77. package/dist/utils/cache.d.ts.map +1 -0
  78. package/dist/utils/cache.js +75 -0
  79. package/dist/utils/cache.js.map +1 -0
  80. package/dist/utils/index.d.ts +8 -0
  81. package/dist/utils/index.d.ts.map +1 -0
  82. package/dist/utils/index.js +8 -0
  83. package/dist/utils/index.js.map +1 -0
  84. package/dist/utils/logger.d.ts +4 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +15 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/metrics.d.ts +9 -0
  89. package/dist/utils/metrics.d.ts.map +1 -0
  90. package/dist/utils/metrics.js +54 -0
  91. package/dist/utils/metrics.js.map +1 -0
  92. package/dist/utils/rate-limiter.d.ts +24 -0
  93. package/dist/utils/rate-limiter.d.ts.map +1 -0
  94. package/dist/utils/rate-limiter.js +175 -0
  95. package/dist/utils/rate-limiter.js.map +1 -0
  96. package/dist/utils/token-estimator.d.ts +33 -0
  97. package/dist/utils/token-estimator.d.ts.map +1 -0
  98. package/dist/utils/token-estimator.js +226 -0
  99. package/dist/utils/token-estimator.js.map +1 -0
  100. package/dist/utils/types.d.ts +68 -0
  101. package/dist/utils/types.d.ts.map +1 -0
  102. package/dist/utils/types.js +13 -0
  103. package/dist/utils/types.js.map +1 -0
  104. package/dist/utils/validators.d.ts +579 -0
  105. package/dist/utils/validators.d.ts.map +1 -0
  106. package/dist/utils/validators.js +358 -0
  107. package/dist/utils/validators.js.map +1 -0
  108. 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,3 @@
1
+ export { GSCClient, GSCApiError } from './client.js';
2
+ export { executeParallelQueries, queryMultipleKeywords, aggregateResults, sortResults, filterResults, getResultStatistics } from './queries.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}