n8n-nodes-google-search-console-mcp
Version:
N8N community node for Google Search Console MCP integration with Service Account auth and 6 GSC operations
252 lines (251 loc) • 11.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GoogleSearchConsoleTool = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const googleapis_1 = require("googleapis");
class GoogleSearchConsoleTool {
constructor() {
this.description = {
displayName: 'Google Search Console',
name: 'googleSearchConsoleTool',
icon: 'file:google-search-console.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"]}}',
description: 'Interact with Google Search Console API for SEO data management',
defaults: {
name: 'Google Search Console',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'googleSearchConsoleApi',
required: true,
},
],
requestDefaults: {
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
},
properties: [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'List Sites',
value: 'listSites',
description: 'List all verified sites in Search Console',
action: 'List all verified sites',
},
{
name: 'List Sitemaps',
value: 'listSitemaps',
description: 'List sitemaps for a specific site',
action: 'List sitemaps for a site',
},
{
name: 'URL Inspection',
value: 'urlInspection',
description: 'Inspect a specific URL for indexing status',
action: 'Inspect a URL',
},
{
name: 'Get Sitemap Details',
value: 'getSitemap',
description: 'Get detailed information about a sitemap',
action: 'Get sitemap details',
},
{
name: 'Submit Sitemap',
value: 'submitSitemap',
description: 'Submit a new sitemap to Google',
action: 'Submit a sitemap',
},
{
name: 'Delete Sitemap',
value: 'deleteSitemap',
description: 'Remove a sitemap from Google Search Console',
action: 'Delete a sitemap',
},
],
default: 'listSites',
},
{
displayName: 'Site URL',
name: 'siteUrl',
type: 'string',
displayOptions: {
show: {
operation: ['listSitemaps', 'urlInspection', 'getSitemap', 'submitSitemap', 'deleteSitemap'],
},
},
default: '',
placeholder: 'https://example.com/',
description: 'The URL of the site in Search Console (must be verified)',
required: true,
},
{
displayName: 'Inspection URL',
name: 'inspectionUrl',
type: 'string',
displayOptions: {
show: {
operation: ['urlInspection'],
},
},
default: '',
placeholder: 'https://example.com/page-to-inspect',
description: 'The specific URL to inspect for indexing status',
required: true,
},
{
displayName: 'Sitemap URL',
name: 'sitemapUrl',
type: 'string',
displayOptions: {
show: {
operation: ['getSitemap', 'submitSitemap', 'deleteSitemap'],
},
},
default: '',
placeholder: 'https://example.com/sitemap.xml',
description: 'The URL of the sitemap file',
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
operation: ['urlInspection'],
},
},
options: [
{
displayName: 'Language Code',
name: 'languageCode',
type: 'string',
default: '',
placeholder: 'en-US',
description: 'Optional language code for the inspection request',
},
],
},
],
};
}
async execute() {
const items = this.getInputData();
const operation = this.getNodeParameter('operation', 0);
const credentials = await this.getCredentials('googleSearchConsoleApi');
const auth = new googleapis_1.google.auth.GoogleAuth({
credentials: {
client_email: credentials.email,
private_key: credentials.privateKey.replace(/\\n/g, '\n'),
},
scopes: [
'https://www.googleapis.com/auth/webmasters.readonly',
'https://www.googleapis.com/auth/webmasters',
],
});
const searchconsole = googleapis_1.google.searchconsole({
version: 'v1',
auth,
});
const returnData = [];
for (let i = 0; i < items.length; i++) {
try {
let responseData;
switch (operation) {
case 'listSites':
const sitesResponse = await searchconsole.sites.list();
responseData = sitesResponse.data;
break;
case 'listSitemaps':
const siteUrl = this.getNodeParameter('siteUrl', i);
const sitemapsResponse = await searchconsole.sitemaps.list({
siteUrl: siteUrl,
});
responseData = sitemapsResponse.data;
break;
case 'urlInspection':
const inspectionSiteUrl = this.getNodeParameter('siteUrl', i);
const inspectionUrl = this.getNodeParameter('inspectionUrl', i);
const additionalFields = this.getNodeParameter('additionalFields', i, {});
const requestBody = {
inspectionUrl: inspectionUrl,
siteUrl: inspectionSiteUrl,
};
if (additionalFields.languageCode) {
requestBody.languageCode = additionalFields.languageCode;
}
const urlInspectionResponse = await searchconsole.urlInspection.index.inspect({
requestBody,
});
responseData = urlInspectionResponse.data;
break;
case 'getSitemap':
const getSitemapSiteUrl = this.getNodeParameter('siteUrl', i);
const getSitemapUrl = this.getNodeParameter('sitemapUrl', i);
const getSitemapResponse = await searchconsole.sitemaps.get({
siteUrl: getSitemapSiteUrl,
feedpath: getSitemapUrl,
});
responseData = getSitemapResponse.data;
break;
case 'submitSitemap':
const submitSiteUrl = this.getNodeParameter('siteUrl', i);
const submitSitemapUrl = this.getNodeParameter('sitemapUrl', i);
await searchconsole.sitemaps.submit({
siteUrl: submitSiteUrl,
feedpath: submitSitemapUrl,
});
responseData = {
success: true,
message: 'Sitemap submitted successfully',
siteUrl: submitSiteUrl,
sitemapUrl: submitSitemapUrl,
};
break;
case 'deleteSitemap':
const deleteSiteUrl = this.getNodeParameter('siteUrl', i);
const deleteSitemapUrl = this.getNodeParameter('sitemapUrl', i);
await searchconsole.sitemaps.delete({
siteUrl: deleteSiteUrl,
feedpath: deleteSitemapUrl,
});
responseData = {
success: true,
message: 'Sitemap deleted successfully',
siteUrl: deleteSiteUrl,
sitemapUrl: deleteSitemapUrl,
};
break;
default:
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The operation "${operation}" is not supported!`);
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex: i });
}
}
return [returnData];
}
}
exports.GoogleSearchConsoleTool = GoogleSearchConsoleTool;