easygsc
Let your AI app (Claude, Codex, Gemini, Cursor, VS Code Copilot or any other MCP app) read your Google Search Console data and help you with SEO.
- Read-only. It can see your data, never change it.
- Small. 4 tools, ~1,600 lines of Python you can audit in one sitting.
- Private. Talks only to Google. No telemetry, no third-party servers.
Ask things like "Which queries get impressions but few clicks?" or "Is this page indexed?" and your AI pulls the real numbers from Search Console.
Setup (about 5 minutes)
You need:
- A Google account with access to at least one Search Console property.
- uv installed. It also installs Python for you if needed.
- Windows:
winget install astral-sh.uv - macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
- Windows:
Step 1. Run the guided setup
uvx easygsc setup
It walks you through the Google Cloud steps one at a time, opening the right page in your browser and waiting for you to finish:
- Create a project.
- Enable the Search Console API.
- Configure the consent screen (External).
- Create a Desktop app OAuth client and download its JSON.
- Fill in Branding with your website's links (no logo).
- Publish the app.
Then it finds the JSON in your Downloads folder (or the OneDrive one, or asks for the path), checks it is a Desktop client, copies it to ~/.config/easygsc/client_secret.json with 0600 permissions, runs the Google login, checks that your properties are readable, and moves on to Step 2. It tells you which file it used and where it installed it.
- It never overwrites a different client file without asking, and only deletes your download if you say yes.
- No browser? Add
--no-browserto print the URLs instead. - Type
qor press Ctrl+C at any prompt to stop; runuvx easygsc setupagain to resume.
Step 2. Pick your AI apps
Setup ends with a numbered list of AI apps. The ones it finds on your computer are marked; press Enter to connect those, or type the numbers you want, like 1,3.
| App | What setup does |
|---|---|
| Claude Desktop | Asks you to quit it, then adds easygsc to claude_desktop_config.json (both copies on a Microsoft Store install). |
| Claude Code | Runs claude mcp add --scope user. |
| Codex (OpenAI) | Runs codex mcp add. |
| Gemini CLI | Adds it to ~/.gemini/settings.json. |
| Google Antigravity | Adds it to ~/.gemini/config/mcp_config.json. |
| Cursor | Adds it to ~/.cursor/mcp.json. |
| VS Code (GitHub Copilot) | Adds it to your user mcp.json. |
| Windsurf / Devin Desktop | Adds it to mcp_config.json. |
| LM Studio | Adds it to ~/.lmstudio/mcp.json. |
| Another app | Shows the command, arguments and JSON to paste into the app's MCP settings. |
Then do what it says for each app (usually: restart it) and ask "List my Search Console sites."
- Your settings are safe. It only edits plain JSON files, saves a backup next to each one first (
<file>.<date>.bak), keeps all your other settings, and asks before replacing an existingeasygscentry. A file it can't edit safely, such as one with comments, is left alone and you get the exact text to paste. - Add an app later with
easygsc connect(uvx easygsc connect). - Browser-only chats (ChatGPT, claude.ai or Gemini on the web) can't start programs on your computer, so they can't use easygsc. Use their desktop or command-line app: Claude Desktop, Claude Code, Codex or Gemini CLI.
Connect by hand instead
Claude Desktop: open Settings → Developer → Edit Config and add easygsc to claude_desktop_config.json:
{
"mcpServers": {
"easygsc": {
"command": "uvx",
"args": ["easygsc@0.2.0"]
}
}
}
If the file already has other servers, add only the "easygsc": {...} block inside mcpServers. Then quit Claude Desktop completely (including the tray/menu bar icon) and reopen it.
Claude Code (pick one):
# as a plugin
claude plugin marketplace add diegomm27/easygsc
claude plugin install easygsc@easygsc
# or as a plain MCP server
claude mcp add easygsc -- uvx easygsc@0.2.0
Any other MCP client: run uvx easygsc@0.2.0 over stdio.
If the app can't find uvx, use its full path (which uvx, or where uvx on Windows) as the command. easygsc connect does this for you.
CLI commands
| Command | What it does |
|---|---|
easygsc setup |
Guided setup: Google Cloud steps, client file, login, check, connect your AI apps. |
easygsc connect |
Add easygsc to your AI apps (the last step of setup, on its own). |
easygsc auth |
Run the Google login (--no-browser prints the URL). |
easygsc doctor |
Auth mode, token expiry, readable properties, config paths, version. |
easygsc serve |
Run the MCP server over stdio (also the default with no arguments). |
Manual setup
1. Create a Google OAuth client
This gives easygsc permission to ask Google for your data. You do it once.
-
Create a project. Open console.cloud.google.com/projectcreate, name it
easygscand click Create. Make sure it is selected in the project picker at the top.Tip: use a dedicated project. The consent screen is shared by everything in a project.
-
Enable the API. Open the Search Console API page and click Enable.
-
Set up the consent screen. Open Google Auth Platform and click Get started:
- App name:
easygsc - User support email: your email
- Audience: External
- Contact email: your email
- Accept the policy and click Create.
- App name:
-
Create the client. Open Clients, click Create client:
- Application type: Desktop app (not Web application)
- Name:
easygsc - Click Create, then Download JSON right away. Google won't show the secret again.
-
Fill in Branding. Open Branding. Google won't let you publish without these links:
- App logo: leave it empty. Uploading one forces Google verification.
- Application home page: your website, e.g.
https://example.com - Privacy policy link: your website's privacy page. If it has none, use
https://github.com/diegomm27/easygsc#security-and-transparency - Terms of service link: leave it empty.
- Authorized domains: your domain, e.g.
example.com(the one you verified in Search Console). Addgithub.comtoo if you used the link above. - Click Save.
-
Publish the app. Open Audience and click Publish app, then confirm. The status should read In production.
- Why: in Testing mode, Google expires your login every 7 days.
- Is it safe? Yes. Publishing does not make your data public. Anyone who logs in through it only sees their own Search Console, and nobody can read yours without your Google login.
2. Put the JSON file in place
Rename the downloaded file to client_secret.json and move it here:
| OS | Location |
|---|---|
| Windows | C:\Users\<you>\.config\easygsc\client_secret.json |
| macOS / Linux | ~/.config/easygsc/client_secret.json |
Windows (PowerShell):
mkdir $HOME\.config\easygsc -Force
Move-Item $HOME\Downloads\client_secret_*.json $HOME\.config\easygsc\client_secret.json
macOS / Linux:
mkdir -p ~/.config/easygsc
mv ~/Downloads/client_secret_*.json ~/.config/easygsc/client_secret.json
Windows gotcha: if you rename the file in Explorer with extensions hidden, it can end up as
client_secret.json.json. Check withdir $HOME\.config\easygsc.
3. Log in and check
uvx easygsc auth
Your browser opens:
- Pick the Google account that has access to Search Console.
- You'll see "Google hasn't verified this app". That's expected for a personal app: click Advanced → Go to easygsc.
- Allow read access to Search Console.
Your login is saved to ~/.config/easygsc/token.json. On a machine without a browser, add --no-browser and open the printed URL yourself.
Check that everything works:
uvx easygsc doctor
You should see auth check: OK and a property count above 0.
Try it
Start a new chat and ask:
- "List my Search Console properties."
- "Top 50 queries by impressions in the last 28 days for sc-domain:example.com."
- "Which pages have lots of impressions but a CTR under 2%?"
- "Queries where I rank between 5 and 15 on mobile."
- "Check the status of my sitemaps."
- "Is https://example.com/blog/post indexed?"
Start with the first one: it returns the exact property names (sc-domain:... or https://.../) the other tools need.
Tools
| Tool | What it returns |
|---|---|
list_sites() |
Properties you can read, with your permission level. |
search_analytics(site_url, ...) |
Clicks, impressions, CTR and position, by query, page, country, device, date or search appearance. Supports filters. |
list_sitemaps(site_url) |
Submitted sitemaps, last download, errors and warnings. |
inspect_url(site_url, url) |
Index status, canonical, last crawl, mobile usability. Limited by Google to 2,000 calls/day per property. |
Data comes back unprocessed (TSV or Google's raw JSON), so Claude works with exact numbers.
search_analytics parameters
| Parameter | Default | Options |
|---|---|---|
start_date, end_date |
last 28 days, ending 3 days ago (GSC data lag) | YYYY-MM-DD |
dimensions |
["query"] |
query, page, country, device, date, searchAppearance |
filters |
none | list of {"dimension", "operator", "expression"}; operators equals, notEquals, contains, notContains, includingRegex, excludingRegex |
search_type |
web |
web, image, video, news, discover, googleNews |
data_state |
final |
final, all (includes fresh data) |
row_limit |
1000 |
1 to 25000 |
start_row |
0 |
for pagination |
The output ends with a metadata block. more_may_exist: true means the page was full; ask for the next one with start_row.
Troubleshooting
| Problem | Fix |
|---|---|
No OAuth client configured |
Run easygsc setup, or check the path and name (Manual setup, step 2). |
auth failed: Client secrets is not in the correct format |
The client file is incomplete or was edited. Download it again from the Clients page and run easygsc setup. |
auth fails right away with a valid-looking file |
The client must be Desktop app. Open the JSON: it should start with {"installed":. If it starts with {"web":, create a new Desktop client. |
| "Google hasn't verified this app" | Normal. Click Advanced → Go to easygsc. |
401 / invalid_grant |
Login expired or was revoked. Usually the app was left in Testing: publish it (Manual setup, step 1.6), then run easygsc auth again. |
403 / "User does not have permission" |
Wrong property name or no access. Use the exact string from list_sites(): sc-domain:example.com for domain properties, https://example.com/ (with the trailing slash) for URL-prefix ones. |
doctor shows 0 properties |
You logged in with an account that has no Search Console access. Run auth again with the right one. |
| Your AI app doesn't see the tools | Fully quit and reopen the app (Claude Desktop: also from the tray/menu bar icon). Claude Code: claude mcp list. Codex: codex mcp list. Still nothing? Run easygsc connect again: it shows the settings file it used. |
spawn uvx ENOENT / "command not found" |
The app can't find uv. Run easygsc connect again: it writes the full path to uv. |
| Want to undo a connection | Each edited file has a .bak copy next to it; or delete the easygsc entry. Claude Code: claude mcp remove easygsc --scope user. Codex: codex mcp remove easygsc. |
429 / quota exceeded |
Google's daily limits. Wait and retry. |
| No data for old dates | Search Console only keeps 16 months. |
| Query totals don't add up | Google hides rare queries for privacy, so per-query sums are lower than the site total. |
To revoke access at any time: myaccount.google.com/permissions → easygsc → Remove access.
Security and transparency
- Permission requested: only
https://www.googleapis.com/auth/webmasters.readonly. easygsc cannot submit sitemaps, edit properties or manage users. - Network lock: every request goes through one guard (
src/easygsc/allowlist.py) that only allowswww.googleapis.com,searchconsole.googleapis.com,oauth2.googleapis.comandaccounts.google.com. Anything else, redirects included, fails before it's sent. - Endpoints used:
sites.list,searchAnalytics.query,sitemaps.list,urlInspection.index.inspect. Nothing else. - Files on disk:
~/.config/easygsc/client_secret.json(yours, installed byeasygsc setupwith0600permissions) and~/.config/easygsc/token.json(your login, also0600; best effort on Windows). Keeptoken.jsonprivate: whoever has it can read your Search Console. - AI app settings:
setupandconnectonly touch the apps you pick, back up each file first and make no network calls (src/easygsc/connect.py). - Dependencies:
mcp,google-auth,google-auth-oauthlib, pinned exactly. That's all. - Not included on purpose: writes, analysis or scoring, telemetry, update checks, bundled prompts.
Advanced: other ways to authenticate
easygsc looks for credentials in this order (doctor shows which one it used):
- Service account: set
EASYGSC_SERVICE_ACCOUNT_FILEto the path of a service account JSON key. Then add the service account's email as a user of your property in Search Console (Settings → Users and permissions). No browser login needed, good for servers. - Refresh token from the environment:
easygsc authprintsEASYGSC_REFRESH_TOKEN=...once. Set that variable (plus the OAuth client, see below) to run without atoken.jsonfile, for example in a container. Treat it like a password. - Saved login:
~/.config/easygsc/token.json, created byeasygsc auth.
Instead of client_secret.json, you can provide the OAuth client with the EASYGSC_CLIENT_ID and EASYGSC_CLIENT_SECRET environment variables.
Development
git clone https://github.com/diegomm27/easygsc.git
cd easygsc
uv sync # install with dev dependencies
uv run pytest # tests (no network, HTTP is mocked)
uv run ruff check src tests && uv run ruff format --check src tests
claude plugin validate . # check the plugin manifest
CI runs lint and tests on Linux, macOS and Windows (Python 3.10 and 3.12). Releases are published to PyPI through Trusted Publishing.
License
MIT. See LICENSE.
Metadata
Release files for easygsc 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| easygsc-0.2.0.tar.gz | 155.1 kB | With provenance | Details for easygsc-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| easygsc-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for easygsc-0.2.0-py3-none-any.whl |
Total release size: 186.6 kB
Release files / easygsc-0.2.0.tar.gz
| Download URL | easygsc-0.2.0.tar.gz |
|---|---|
| Size | 155.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ed5671bf0e83a3d3f0cf949a352d8b3ac534c63c6e3989a54d87596bedaf7cd3
|
|
BLAKE2b-256 checksum How to use checksums |
d32ce89b9a3cc7563e92421f5d5a9a7215fbb21acb5b8e8ad203059c15aff019
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / easygsc-0.2.0-py3-none-any.whl
| Download URL | easygsc-0.2.0-py3-none-any.whl |
|---|---|
| Size | 31.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d283d2c0d1427428e6a884e4d64ba237fb74502502957f80fc664fa50bd9041
|
|
BLAKE2b-256 checksum How to use checksums |
09ffe06851ffa759338e3c726b7a328946e8a2aa7594a623383d74b8a388c085
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for easygsc 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for easygsc-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.