Flin Google Keyword Planner Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Flin Google Keyword Planner Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP server for Google Ads Keyword Planner ideas.
This server exposes focused read-only tools so an LLM can clearly choose the right seed strategy.
keyword_ideas_from_keywordskeyword_ideas_from_urlkeyword_ideas_from_keyword_and_urlkeyword_ideas_from_sitekeyword_ideas_historicalkeyword_historical_metricskeyword_ideas_from_keywordsGenerate ideas from a keyword list (KeywordSeed).
Required:
keywordskeyword_ideas_from_urlGenerate ideas from a page URL (UrlSeed).
Required:
urlkeyword_ideas_from_keyword_and_urlGenerate ideas from keyword list + URL (KeywordAndUrlSeed).
Required:
keywordsurlkeyword_ideas_from_siteGenerate ideas from a full site/domain (SiteSeed).
Required:
site_urlkeyword_ideas_historicalGenerate ideas from keywords and constrain historical metrics to a year-month range.
Required:
keywordsstart_yearstart_monthend_yearend_monthHistorical option:
include_average_cpc (default false)customer_idlanguage_id (default 1000)location_ids (default 2840 = US; [] = all locations; max 10 unique IDs)network (GOOGLE_SEARCH or GOOGLE_SEARCH_AND_PARTNERS; default includes partners)include_adult_keywords (default false)limit (page size: default 50, max 1000; Google may return fewer rows)include_average_cpc (default false; also available on all four seed tools)page_tokenkeyword_annotation (currently: KEYWORD_CONCEPT)aggregate_metric_types (currently: DEVICE)login_customer_idkeyword_historical_metricsFetch historical search volumes and bids for an existing list of up to 10,000 keywords using Google's GenerateKeywordHistoricalMetrics endpoint. It does not expand the list into new ideas. keyword_ideas_historical keeps its original behavior: discovering ideas with a historical date range.
Required: keywords. Optional: customer, language, locations, network, adult keywords, manager ID, and include_average_cpc. Omit dates for Google's default past 12 months, or supply all four year/month fields. Google controls historical data availability and may omit unavailable months.
Results include close variants and unmatched_keywords. Google can combine similar keywords, so the result count need not match the input count; an unmatched term is not evidence of zero search volume. Pagination and idea annotations do not apply.
German Switzerland, explicitly pass language_id="1001", location_ids=["2756"]. Use network="GOOGLE_SEARCH" for Google Search alone.
account's currency; do not assume USD or CHF from the target location.
null; genuine reported zeroes remain 0.next_page_token and identicalrequest parameters. A short or empty page does not imply the end if a token exists.
transport errors. The last in-flight RPC may extend beyond that window. Quota and authentication errors are not automatically retried.
GOOGLE_ADS_DEVELOPER_TOKENGOOGLE_ADS_CLIENT_IDGOOGLE_ADS_CLIENT_SECRETOptional:
GOOGLE_ADS_REFRESH_TOKEN (only needed if you want a persistent token instead of generating one in Claude)GOOGLE_ADS_LOGIN_CUSTOMER_IDGOOGLE_ADS_CUSTOMER_ID (default customer if no customer_id argument is passed)GOOGLE_ADS_USE_PROTO_PLUS (true by default)uv sync --locked --extra dev
cp .env.example .env
# Fill .env with real credentials
uv run --env-file .env flin-google-keyword-planner-mcpuvx){
"mcpServers": {
"flin-google-keyword-planner-mcp": {
"command": "uvx",
"args": ["flin-google-keyword-planner-mcp@latest"],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "REPLACE_ME",
"GOOGLE_ADS_CLIENT_ID": "REPLACE_ME",
"GOOGLE_ADS_CLIENT_SECRET": "REPLACE_ME",
"GOOGLE_ADS_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_USE_PROTO_PLUS": "true"
}
}
}
}{
"mcpServers": {
"flin-google-keyword-planner-mcp-local": {
"command": "uv",
"args": [
"run",
"--directory",
"/ABSOLUTE/PATH/TO/flin-google-keyword-planner-mcp",
"flin-google-keyword-planner-mcp"
],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "REPLACE_ME",
"GOOGLE_ADS_CLIENT_ID": "REPLACE_ME",
"GOOGLE_ADS_CLIENT_SECRET": "REPLACE_ME",
"GOOGLE_ADS_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_USE_PROTO_PLUS": "true"
}
}
}
}Restart Claude Desktop after config changes.
After Claude has loaded the MCP, ask it to run:
google_ads_start_local_oauth_flowauthorization_url in your browser and approve Google Ads access.google_ads_oauth_status.token_available is true.The default redirect URI is http://localhost:8080/. If your Google OAuth client uses a different loopback redirect URI, pass it to google_ads_start_local_oauth_flow.
If you cannot use the local callback flow, use the manual fallback:
google_ads_authorization_url.code query parameter.google_ads_exchange_authorization_code with that value.The exchanged refresh token is stored outside Claude config in ~/.config/flin-google-keyword-planner-mcp/oauth-token.json and reused after MCP restarts. Override the storage path with FLIN_GOOGLE_ADS_TOKEN_FILE if needed.
.env and .env.* are gitignored; only .env.example is tracked.gitleaks (no GITLEAKS_LICENSE secret required).uv sync --locked --extra dev
uv run --locked python -m pytest
uv run --locked python -m compileall src
uv build.github/workflows/ci.yml.github/workflows/release.ymlv*) triggers:twine checkIn the PyPI project flin-google-keyword-planner-mcp, add a Trusted Publisher:
flin-agencyflin-google-keyword-planner-mcprelease.ymlpypi# 1) bump version in pyproject.toml + src/flin_google_ads_mcp/__init__.py
# 2) run checks
uv run --locked python -m pytest
uv run --locked python -m compileall src
uv build
# 3) release
git add -A
git commit -m "release: vX.Y.Z"
git tag vX.Y.Z
git push origin main --tagsValidated with Google Ads Python SDK 35.0.0 (API v26) and MCP SDK 1.30.0. The MCP SDK remains on the compatible 1.x line; this is not a migration to MCP 2.x. uv.lock is now tracked so local installs and CI use the same dependency versions.
OAuth exchange returns success and persistence status, never the refresh token. Local OAuth uses PKCE, state validation, a ten-minute expiry, and releases its callback port after completion. Token files are written atomically with private permissions. The manual code-copy fallback remains available.
Clients upgrading from 0.2.x must accept nullable metrics, the additional response metadata, and the removal of refresh_token from the OAuth exchange response. Existing five idea tool names and targeting defaults are retained.
Reference: Google historical metrics, Google keyword ideas, API releases.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.