diff --git a/web/content/marketing/google-search-console-mcp.mdx b/web/content/marketing/google-search-console-mcp.mdx new file mode 100644 index 0000000..3483a5c --- /dev/null +++ b/web/content/marketing/google-search-console-mcp.mdx @@ -0,0 +1,72 @@ +--- +title: Free Google Search Console MCP +description: Connect Google Search Console to your AI agent for free. Read clicks, impressions, CTR, position, and indexing through the OpenSEO MCP, with no Google Cloud setup. +--- + +Many Google Search Console (GSC) MCP servers are open source and free, but they take a lot of effort to set up. You need to create a Google Cloud project, enable an API, build an OAuth client, download a `credentials.json`, then keep a local server running. OpenSEO handles the Google connection for you. You sign up, connect your property, and start asking. + +## Setup: Simple, zero-config + +### With OpenSEO + +1. Sign up for OpenSEO. +2. Go through the onboarding. +2. When prompted, click **Connect Search Console** and pick your property. +3. Add the [OpenSEO MCP endpoint](/docs/mcp) to Claude, Cursor, or ChatGPT. + +### The DIY way (every other GSC MCP) + +1. Create a Google Cloud project +2. Enable the Search Console API +3. Configure the OAuth consent screen +4. Create OAuth client credentials +5. Download `credentials.json` +6. Install and run a local MCP server + +## Things to actually ask it + +- "Which queries am I ranking on page two for that I'm close to pushing onto page one?" +- "Show me pages where impressions went up but clicks stayed flat — probably a title or meta problem." +- "Are any of my blog posts competing with each other for the same query?" +- "Is `/pricing` indexed? If not, what's blocking it?" +- "Which queries lost the most clicks over the last 28 days?" + +## What your agent can read + +Two read-only tools over the property you connect. Both pull Google's own numbers, and neither uses credits. + +**Search performance.** Clicks, impressions, CTR, and average position for your site, sliced by query, page, country, device, and date. Pull up to 16 months of history in a single question. + +**URL inspection.** Whether a page is indexed and, if not, why: coverage status, last crawl, the canonical Google chose versus the one you declared, plus mobile and rich-result checks. Up to 10 URLs at a time. + +The agent can read and inspect. It cannot change anything in your account. + +## Why it's free (and what isn't) + +Google doesn't charge you to read your own Search Console data, so neither do we. The Search Console tools use zero credits. When you want more, like keyword research, rank tracking, or backlink data, those tools run through the same MCP and use credits. Connect Search Console first, and reach for the rest when you need it. + +## OpenSEO vs. the alternatives + + + +## FAQ + +### Is it really free? + +Yes, all you need is an OpenSEO account. OpenSEO's other features do use usage credits, but aren't necessary to use the Google Search Console MCP. + +### Is it open source? + +Yes. OpenSEO is open source, so you can self-host the whole thing, including the Search Console MCP. The one-click connection here uses OpenSEO's hosted Google app. If you self-host, you bring your own Google OAuth client, the same Cloud-console step the hosted version saves you. Hosted means no setup; self-hosted means full control. + +### Is it read-only? + +Yes. OpenSEO requests read-only access (`webmasters.readonly`). Your agent can read performance data and inspect URLs, but it can't change your account. + +### Which AI clients work? + +Any MCP client, including Claude Code, Cursor, Codex, and OpenClaw. Add the OpenSEO MCP endpoint and sign in. + +### How fresh is the data? + +It's Google's own data, so the most recent few days can be incomplete. History runs back 16 months, the same as the Search Console interface. diff --git a/web/scripts/generate-sitemap.js b/web/scripts/generate-sitemap.js index c6dc264..8ecc146 100644 --- a/web/scripts/generate-sitemap.js +++ b/web/scripts/generate-sitemap.js @@ -25,6 +25,7 @@ const STATIC_PATHS = [ "/features", "/features/mcp", "/open-source-seo", + "/google-search-console-mcp", ...Object.values(FEATURE_PAGE_SLUGS).map((slug) => `/features/${slug}`), ]; diff --git a/web/src/components/comparison-table.tsx b/web/src/components/comparison-table.tsx new file mode 100644 index 0000000..dca7304 --- /dev/null +++ b/web/src/components/comparison-table.tsx @@ -0,0 +1,196 @@ +type Tone = "positive" | "negative" | "neutral"; + +type Cell = { + text: string; + tone?: Tone; + code?: boolean; +}; + +type Column = { + name: string; + highlight?: boolean; +}; + +const COLUMNS: Column[] = [ + { name: "OpenSEO", highlight: true }, + { name: "DIY open-source repos" }, + { name: "Data-pipeline tools" }, +]; + +const ROWS: { label: string; cells: Cell[] }[] = [ + { + label: "Setup", + cells: [ + { text: "Simple, guided onboarding", tone: "positive" }, + { text: "~30 min in the Google Cloud console" }, + { text: "Account + connector setup" }, + ], + }, + { + label: "Google Cloud project", + cells: [ + { text: "Not needed", tone: "positive" }, + { text: "Required", tone: "negative" }, + { text: "Usually not needed", tone: "positive" }, + ], + }, + { + label: "Price", + cells: [ + { text: "Free, no credits", tone: "positive" }, + { text: "Free (your time + your own quota)" }, + { text: "Paid or limited free tier", tone: "negative" }, + ], + }, + { + label: "Read-only and safe", + cells: [ + { text: "webmasters.readonly", tone: "positive", code: true }, + { text: "Depends on the scopes you grant" }, + { text: "Varies" }, + ], + }, + { + label: "Built for SEO", + cells: [ + { + text: "Also does keyword, rank, and backlink research", + tone: "positive", + }, + { text: "Search Console only", tone: "negative" }, + { text: "Reporting and analytics focus" }, + ], + }, + { + label: "Self-host option", + cells: [ + { text: "Yes", tone: "positive" }, + { text: "Yes", tone: "positive" }, + { text: "No", tone: "negative" }, + ], + }, +]; + +export function ComparisonTable() { + return ( +
+
+ + + + + ))} + + + + {ROWS.map((row) => ( + + + {row.cells.map((cell, i) => { + const highlight = COLUMNS[i]?.highlight; + return ( + + ); + })} + + ))} + +
+ {COLUMNS.map((col) => ( + + {col.name} +
+ {row.label} + + +
+
+
+ ); +} + +function CellContent({ cell, highlight }: { cell: Cell; highlight?: boolean }) { + const tone = cell.tone ?? "neutral"; + const textClass = + tone === "negative" + ? "text-neutral-400" + : highlight && tone === "positive" + ? "font-medium text-neutral-900" + : "text-neutral-700"; + + return ( +
+ + + + + {cell.code ? ( + + {cell.text} + + ) : ( + cell.text + )} + +
+ ); +} + +function ToneIcon({ tone }: { tone: Tone }) { + if (tone === "positive") { + return ( + + ); + } + if (tone === "negative") { + return ( + + ); + } + return null; +} diff --git a/web/src/components/site-footer.tsx b/web/src/components/site-footer.tsx index b72cf60..c7cbe3e 100644 --- a/web/src/components/site-footer.tsx +++ b/web/src/components/site-footer.tsx @@ -1,22 +1,57 @@ import { Link } from "@tanstack/react-router"; +import { featureGroups } from "@/lib/feature-pages"; + +const featureLinks = featureGroups.flatMap((group) => + group.pages.map((page) => ({ + label: page.eyebrow, + href: `/features/${page.slug}`, + })), +); export function SiteFooter({ className }: { className?: string }) { return (
-
+ + OpenSEO + + +
-

Product

+

Features

- OpenSEO - MCP - Open Source SEO - Pricing - Guides + {featureLinks.map((link) => ( + + {link.label} + + ))} + All features
+
-

Community

+

AI agents

+ OpenSEO MCP + + Google Search Console MCP + +
+
+ +
+

Resources

+
+ Why Open Source? + Guides + Docs + Skills +
+
+ +
+

Company

+
+ Pricing Discord -
-
-
-

Legal

-
Privacy Terms
diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts index 112cb8e..909f752 100644 --- a/web/src/routeTree.gen.ts +++ b/web/src/routeTree.gen.ts @@ -22,6 +22,7 @@ import { Route as ApiSubscribeRouteImport } from './routes/api/subscribe' import { Route as ApiEventRouteImport } from './routes/api/event' import { Route as MarketingPricingRouteImport } from './routes/_marketing/pricing' import { Route as MarketingOpenSourceSeoRouteImport } from './routes/_marketing/open-source-seo' +import { Route as MarketingGoogleSearchConsoleMcpRouteImport } from './routes/_marketing/google-search-console-mcp' import { Route as MarketingFeaturesIndexRouteImport } from './routes/_marketing/features/index' import { Route as MarketingFeaturesSiteAuditRouteImport } from './routes/_marketing/features/site-audit' import { Route as MarketingFeaturesSavedKeywordsRouteImport } from './routes/_marketing/features/saved-keywords' @@ -97,6 +98,12 @@ const MarketingOpenSourceSeoRoute = MarketingOpenSourceSeoRouteImport.update({ path: '/open-source-seo', getParentRoute: () => MarketingRoute, } as any) +const MarketingGoogleSearchConsoleMcpRoute = + MarketingGoogleSearchConsoleMcpRouteImport.update({ + id: '/google-search-console-mcp', + path: '/google-search-console-mcp', + getParentRoute: () => MarketingRoute, + } as any) const MarketingFeaturesIndexRoute = MarketingFeaturesIndexRouteImport.update({ id: '/features/', path: '/features/', @@ -160,6 +167,7 @@ export interface FileRoutesByFullPath { '/': typeof MarketingIndexRoute '/privacy': typeof PrivacyRoute '/terms-and-conditions': typeof TermsAndConditionsRoute + '/google-search-console-mcp': typeof MarketingGoogleSearchConsoleMcpRoute '/open-source-seo': typeof MarketingOpenSourceSeoRoute '/pricing': typeof MarketingPricingRoute '/api/event': typeof ApiEventRoute @@ -183,6 +191,7 @@ export interface FileRoutesByFullPath { export interface FileRoutesByTo { '/privacy': typeof PrivacyRoute '/terms-and-conditions': typeof TermsAndConditionsRoute + '/google-search-console-mcp': typeof MarketingGoogleSearchConsoleMcpRoute '/open-source-seo': typeof MarketingOpenSourceSeoRoute '/pricing': typeof MarketingPricingRoute '/api/event': typeof ApiEventRoute @@ -209,6 +218,7 @@ export interface FileRoutesById { '/_marketing': typeof MarketingRouteWithChildren '/privacy': typeof PrivacyRoute '/terms-and-conditions': typeof TermsAndConditionsRoute + '/_marketing/google-search-console-mcp': typeof MarketingGoogleSearchConsoleMcpRoute '/_marketing/open-source-seo': typeof MarketingOpenSourceSeoRoute '/_marketing/pricing': typeof MarketingPricingRoute '/api/event': typeof ApiEventRoute @@ -236,6 +246,7 @@ export interface FileRouteTypes { | '/' | '/privacy' | '/terms-and-conditions' + | '/google-search-console-mcp' | '/open-source-seo' | '/pricing' | '/api/event' @@ -259,6 +270,7 @@ export interface FileRouteTypes { to: | '/privacy' | '/terms-and-conditions' + | '/google-search-console-mcp' | '/open-source-seo' | '/pricing' | '/api/event' @@ -284,6 +296,7 @@ export interface FileRouteTypes { | '/_marketing' | '/privacy' | '/terms-and-conditions' + | '/_marketing/google-search-console-mcp' | '/_marketing/open-source-seo' | '/_marketing/pricing' | '/api/event' @@ -412,6 +425,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MarketingOpenSourceSeoRouteImport parentRoute: typeof MarketingRoute } + '/_marketing/google-search-console-mcp': { + id: '/_marketing/google-search-console-mcp' + path: '/google-search-console-mcp' + fullPath: '/google-search-console-mcp' + preLoaderRoute: typeof MarketingGoogleSearchConsoleMcpRouteImport + parentRoute: typeof MarketingRoute + } '/_marketing/features/': { id: '/_marketing/features/' path: '/features' @@ -486,6 +506,7 @@ declare module '@tanstack/react-router' { } interface MarketingRouteChildren { + MarketingGoogleSearchConsoleMcpRoute: typeof MarketingGoogleSearchConsoleMcpRoute MarketingOpenSourceSeoRoute: typeof MarketingOpenSourceSeoRoute MarketingPricingRoute: typeof MarketingPricingRoute MarketingIndexRoute: typeof MarketingIndexRoute @@ -502,6 +523,7 @@ interface MarketingRouteChildren { } const MarketingRouteChildren: MarketingRouteChildren = { + MarketingGoogleSearchConsoleMcpRoute: MarketingGoogleSearchConsoleMcpRoute, MarketingOpenSourceSeoRoute: MarketingOpenSourceSeoRoute, MarketingPricingRoute: MarketingPricingRoute, MarketingIndexRoute: MarketingIndexRoute, diff --git a/web/src/routes/_marketing.tsx b/web/src/routes/_marketing.tsx index 7ec0915..db09c8e 100644 --- a/web/src/routes/_marketing.tsx +++ b/web/src/routes/_marketing.tsx @@ -17,7 +17,7 @@ const mobileNavItems = [ label: "Resources", links: [ { label: "Guides", href: "/guides" }, - { label: "Open Source SEO", href: "/open-source-seo" }, + { label: "Why Open Source?", href: "/open-source-seo" }, { label: "MCP Setup", href: "/docs/mcp" }, { label: "Skills", href: "/docs/skills" }, ], @@ -204,9 +204,9 @@ function ResourcesDropdown() { description: "Founder-focused SEO articles.", }, { - label: "Open Source SEO", + label: "Why Open Source?", href: "/open-source-seo", - description: "Why OpenSEO is open source.", + description: "Open source puts the power in user's hands.", }, { label: "MCP", @@ -313,6 +313,17 @@ function FeatureDropdown() { Connect Claude, Codex, and agents. + + + Search Console MCP + + + Free first-party GSC data for agents. + + @@ -37,27 +37,49 @@ function FeaturesIndex() { AI agent workflows

- Let supported MCP clients research keywords, SERPs, domains, and - backlinks through OpenSEO. + Let supported MCP clients research keywords, SERPs, domains, + backlinks, and first-party Search Console data through OpenSEO.

- -

OpenSEO MCP

-

- OpenSEO MCP for your AI agent -

-

- Connect OpenSEO to Claude, Codex, and supported MCP clients so - agents can call OpenSEO research tools with authorized project - context. -

-

- Explore MCP -

-
+
+ +

+ OpenSEO MCP +

+

+ OpenSEO MCP for your AI agent +

+

+ Connect OpenSEO to Claude, Codex, and supported MCP clients so + agents can call OpenSEO research tools with authorized project + context. +

+

+ Explore MCP +

+
+ +

+ Search Console MCP +

+

+ Free Google Search Console MCP +

+

+ Let your agent read clicks, impressions, CTR, position, and URL + inspection data from your connected Search Console property. +

+

+ Explore GSC MCP +

+
+
{featureGroups.map((group) => ( diff --git a/web/src/routes/_marketing/features/mcp.tsx b/web/src/routes/_marketing/features/mcp.tsx index 0999c12..80a7af9 100644 --- a/web/src/routes/_marketing/features/mcp.tsx +++ b/web/src/routes/_marketing/features/mcp.tsx @@ -2,7 +2,7 @@ import { createFileRoute } from "@tanstack/react-router"; import { buildPageSeo } from "@/lib/seo"; const mcpDescription = - "Connect OpenSEO MCP so compatible AI clients can call keyword, SERP, domain, backlink, saved keyword, and rank-tracking tools."; + "Connect OpenSEO MCP so compatible AI clients can call keyword, SERP, domain, backlink, saved keyword, rank-tracking, and Google Search Console tools."; const toolCategories = [ { @@ -39,13 +39,33 @@ const toolCategories = [ }, ], }, + { + label: "Search Console", + tools: [ + { + title: "Get GSC performance", + description: + "Read clicks, impressions, CTR, and position from the connected property.", + }, + { + title: "Inspect URLs", + description: + "Check index coverage, crawl, canonical, mobile, and rich-result signals.", + }, + { + title: "Use first-party data", + description: + "Run read-only Search Console calls for free with no OpenSEO credits.", + }, + ], + }, ] as const; const workflows = [ { title: "Research with live SEO data", description: - "Give Codex, Claude, and other MCP clients access to OpenSEO keyword, SERP, domain, backlink, saved keyword, and rank-tracking data.", + "Give Codex, Claude, and other MCP clients access to OpenSEO keyword, SERP, domain, backlink, saved keyword, rank-tracking, and Search Console data.", }, { title: "Keep the agent focused", @@ -80,7 +100,8 @@ function McpPage() {

Connect OpenSEO to your AI agent so it can research keywords, inspect SERPs, compare competitors, summarize backlink context, save keyword - opportunities, and review rank-tracking data with live SEO context. + opportunities, review rank-tracking data, and read first-party Search + Console signals with live SEO context.

@@ -134,7 +155,7 @@ function McpPage() {

Available tool groups

-
+
{toolCategories.map((category) => (

@@ -157,6 +178,25 @@ function McpPage() {

+
+

+ New: free Google Search Console MCP +

+

+ OpenSEO MCP can read Search Console performance and URL inspection + data from a connected hosted project. These tools are read-only and do + not use OpenSEO credits. +

+ +
+

Setup lives in Docs diff --git a/web/src/routes/_marketing/google-search-console-mcp.tsx b/web/src/routes/_marketing/google-search-console-mcp.tsx new file mode 100644 index 0000000..82bf896 --- /dev/null +++ b/web/src/routes/_marketing/google-search-console-mcp.tsx @@ -0,0 +1,133 @@ +import { createFileRoute } from "@tanstack/react-router"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import { DocsBody } from "fumadocs-ui/page"; +import GoogleSearchConsoleMcpContent, { + frontmatter, +} from "../../../content/marketing/google-search-console-mcp.mdx"; +import { ComparisonTable } from "@/components/comparison-table"; +import { buildPageSeo, SITE_URL, toCanonicalUrl } from "@/lib/seo"; + +const PATH = "/google-search-console-mcp"; + +const softwareApplicationLd = { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "OpenSEO Google Search Console MCP", + applicationCategory: "BusinessApplication", + operatingSystem: "Web", + url: toCanonicalUrl(PATH), + description: frontmatter.description, + offers: { + "@type": "Offer", + price: "0", + priceCurrency: "USD", + }, + provider: { + "@type": "Organization", + name: "OpenSEO", + url: SITE_URL, + }, +}; + +export const Route = createFileRoute("/_marketing/google-search-console-mcp")({ + head: () => + buildPageSeo({ + title: "Free Google Search Console MCP", + description: frontmatter.description, + path: PATH, + titleSuffix: "OpenSEO", + ogType: "article", + }), + component: GoogleSearchConsoleMcpPage, +}); + +function GoogleSearchConsoleMcpPage() { + return ( +
+
+

+ {frontmatter.title} +

+ {frontmatter.description ? ( +

+ {frontmatter.description} +

+ ) : null} + +
+ + + + + + + +