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-serverIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Data & AnalyticsSupported Platforms
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.
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.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| google-discover-api-mcp-server (this skill)by cotletdev | 83 | 3 | 1d ago | MCP Server |
| Agent-Reachby Panniantong | 100 | 105.5k | 3d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 78.1k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.7k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 90.2k | today | MCP 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.
Skill content
View source on GitHubGoogle 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 inexamples/.
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.
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
- Requirements
- Install
- Set up: Chrome's API key
- Countries and proxies
- MCP server
- REST API
- Python and the example scripts
- All 3 tools
- Configuration
- Security
- Errors
- Self-hosted or hosted
- FAQ
- License
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
- Chrome for Android asks
discover-pa.googleapis.comfor 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). - 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.
- 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
-
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.
setuponly 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, thenadb pull) works too. -
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: DEIt 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. -
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.jsonthe 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
Agent-Reach
105.5kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
78.1kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.7kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
90.2k🕷️ The BEST Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
