UNPKG

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
"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;