UNPKG

@bdmarvin/mcp-server-gsc

Version:

A Model Context Protocol (MCP) server providing access to Google Search Console using OAuth2 tokens.

77 lines (76 loc) 3.04 kB
import { google } from 'googleapis'; export class SearchConsoleService { constructor() { // Constructor is now empty } getOAuth2Client(accessToken) { const oauth2Client = new google.auth.OAuth2(); oauth2Client.setCredentials({ access_token: accessToken }); return oauth2Client; } getWebmasters(accessToken) { const authClient = this.getOAuth2Client(accessToken); return google.webmasters({ version: 'v3', auth: authClient, }); } getSearchConsole(accessToken) { const authClient = this.getOAuth2Client(accessToken); return google.searchconsole({ version: 'v1', auth: authClient, }); } normalizeUrl(url) { const parsedUrl = new URL(url); if (parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:') { return `sc-domain:${parsedUrl.hostname}`; } return `https://${url}`; } async handlePermissionError(operation, fallbackOperation) { try { return await operation(); } catch (err) { if (err instanceof Error && err.message && err.message.toLowerCase().includes('permission')) { return await fallbackOperation(); } throw err; } } async searchAnalytics(accessToken, siteUrl, requestBody) { const webmasters = this.getWebmasters(accessToken); return this.handlePermissionError(() => webmasters.searchanalytics.query({ siteUrl, requestBody }), () => webmasters.searchanalytics.query({ siteUrl: this.normalizeUrl(siteUrl), requestBody })); } async listSites(accessToken) { const webmasters = this.getWebmasters(accessToken); return webmasters.sites.list(); } async listSitemaps(accessToken, requestBody) { const webmasters = this.getWebmasters(accessToken); return this.handlePermissionError(() => webmasters.sitemaps.list(requestBody), () => webmasters.sitemaps.list({ ...requestBody, siteUrl: this.normalizeUrl(requestBody.siteUrl), })); } async getSitemap(accessToken, requestBody) { const webmasters = this.getWebmasters(accessToken); return this.handlePermissionError(() => webmasters.sitemaps.get(requestBody), () => webmasters.sitemaps.get({ ...requestBody, siteUrl: this.normalizeUrl(requestBody.siteUrl), })); } async submitSitemap(accessToken, requestBody) { const webmasters = this.getWebmasters(accessToken); return this.handlePermissionError(() => webmasters.sitemaps.submit(requestBody), () => webmasters.sitemaps.submit({ ...requestBody, siteUrl: this.normalizeUrl(requestBody.siteUrl), })); } async indexInspect(accessToken, requestBody) { const searchConsole = this.getSearchConsole(accessToken); return searchConsole.urlInspection.index.inspect({ requestBody }); } }