Google Search Console MCP Server for Claude on Windows: OAuth Setup Fixes That Actually Worked

I followed Suganthan’s Google Search Console MCP Server setup guide to connect Google Search Console to Claude Desktop through MCP.

I used Option A: OAuth setup, which is the recommended setup in the guide.

The idea is simple: connect Claude Desktop to Google Search Console, then ask Claude questions about clicks, impressions, pages, queries, CTR, keyword drops, SEO performance, and ranking changes without manually exporting data.

The setup eventually worked, but on Windows there were a few easy ways to break it:

  • the Claude config needs to be inserted into the existing file correctly;
  • Windows paths need to be escaped properly in JSON;
  • Google OAuth can block you with 403 access_denied;
  • after approving access, you can land on 127.0.0.1:3847 with a 404;
  • restarting Claude Desktop can be the missing step.

This is the practical version of what fixed it.

Table of Contents

Important: I used Option A, the OAuth setup

The guide gives more than one setup option. I used Option A: OAuth setup.

That means the Claude config uses this:

"GSC_AUTH_MODE": "oauth"

It also needs a local OAuth secrets file:

"GSC_OAUTH_SECRETS_FILE": "C:\\Users\\yourname\\gsc-mcp\\gsc-oauth-secrets.json"

That file is the OAuth client JSON downloaded from Google Cloud Console.

Problem 1: The config can break Claude if you paste it wrong

Claude Desktop already has a config file. It may already contain other settings.

For example, it may look something like this:

{
  "coworkUserFilesPath": "C:\\Users\\yourname\\Claude",
  "preferences": {
    "coworkWebSearchEnabled": true
  }
}

You cannot just paste another full JSON object under it.

This is wrong:

{
  "coworkUserFilesPath": "C:\\Users\\yourname\\Claude",
  "preferences": {
    "coworkWebSearchEnabled": true
  }
}

{
  "mcpServers": {
    "gsc": {
      "command": "npx"
    }
  }
}

That breaks the file because JSON must have one top-level object.

You need to add the MCP server inside the existing JSON object.

Correct structure

The finished config should have "mcpServers" at the top level, next to the other Claude settings.

Like this:

{
  "mcpServers": {
    "gsc": {
      "command": "npx",
      "args": [
        "-y",
        "suganthan-gsc-mcp@latest"
      ],
      "env": {
        "GSC_AUTH_MODE": "oauth",
        "GSC_OAUTH_SECRETS_FILE": "C:\\Users\\yourname\\gsc-mcp\\gsc-oauth-secrets.json",
        "GSC_SITE_URL": "sc-domain:example.com",
        "GSC_SITE_URLS": "sc-domain:example.com,sc-domain:example.org,https://www.example.net/"
      }
    }
  },
  "coworkUserFilesPath": "C:\\Users\\yourname\\Claude",
  "preferences": {
    "launchPreviewPersistedWorkspaces": [],
    "launchPreviewSessionScopedSessions": [],
    "coworkScheduledTasksEnabled": true,
    "coworkHipaaRestricted": false,
    "ccdScheduledTasksEnabled": true,
    "bypassPermissionsGateByAccount": {
      "00000000-0000-0000-0000-000000000000": false
    },
    "coworkWebSearchEnabled": true,
    "coworkModelAutoFallbackByAccount": {
      "00000000-0000-0000-0000-000000000000": true
    },
    "remoteToolsDeviceName": "your-device-name",
    "epitaxyPrefs": {
      "starred-local-code-sessions": [],
      "starred-cowork-spaces": [],
      "starred-session-groups": [],
      "dframe-local-slice": {
        "pinnedOrder": [],
        "customGroupAssignments": {},
        "customGroupOrder": {}
      },
      "ccd-sessions-filter": {
        "state": {
          "selectedProjects": []
        },
        "version": 0
      },
      "desktop-frame.paneStore.v1": {
        "state": {
          "extraPanesByMode": {},
          "colWeightsByMode": {},
          "rowSplit": 0.5,
          "draftNonce": 0
        },
        "version": 4
      }
    },
    "chicagoEnabled": true
  }
}

The important part is this:

{
  "mcpServers": {
    "gsc": {
      "...": "..."
    }
  },
  "coworkUserFilesPath": "...",
  "preferences": {
    "...": "..."
  }
}

"mcpServers" is not pasted inside "preferences".

It is not added as a second JSON object at the bottom.

It is just another top-level property in the same JSON object.

If you already have mcpServers

If your Claude config already has an "mcpServers" section, do not create a second one.

Wrong:

{
  "mcpServers": {
    "someOtherTool": {}
  },
  "mcpServers": {
    "gsc": {}
  }
}

Correct:

{
  "mcpServers": {
    "someOtherTool": {},
    "gsc": {
      "command": "npx",
      "args": [
        "-y",
        "suganthan-gsc-mcp@latest"
      ],
      "env": {
        "GSC_AUTH_MODE": "oauth",
        "GSC_OAUTH_SECRETS_FILE": "C:\\Users\\yourname\\gsc-mcp\\gsc-oauth-secrets.json",
        "GSC_SITE_URL": "sc-domain:example.com",
        "GSC_SITE_URLS": "sc-domain:example.com,https://www.example.net/"
      }
    }
  }
}

Keep one "mcpServers" object and put all MCP servers inside it.

Windows path issue

This is wrong on Windows:

"GSC_OAUTH_SECRETS_FILE": "C:\Users\yourname\gsc-mcp\gsc-oauth-secrets.json"

It looks normal, but inside JSON it can break because backslashes are escape characters.

Use double backslashes:

"GSC_OAUTH_SECRETS_FILE": "C:\\Users\\yourname\\gsc-mcp\\gsc-oauth-secrets.json"

Or use forward slashes:

"GSC_OAUTH_SECRETS_FILE": "C:/Users/yourname/gsc-mcp/gsc-oauth-secrets.json"

Both are valid.

I used the double-backslash version.

GSC_SITE_URL and GSC_SITE_URLS

The default Search Console property goes here:

"GSC_SITE_URL": "sc-domain:example.com"

Multiple properties go here:

"GSC_SITE_URLS": "sc-domain:example.com,sc-domain:example.org,https://www.example.net/"

For a domain property, use this format:

sc-domain:example.com

For a URL-prefix property, use the exact URL-prefix property from Google Search Console:

https://www.example.net/

Do not guess the format. It needs to match the property as it exists in your Search Console account.

GSC_SITE_URLS does not let you query any of those sites on demand

This tripped me up. Adding multiple properties to GSC_SITE_URLS does not mean Claude can pull data for whichever site you ask about.

All GSC_SITE_URLS does is let the MCP server generate a combined dashboard across those sites. It does not make each site individually queryable.

If you actually want Claude to pull Search Console data for a specific site, GSC_SITE_URL has to be set to that site. Change it to whichever property you’re working with:

"GSC_SITE_URL": "sc-domain:example.com"

If you work across multiple sites, you need to update GSC_SITE_URL and restart Claude Desktop each time you switch which site you’re querying.

Problem 2: Google OAuth blocked the app with 403 access_denied

After setting up the OAuth config and trying to connect, Google blocked the login with this:

Error 403: access_denied

The screen said the app had not completed the Google verification process.

The request showed these Search Console scopes:

https://www.googleapis.com/auth/webmasters.readonly
https://www.googleapis.com/auth/webmasters

The problem was not that these scopes were invalid.

The problem was that the OAuth app was still in testing mode and my Google account was not added as a test user.

Fix 1: Add your Google account as a test user

In Google Cloud Console, open the project you created for the MCP setup.

Go to:

Google Auth Platform → Audience → Test users

Add the exact Google account you are using to sign in.

It needs to be the same account you select during the OAuth login.

After doing this, I got past the first Google block.

Fix 2: Add the Search Console scopes

Then go to:

Google Auth Platform → Data Access → Add or remove scopes

Add these scopes:

https://www.googleapis.com/auth/webmasters.readonly
https://www.googleapis.com/auth/webmasters

Save the changes.

Fix 3: Make sure the Search Console API is enabled

In Google Cloud Console, go to:

APIs & Services → Library

Search for:

Google Search Console API

Enable it.

In my case, it was already enabled, but it is worth checking anyway.

Problem 3: Google approved access, then redirected to 127.0.0.1:3847 with a 404

After adding the test user and scopes, the Google OAuth screen finally worked.

I could:

  1. choose my Google account;
  2. select the permissions;
  3. approve access.

Then Google redirected me to a local URL like this:

http://127.0.0.1:3847/?iss=https://accounts.google.com&code=...

But the page showed a 404.

This looked broken, but it was actually progress.

Google had approved the request. The issue was local.

The MCP server is supposed to catch that local callback on:

127.0.0.1:3847

In my case, Claude Desktop needed a full restart.

Fix 4: Fully restart Claude Desktop

After changing the Google OAuth settings and the Claude config, fully restart Claude Desktop.

Do not just close the visible window.

On Windows, you can also kill Claude from PowerShell:

Stop-Process -Name "Claude" -Force -ErrorAction SilentlyContinue

Then open Claude Desktop again and trigger the GSC MCP tool.

After restarting Claude, the same OAuth approval flow worked.

The setup order that worked

This is the order I would follow now:

  1. Create the Google Cloud project.
  2. Enable the Google Search Console API.
  3. Use Option A: OAuth setup from the guide.
  4. Create an OAuth client.
  5. Download the OAuth client JSON file.
  6. Save it somewhere simple, for example:
C:\Users\yourname\gsc-mcp\gsc-oauth-secrets.json
  1. Add the GSC MCP block into Claude’s config correctly.
  2. Make sure the Windows path uses double backslashes or forward slashes.
  3. Add your Google account as a test user.
  4. Add the Search Console OAuth scopes.
  5. Fully restart Claude Desktop.
  6. Ask Claude to use Google Search Console.
  7. Approve the Google permissions.

What the errors meant

403 access_denied

Google was blocking the OAuth app.

The fix was:

  • add the Google account as a test user;
  • add the Search Console scopes;
  • make sure the Search Console API is enabled.

127.0.0.1:3847 with a 404

Google had approved the OAuth request, but the local MCP callback was not being handled properly.

The fix was:

  • fully restart Claude Desktop;
  • retry the OAuth flow.

What actually fixed it

The setup finally worked after I did all of this:

  1. Used Option A: OAuth setup.
  2. Added my Google account as a test user.
  3. Added the Search Console OAuth scopes.
  4. Fixed the Windows path in the Claude config.
  5. Inserted the MCP config into the existing Claude config correctly.
  6. Restarted Claude Desktop fully.

The most annoying part was that OAuth looked broken even after Google approved access.

But once the config was valid, the OAuth account was added as a test user, the scopes were added, and Claude Desktop was restarted, the Google Search Console MCP server finally worked.