SkillAgentSearch skills...

google-discover-api-mcp-server

Self-hosted Google Discover API and MCP server in Python: all 3 tools (read the Discover feed, check a domain in it, collect up to 300 cards) with no Google account. Noncommercial use (PolyForm Noncommercial 1.0.0).

Install / Use

claude mcp add cotletdev -- npx -y github:cotletdev/google-discover-api-mcp-server

If the server publishes to npm under a different name, use that package instead — check the repo README.

About this skill
🔌

MCP Server

Model Context Protocol server

Quality Score

83/100

Supported Platforms

Claude Code
Claude Desktop

Our assessment of google-discover-api-mcp-server

google-discover-api-mcp-server scores 83/100 on our quality scale, 478th of 600 Data & Analytics skills we index.

Its MCP Server is 21 KB long, well organised into 23 sections with 15 code examples: a thorough specification that gives an agent plenty to work with.

It has 3 GitHub stars, so there is little community track record yet; judge it on its content.

Substance
30/30
Structure
20/20
Description
15/15
Adoption
3/20
Freshness
15/15

Maintenance, license and trust

  • The repository was last updated yesterday, so google-discover-api-mcp-server is actively maintained.
  • No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
  • Its trust signals score 80/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

google-discover-api-mcp-server compared with similar skills

All 4 of these similar skills score higher than google-discover-api-mcp-server; compare them before choosing.

SkillScoreStarsUpdatedFormat
google-discover-api-mcp-server (this skill)by cotletdev8331d agoMCP Server
Agent-Reachby Panniantong100105.5k3d agoCLAUDE.md
headroomby headroomlabs-ai10078.1ktodayCLAUDE.md
CowAgentby zhayujie10047.7ktodayCLAUDE.md
Scraplingby D4Vinci10090.2ktodayMCP Server

Frequently asked questions

How do I install google-discover-api-mcp-server?
Run claude mcp add cotletdev -- npx -y github:cotletdev/google-discover-api-mcp-server. The install tabs above show the steps for each supported agent.
Which AI agents does google-discover-api-mcp-server work with?
It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
Is google-discover-api-mcp-server safe to use?
It declares no license and scores 80/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is google-discover-api-mcp-server still maintained?
The repository was last updated yesterday, so google-discover-api-mcp-server is actively maintained.

Google Discover API and MCP server, self-hosted

A Google Discover API and a Google Discover MCP server you run on your own computer, in Python. It reads the Discover feed that Chrome for Android shows on its New Tab page to someone not signed in to Google, and gives you every card as JSON: position, title, publisher, URL, domain, article or video, age and image. The same 3 tools we run in production at Cotlet.

Google has no API for the Discover feed. The Discover report in Search Console counts clicks on your own site; it does not say which cards a country sees or in what order. This repo gives you:

  • MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup
  • REST API on http://127.0.0.1:8787/api/v1/google-discover, with OpenAPI docs at /docs. Setup
  • Python: call("check_domain_in_feed", domain="example-news.com"), plus 7 ready scripts in examples/.

No Google account and no browser. It is for technical people who want to run it themselves, for noncommercial use only (license). If you want the feed of any country without a proxy of your own, on a schedule in the cloud, for a team or a business, use the hosted version at cotlet.dev.

Google Discover MCP server Python 3.11+ License: PolyForm Noncommercial 1.0.0

pip install google-discover-api-mcp
apkeep -a com.android.chrome -d apk-pure -o 'acknowledge_dangers=true,arch=arm64-v8a' .   # or any Chrome APK
google-discover-mcp setup --apk "com.android.chrome@arm64-v8a.xapk"
google-discover-mcp call get_discover_feed limit=10
claude mcp add google-discover -- google-discover-mcp mcp

Contents

How it works

AI agent (MCP) / script (REST, Python) ──▶ google-discover-mcp on your computer ──protobuf──▶ discover-pa.googleapis.com
                                                     ▲
             google-discover-mcp setup --apk ────────┘ reads Chrome's API key from a Chrome for Android APK, once
  1. Chrome for Android asks discover-pa.googleapis.com for its New Tab feed with one gzipped protobuf request. Signed out, it adds Chrome's own API key. The code that builds this request is open source in Chromium (components/feed).
  2. This server sends the same request, as Chrome 155 on an Android phone, and reads the cards out of the answer. One read holds about 31 cards. No headless browser runs.
  3. Google picks the feed's region from the IP the request comes from, and its language from the request. From your own connection you get the feed of your country. A proxy gets you other countries.

The API key is not in this repo. It belongs to Chrome, and Google could switch it off once it sits on GitHub. setup reads it from a Chrome for Android APK you download, tests it against the feed and saves it on your computer.

Requirements

  • Python 3.11 or newer.
  • A Chrome for Android APK or XAPK (com.android.chrome), downloaded once. How.
  • macOS, Linux or Windows.
  • For countries other than yours: a proxy with exits in those countries. Details.

Install

From PyPI:

uv tool install google-discover-api-mcp       # or: pipx install google-discover-api-mcp, or: pip install google-discover-api-mcp
google-discover-mcp --version

MCP clients can also run it with no install: uvx google-discover-api-mcp mcp.

From source:

git clone https://github.com/cotletdev/google-discover-api-mcp-server.git
cd google-discover-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate              # Windows: .venv\Scripts\activate
pip install -e .
google-discover-mcp --version

With uv: uv venv && uv pip install -e ., then uv run google-discover-mcp ....

Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step.

To update: uv tool upgrade google-discover-api-mcp (or pip install -U google-discover-api-mcp), from source git pull && pip install -e .. We copy every change of the hosted tools into this repo.

Set up: Chrome's API key

  1. Download Chrome for Android. With apkeep from APKPure:

    apkeep -a com.android.chrome -d apk-pure -o 'acknowledge_dangers=true,arch=arm64-v8a' .
    

    APKPure is a mirror of Google Play, not Google. setup only reads strings out of the file and runs nothing from it. An APK you pulled from your own Android phone (adb shell pm path com.android.chrome, then adb pull) works too.

  2. Run:

    google-discover-mcp setup --apk "com.android.chrome@arm64-v8a.xapk"
    
    Found 4 API keys in com.android.chrome@arm64-v8a.xapk, Chrome 155.0.8059.84
    Testing each key with one read of the DE feed ...
    Saved 2 working keys of Chrome 155.0.8059.84 to /Users/you/.config/google-discover-api-mcp/settings.json
    Feed country: DE
    

    It finds the AIzaSy... keys in Chrome's native libraries and the Chrome version in the manifest, tries each key with one read of the feed and keeps those Google takes. It also asks Cloudflare's trace page (cloudflare.com/cdn-cgi/trace) once which country your IP is in.

  3. Check at any time:

    google-discover-mcp status
    

Already have a key? google-discover-mcp setup --key --chrome-version 155.0.8059.84 asks for it with hidden input. When Google stops taking the keys (every call ends in target_error with HTTP 403), download the newest APK and run setup again.

Countries and proxies

Without a proxy every read comes from your IP, so the feed is the one of your country. country may be left out; another country gives invalid_input.

For other countries, set a proxy whose URL holds {country} (US) or {country_lower} (us). Most residential proxy providers put the country in the user name:

export GOOGLE_DISCOVER_PROXY='http://user-{country}-1:password@proxy.example.com:80'
google-discover-mcp call get_discover_feed country=GB

Or save it: google-discover-mcp setup --apk <file> --proxy '<url>'. A proxy without a placeholder sends everything through one exit; set GOOGLE_DISCOVER_COUNTRY to its country.

Any IP gets a feed, but a home IP gives the local news a person there sees. The feed of one country changes with the city of the IP.

MCP server

The MCP server lists the 3 tools with their input schemas and descriptions written for agents. All are read-only.

Claude Code

claude mcp add google-discover -- google-discover-mcp mcp
# without installing first:
claude mcp add google-discover -- uvx google-discover-api-mcp mcp

Run setup once before the first call.

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "google-discover": {
      "command": "uvx",
      "args": ["google-discover-api-mcp", "mcp"]
    }
  }
}

Cursor

~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.

Codex

~/.codex/config.toml:

[mcp_servers.google-discover]
command = "uvx"
args = ["google-discover-api-mcp", "mcp"]

Over HTTP

google-discover-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:

google-discover-mcp serve
claude mcp add --transport http google-discover http://127.0.0.1:8787/mcp

Then ask your agent things like:

Is example-news.com in the Discover feed right now? Give the position, title and age of each card.

Which publishers have the most cards in Discover today?

List the video cards in the feed with their positions.

Collect 200 Discover cards and tell me which topics most of them are about.

REST API

google-discover-mcp serve          # http://127.0.0.1:8787, MCP at /mcp, docs at /docs

Each tool has its own route under /api/v1/google-discover, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments.

curl 'http://127.0.0.1:8787/api/v1/google-discover/feed?limit=10'
curl 'http://127.0.0.1:8787/api/v1/google-discover/feed/domains/example-news.com'
curl 'http://127.0.0.1:8787/api/v1/google-discover/feed/cards?cards=150'

Any tool by name, body as its arguments:

curl -X POST http://127.0.0.1:8787/api/v1/google-discover/tools/check_domain_in_feed -d '{"domain": "example-news.com"}'
  • GET /api/v1/google-discover/tools: every tool with its route, input schema and an example answer.
  • GET /docs: interactive OpenAPI docs, GET /openapi.json the schema, for n8n, Postman or a generated client.

The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:

GOOGLE_DISCOVER_MCP_TOKEN=$(openssl rand -hex 24) google-discover-mcp serve --host 0.0.0.0

Python and the example scripts

Straight from Python, no server needed:

from google_discover_api_mcp import call
from google_discover_api_mcp.scripting import write_rows

feed = call("get_discover_feed")
write_rows(feed["cards"], "discover.csv")
print(call("check_domain_in_feed", domain="example-news.com")["in_feed"])

Or one tool from the shell: google-discover-mcp call check_domain_in_feed domain=example-news.com, or with a JSON object.

Ready scripts in examples/. Each prints JSON, takes --out file.csv or --out file.json where it makes sense, and --help:

| Script | What it does | |---|---| | read_feed.py | The feed, every card with position, title, publisher, URL, type and age. --limit. | | top_publishers.py | Publishers with the most cards in the feed. | | check_domain.py | Whether a site is in the feed now, and where. | | watch_domain.py | A site's cards that entered or dropped out of the feed since the last run. For cron. | | compare_domains.py | Cards, positions and titles of your site and its com

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars3
CategoryData
Updated1d ago
Forks0

Languages

Python

Trust signals

80/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

1 medium1 low