@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
JavaScript
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 });
}
}