GSC Maestro MCP Server
Integrates with Google Search Console using read-only OAuth access to sync authorized properties and retrieve queries, pages, daily performance, search opportunities, indexing/URL inspection data, and sitemap status.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GSC Maestro MCP Servershow my top search queries for the last 28 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Application preview
Actual published-source app captured in an isolated browser with built-in illustrative sample data. No connected websites or client properties.
Bring your own accounts and credentials. Nothing in this GitHub repository contains a developer's Google, Bing, Yandex, or ChatGPT access token, connected websites, search data, or private deployment configuration.
Related MCP server: SearchLink Lite
Glama public metrics demo
A separate restricted Glama edition exposes only CTR calculation, period comparisons and metric explanations on numbers supplied in the request. It does not access Google Search Console, Bing, Yandex, local client data or desktop credentials. The full MCP server requires your own authorized GSC Maestro desktop setup.
Features
Area | Capabilities |
Google Search Console | Desktop OAuth, authorized properties, queries, pages, daily performance, search opportunities, indexing/URL inspection, sitemap status. |
Bing Webmaster | Connect an existing Bing Webmaster API key, sync verified sites, and inspect engine-specific performance. |
Yandex Webmaster | Connect a personal Yandex OAuth token, discover properties and query/indexing information when the API permits access. |
Technical audit | Bounded public crawler and site-audit summaries with evidence and source attribution. |
AI Search and reports | Import supported Bing AI citation exports and generate source-labelled reports. |
MCP | Local stdio server, MCP Apps visual dashboard, and optional separately configured bearer/OAuth-protected HTTP gateway. |
Offline/local | SQLite snapshots and exports in each user's private application directory. No account credentials bundled with the app. |
Platform: Linux desktop (Tauri 2 + React + TypeScript + Rust), plus a Node.js 22 MCP server. Source code is supplied; prebuilt packages and live cloud integrations are not part of this repository. Features dependent on external APIs require those services and their permissions. Yandex API availability in particular is provider-dependent; a configured token is not a guarantee that all reports work.
Build and run locally
Requirements: Node.js 22+, npm, Rust/Cargo, and the system dependencies for Tauri 2 on Linux (notably WebKit2GTK 4.1, GTK3 development headers, and standard Linux build tools). See Tauri's Linux prerequisites.
git clone https://github.com/haseebgb92/GSC-Maestro.git
cd GSC-Maestro
npm ci
npm run desktopBuild an installable Linux Debian package:
npm run desktop:buildRun the local, read-only MCP server from the project folder:
npm run mcp:bundle
npm run mcpRun the frontend browser preview (without native Tauri account features) using npm run dev. The desktop app is needed to store Google/Bing/Yandex credentials and execute native sync commands.
First-time setup — your own credentials
Google Search Console
Open your own Google Cloud Console, select or create a project, and enable the Google Search Console API.
Set up Google's OAuth consent screen; use the appropriate publishing status/test users for your deployment.
Create an OAuth client ID → Desktop app, then download the client JSON. Do not commit this file or share it with others.
In GSC Maestro → Settings, choose Import OAuth JSON. The app saves the OAuth client settings in the operating-system keyring, not in this repository.
Click Connect Google, authorize the app in your system browser using its read-only Search Console scope, and then refresh/sync your own verified property.
Your Google authorization and refresh token are private to your Linux account. The app does not ship with preconnected properties or the repository author's OAuth client.
Bing Webmaster
Sign into your own Bing Webmaster Tools.
Obtain your API key from the account's API access settings.
Open the app's Bing section, paste the key into the password field, and choose Connect and sync.
The key is saved privately in the user's local application directory (mode 0600). It is never checked into Git, and no built-in key is supplied.
Yandex Webmaster
Obtain a Yandex OAuth token authorized for the Webmaster API through your own Yandex account and OAuth application.
Open the app's Yandex section and configure the token.
Refresh or sync verified sites. API permission, endpoint availability, and Yandex-side restrictions determine which data can be retrieved.
Yandex tokens are stored locally with private permissions. No Yandex OAuth application JSON, tokens, or account IDs from development are included.
Is Google API access paid?
GSC Maestro does not require a paid LLM/API subscription or the Advertpreneur/E92 account. Google Cloud, Bing and Yandex independently govern their APIs, quotas and authorization conditions; check their current terms for your own usage.
Data protection
Google: client configuration and refresh tokens are stored in the Linux Secret Service/keyring by the native app.
Bing/Yandex: their respective API credentials are stored in per-user private local files under
~/.local/share/com.advertpreneur.gscmaestro/.Analytics: local SQLite databases, report exports, OAuth sessions, logs, cache, credentials, and downloaded files are Git-ignored.
MCP: stdio does not expose a public network port. Optional HTTP listens on
127.0.0.1and creates its own strong local authentication token. Never expose the loopback service directly to the public Internet.No Google, Bing, or Yandex account is connected when a new user first clones this repository.
Optional hosted MCP / ChatGPT OAuth
The public HTTP/MCP endpoint is off by default. Running the local MCP server requires no public URL. If you deliberately want remote access, configure a real HTTPS reverse proxy and an independent hostname belonging to you, then set:
export GSC_MAESTRO_PUBLIC_BASE_URL='https://your-domain.example/gsc-maestro'
npm run mcp:httpSet the variable in your private service environment for unattended deployments; do not hard-code URLs, keys, tokens or OAuth files. .env.example lists optional settings, but it is a template, not an automatically loaded config or a safe place to commit filled-in values.
Without
GSC_MAESTRO_PUBLIC_BASE_URL, hosted OAuth routes are disabled; private localhost MCP can still use the generated local bearer token.The OAuth implementation's remote client support is presently ChatGPT-specific (PKCE with its known redirect/client metadata). Check your own compatible ChatGPT connector support before promising remote usage.
Remote exposure is optional and requires TLS, routing, owner approvals, verification, and normal security maintenance. No third-party tenant access is enabled by publishing this repository.
See SECURITY.md for credential-handling and responsible reporting guidance.
Test and verify
npm run security:check
npm test
npm run build
npm run mcp:bundle
node --no-warnings --experimental-sqlite tests/mcp-smoke.mjsnpm run desktop:build builds the Tauri Linux package. The MCP bundle build regenerates required deployment assets under the ignored src-tauri/resources/ directory.
Source layout
Path | Purpose |
| React desktop dashboard, charts, Google/Bing/Yandex views, indexing, reports. |
| Rust native commands, Google OAuth/keyring, private local storage, schedulers. |
| Search adapters, public-site crawler, authenticated HTTP transport, OAuth and MCP server. |
| Visual MCP Apps views. |
| Deterministic regression tests; no real credentials required. |
| Application branding for packages. |
Important limitations
Google Search Console, Bing and Yandex APIs may limit data or require separately verified ownership. Real Google Search Console authorization needs the desktop application and your own OAuth configuration. Search engine metrics are kept separate; sample data is visibly identified and should not be represented as live data. Direct write access to websites is not enabled by these read-only search connectors.
Never open a GitHub issue containing API keys, OAuth JSON, bearer tokens, user property exports, or search-console screenshots with sensitive client data.
Made by Advertpreneur. License: MIT.
Available Tools
4 toolsmaestro_calculate_ctrCalculate CTR from supplied search aggregatesARead-onlyIdempotent
Calculate clicks divided by impressions, as a percent. All numbers are supplied in the request and must represent the same search source, period and filters. No external queries or stored credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| clicks | Yes | Total search-result clicks from one search source and reporting period. | |
| impressions | Yes | Total search-result impressions for that exact source, period and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive and closed-world behavior, so the bar is lower. The description still adds real value beyond them: it declares the output unit (a percent) even though there is no output schema, and the 'no external queries or stored credentials' line reinforces the closed-world hint in concrete terms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, formula first, then the validity constraint, then the no-side-effects note. Nothing is redundant and every sentence carries information an agent needs before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-integer arithmetic tool with full schema coverage and no output schema, the description supplies everything needed: the operation, the unit of the result, and the input-consistency requirement. There is no residual ambiguity an agent would have to resolve at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both properties already document clicks and impressions as totals from one source and period. The description's consistency requirement (same source, period and filters) restates what the impressions parameter description already says, so it adds almost no new meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource — compute clicks divided by impressions as a percent — so there is no ambiguity about what comes out. It does not name or distinguish any sibling (maestro_compare_periods, maestro_explain_search_metrics), but those perform different jobs, so the omission is minor rather than disqualifying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the precondition for correct use: all numbers must represent the same search source, period and filters. It also clarifies that inputs come pre-supplied rather than being fetched. What it does not do is say when to avoid this tool or which sibling to use instead of computing CTR by hand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maestro_compare_periodsCompare user-supplied search reporting periodsARead-onlyIdempotent
Compare two periods using caller-provided click and impression totals and calculate CTR percentage-point changes. No saved search properties, API calls or estimated traffic.
| Name | Required | Description | Default |
|---|---|---|---|
| currentClicks | Yes | Nonnegative clicks in the later reporting period. | |
| previousClicks | Yes | Nonnegative clicks in the earlier reporting period. | |
| currentImpressions | Yes | Nonnegative impressions in the later reporting period. | |
| previousImpressions | Yes | Nonnegative impressions in the earlier reporting period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, non-destructive, and openWorldHint=false, and 'No API calls' largely restates that closed-world, pure-computation property. The addition of 'no saved search properties or estimated traffic' does add genuine scope context, but there is no disclosure of output shape, rounding behavior, or how percentage-point change is computed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the operation and its output are stated first, and the exclusion sentence follows as a scoping caveat. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should signal what comes back; it names the key result (CTR percentage-point change) but not the full return shape or whether raw CTRs are included. For a simple four-integer pure computation that is adequate, though slightly thin on return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already documented as nonnegative clicks/impressions in the earlier or later period. The description confirms the same framing ('caller-provided click and impression totals') but adds no format, unit, or edge-case guidance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Compare two periods') plus the concrete computation ('CTR percentage-point changes'), and scopes the inputs as 'caller-provided click and impression totals'. It distinguishes itself from the data-fetching siblings implicitly by ruling out saved properties and API calls, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No saved search properties, API calls or estimated traffic' effectively tells the agent when NOT to reach for this tool (i.e., when it needs live or estimated data from maestro_public_capabilities or maestro_explain_search_metrics). The when-to-use condition — the caller already has the four totals — is clear but stated indirectly rather than by naming an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maestro_explain_search_metricsExplain search performance metrics and caveatsARead-onlyIdempotent
Explain clicks, impressions, CTR, and average position, including why metrics from different engines should not be combined naively. No account access or source data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful context beyond that: 'No account access or source data' tells the agent this is self-contained reference knowledge, not a query, so it doesn't need credentials or a connected source to succeed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence: subject, scope, and the key caveat. Nothing is wasted and no reader has to scan for the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only explainer with no output schema, the definition covers what the agent needs in order to know why and how to call it. A brief hint about when to prefer it over its sibling computation tools would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline of 4 applies. The description's note that no account access or source data is needed reinforces the parameterless nature.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Explain') and the exact resources named (clicks, impressions, CTR, average position), plus the scope of the explanation (why metrics across engines shouldn't be naively combined). This distinguishes it from sibling tools like maestro_calculate_ctr and maestro_compare_periods, which compute or compare rather than define.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the definitional framing tells an agent to reach for this when it needs definitions or caveats rather than a computation. No explicit when/when-not guidance or named alternatives (e.g., 'use maestro_calculate_ctr for numeric results') are given, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maestro_public_capabilitiesPublic GSC Maestro edition: capabilitiesARead-onlyIdempotent
Explain what this hosted metrics demo does and cannot do. It cannot access any real Google, Bing, Yandex, or local desktop data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuinely new behavioral context beyond them: it names the data sources that are explicitly out of reach (Google, Bing, Yandex, local desktop), which prevents an agent from over-promising results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the affirmative scope statement is front-loaded ahead of the limitation. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema explainer, the definition covers purpose and the key constraint an agent must know. A brief note on what the response looks like (e.g., a capability list vs. prose) would close the remaining gap, but it is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool applies. No parameter-level detail is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Explain') and a concrete subject ('what this hosted metrics demo does and cannot do'), so an agent can tell this is a meta/capability-inquiry tool rather than a calculation. It does not explicitly contrast itself with the look-alike sibling maestro_explain_search_metrics, leaving that disambiguation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this should be called when a user asks about the demo's scope or whether it reaches real data. There is no explicit 'use this when' statement and no exclusion naming the sibling tools it should not be confused with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
maestro_calculate_ctr - First observed
maestro_compare_periods - First observed
maestro_explain_search_metrics - First observed
maestro_public_capabilities
TDQS
Scored across 4 tools
The two computational tools (maestro_calculate_ctr, maestro_compare_periods) are clearly distinct, and the two explanatory tools differ in subject matter (demo scope vs. metric definitions). There is mild overlap between maestro_public_capabilities and maestro_explain_search_metrics, since both are descriptive/explanatory with no side effects, but the descriptions make the boundary readable.
All tools share the maestro_ prefix and snake_case naming, which is highly predictable. The only deviation is that three names start with a verb (calculate, compare, explain) while maestro_public_capabilities is a noun phrase, a minor inconsistency.
Four tools is on the thin side but fits a deliberately narrow, credential-free metrics demo: two calculators and two explainers. Each tool earns its place and nothing appears redundant, though the surface leaves little room for variation.
The demo covers CTR calculation and period comparison plus explanatory context, but there is a gap: average position is explained yet no tool computes it, and there is no tool for aggregating or deriving other metrics from supplied clicks/impressions. These are notable but minor omissions given the stated educational scope.
Maintenance
Related MCP Connectors
Query your Google Search Console, GA4 and Bing Webmaster data across every site you run.
Read-only Google Search Console, Bing Webmaster Tools and privacy-friendly analytics for your AI.
Read-only Google Search Console MCP server for AI assistants.
Read-only Google Search Console and Google Analytics for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceRead-only MCP server for Google Search Console, with browser-based OAuth flow and local token storage, enabling querying search analytics, site lists, and URL inspection.8MIT
- AlicenseAqualityAmaintenanceEnables local, read-only access to Google Search Console data, allowing users to query site performance, identify ranking opportunities, inspect URL indexing, and review sitemap status through MCP clients.8MIT
- AlicenseNot gradedqualityBmaintenanceEnables read-only access to Google Search Console, Bing Webmaster Tools, and PageSpeed Insights, allowing queries for analytics, sites, sitemaps, inspections, crawl issues, and page speed analysis via natural language.1,619 npmMIT
- AlicenseAqualityAmaintenanceConnects AI assistants to a site owner's search performance data, letting them ask in plain language about clicks, queries, pages, indexing and sitemaps and get back structured results. Runs locally with your own credentials, read-only by default, and validates requests up front so the API's silent empty-result and terse-error quirks are caught before they mislead.22109 PyPI8MIT