Flin Google Ads Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Flin Google Ads 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.
Read-only MCP server for Google Ads, built for simple public use via uvx.
health_checklist_accessible_customersget_customer_clientsfind_customer_clientsget_campaignsget_ad_groupsget_adsget_insightsget_conversion_insightsget_keywordsget_search_termsget_change_eventsauth_statusget_auth_urlsave_refresh_token_from_codeclear_auth_tokenget_ads includes RSA content fields (headlines/descriptions/paths/final URLs) when available.
get_insights supports:
campaignad_groupadcustomer (account-level metrics)account (alias of customer)get_search_terms is backed by search_term_view, so it returns actual user search terms rather than configured keywords. Pass segment_by_date=true when you need daily search-term rows with a date field instead of one aggregate row per search term for the requested range.
Search-term conversion filters:
conversion_action_idconversion_action_nameSearch-term optional segmentation:
segment_by_dateget_change_events is backed by the Google Ads change_event resource. It returns recent account changes with user, client type, changed resource, operation, changed field paths, and old/new values where the API returns them. Google Ads requires a finite change_event.change_date_time window within the past 30 days and a LIMIT; pass start_date and end_date as YYYY-MM-DD.
Example:
{
"tool": "get_change_events",
"args": {
"customer_id": "2054139041",
"login_customer_id": "6050181535",
"start_date": "2026-06-01",
"end_date": "2026-06-15",
"resource_type": "CAMPAIGN",
"limit": 50
}
}Use get_conversion_insights when you need conversion-only reporting by day or conversion action, for example "which campaigns had lead conversions each day last week."
It supports the same levels as get_insights:
campaignad_groupadcustomer (account-level metrics)account (alias of customer)Optional segmentation:
segment_by_datesegment_by_conversion_actionOptional conversion-action filters:
conversion_action_idconversion_action_nameRules:
conversion_action_id must be a Google Ads resource name such as customers/1234567890/conversionActions/555conversion_action_name matches segments.conversion_action_nameget_conversion_insights returns only metrics.conversions and metrics.conversions_valueUse get_insights for general performance metrics such as impressions, clicks, CTR, CPC, and cost. Use get_conversion_insights for conversion-action or daily conversion breakdowns.
GOOGLE_ADS_DEVELOPER_TOKENGOOGLE_ADS_CLIENT_IDGOOGLE_ADS_CLIENT_SECRETOptional:
GOOGLE_ADS_REFRESH_TOKEN (backwards-compatible override; normally generated with MCP auth tools)GOOGLE_ADS_AUTH_FILE (defaults to ~/.config/flin-google-ads-mcp/auth.json)GOOGLE_ADS_OAUTH_REDIRECT_URI (defaults to http://127.0.0.1:8080/)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)For MCC flows, you can also pass login_customer_id directly per tool call.
The MCP client config no longer needs GOOGLE_ADS_REFRESH_TOKEN.
GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CLIENT_ID, and GOOGLE_ADS_CLIENT_SECRET.auth_status.missing_refresh_token, run get_auth_url.code value or the full redirected URL.save_refresh_token_from_code with that value.health_check.The stored refresh token is written to ~/.config/flin-google-ads-mcp/auth.json by default and is never returned by MCP tools.
{
"tool": "find_customer_clients",
"args": {
"manager_customer_id": "6050181535",
"login_customer_id": "6050181535",
"name_query": "Avesco",
"direct_only": false,
"include_hidden": false,
"include_self": false,
"status": "ALL",
"limit": 50
}
}client_customer_id with account-level insights:{
"tool": "get_insights",
"args": {
"customer_id": "2054139041",
"login_customer_id": "6050181535",
"level": "account",
"date_range": "YESTERDAY",
"limit": 10
}
}get_insights, get_conversion_insights, get_keywords, and get_search_terms support:
TODAYYESTERDAYTHIS_WEEK_MON_TODAYTHIS_WEEK_SUN_TODAYLAST_WEEK_MON_SUNLAST_WEEK_SUN_SATLAST_7_DAYSLAST_14_DAYSLAST_30_DAYSLAST_60_DAYSLAST_90_DAYSTHIS_MONTHLAST_MONTHCUSTOM (requires start_date and end_date in YYYY-MM-DD)uv sync --extra dev
cp .env.example .env
# Fill .env values
uv run flin-google-ads-mcpuvx flin-google-ads-mcp@latest{
"mcpServers": {
"flin-google-ads-mcp": {
"command": "uvx",
"args": ["flin-google-ads-mcp@latest"],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "xxx",
"GOOGLE_ADS_CLIENT_ID": "xxx",
"GOOGLE_ADS_CLIENT_SECRET": "xxx",
"GOOGLE_ADS_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "1234567890"
}
}
}
}{
"mcpServers": {
"flin-google-ads-mcp-local": {
"command": "uv",
"args": [
"run",
"--directory",
"/Users/nicolasg/Antigravity/flin-google-ads-mcp",
"flin-google-ads-mcp"
],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "xxx",
"GOOGLE_ADS_CLIENT_ID": "xxx",
"GOOGLE_ADS_CLIENT_SECRET": "xxx",
"GOOGLE_ADS_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "0987654321"
}
}
}
}Detailed guide: docs/testing.md
Operational usage guide:
Fast path:
uv sync --extra dev
python3 -m pytest
python3 -m compileall srcThen run live smoke tests with MCP Inspector (see the testing guide).
This repository publishes automatically with GitHub Actions:
.github/workflows/ci.yml.github/workflows/release.yml (triggered by git tags v*)In PyPI project settings for flin-google-ads-mcp, add a Trusted Publisher with:
flin-agencyflin-google-ads-mcprelease.ymlpypi# bump version in pyproject.toml first, then:
git add -A
git commit -m "release: v0.1.0"
git tag v0.1.0
git push origin main --tagsThe Release workflow builds, tests, and publishes to PyPI using OIDC (no PyPI API token in GitHub secrets).
GitHub Actions validates:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.