MCP YouTube Transcript
An MCP server retrieving transcripts of YouTube videos
Description from the maker (original English)
Google Ads MCP with MCC support: 35 tools for campaigns, keywords, reporting, GAQL.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
GOOGLE_ADS_CLIENT_ID, GOOGLE_ADS_CLIENT_SECRET, GOOGLE_ADS_REFRESH_TOKEN, GOOGLE_ADS_DEVELOPER_TOKENValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"google-ads": {
"command": "npx",
"args": [
"-y",
"mcp-google-ads"
],
"env": {
"GOOGLE_ADS_CLIENT_ID": "your-value",
"GOOGLE_ADS_CLIENT_SECRET": "your-value",
"GOOGLE_ADS_REFRESH_TOKEN": "your-value",
"GOOGLE_ADS_DEVELOPER_TOKEN": "your-value"
}
}
}
}Run this in your terminal
claude mcp add google-ads --env GOOGLE_ADS_CLIENT_ID=your-value --env GOOGLE_ADS_CLIENT_SECRET=your-value --env GOOGLE_ADS_REFRESH_TOKEN=your-value --env GOOGLE_ADS_DEVELOPER_TOKEN=your-value -- npx -y mcp-google-adsFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"google-ads": {
"command": "npx",
"args": [
"-y",
"mcp-google-ads"
],
"env": {
"GOOGLE_ADS_CLIENT_ID": "your-value",
"GOOGLE_ADS_CLIENT_SECRET": "your-value",
"GOOGLE_ADS_REFRESH_TOKEN": "your-value",
"GOOGLE_ADS_DEVELOPER_TOKEN": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"google-ads": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-google-ads"
],
"env": {
"GOOGLE_ADS_CLIENT_ID": "your-value",
"GOOGLE_ADS_CLIENT_SECRET": "your-value",
"GOOGLE_ADS_REFRESH_TOKEN": "your-value",
"GOOGLE_ADS_DEVELOPER_TOKEN": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account mharnett, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: GOOGLE_ADS_CLIENT_ID, GOOGLE_ADS_CLIENT_SECRET, GOOGLE_ADS_REFRESH_TOKEN, GOOGLE_ADS_DEVELOPER_TOKEN
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (1.0.1) reached the registry 7 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: MCP YouTube Transcript, Google Analytics MCP, BibiGPT YouTube Video Summarizer
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
An MCP server retrieving transcripts of YouTube videos
GA4 MCP server for AI agents: schema discovery, server-side aggregation, analysis-ready defaults.
AI video summarizer: summarize and transcribe YouTube, Bilibili, TikTok and podcast videos.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
An MCP (Model Context Protocol) server for the Google Ads API with built-in safeguards for review before changes go live. Production-proven with MCC (Manager Account) support, 36 tools for campaign management, reporting, and optimization. v1.2.0 adds Demand Gen campaign creation end-to-end.
You need:
Bring your own OAuth client (the client_id / client_secret from the step above) and run the bundled helper. It runs Google's installed-app loopback flow with PKCE (S256) and prints your refresh token. It reads nothing from your home directory and needs no shared OAuth keyfile.
export GOOGLE_ADS_CLIENT_ID="YOUR_CLIENT_ID.apps.googleusercontent.com"
export GOOGLE_ADS_CLIENT_SECRET="YOUR_CLIENT_SECRET" node get-refresh-token.cjs
Your browser opens for Google sign-in; approve as the Google account that owns the Ads data. On success the helper prints one line to stdout:
GOOGLE_ADS_REFRESH_TOKEN=1//0a...
Set that value in your environment (or config.json, below). The OAuth scope requested is read from config.json (oauth.scope), falling back to config.example.json, so the helper and the running server always request the same scope. This MCP requests only the minimum scope it needs: https://www.googleapis.com/auth/adwords.
Do not run this with stdout redirected to a shared log file — the refresh
token is printed to stdout by design.
Note: GOOGLE_ADS_DEVELOPER_TOKEN is a separate Google Ads API credential, not an OAuth scope — set it independently (see Environment Variables below).
npm install mcp-google-ads
Or clone and build from source:
git clone https://github.com/mharnett/mcp-google-ads.git
cd mcp-google-ads npm install npm run build
Security: Never share your .mcp.json file or commit it to git -- it may contain API credentials. Add .mcp.json to your .gitignore.
cp config.example.json config.json
Edit config.json with your credentials:
{
"oauth": { "scope": "https://www.googleapis.com/auth/adwords" }, "google_ads": { "developer_token": "YOUR_DEVELOPER_TOKEN", "client_id": "YOUR_CLIENT_ID.apps.googleusercontent.com", "client_secret": "YOUR_CLIENT_SECRET", "refresh_token": "YOUR_REFRESH_TOKEN", "mcc_customer_id": "123-456-7890" }, "clients": { "my-client": { "customer_id": "111-222-3333", "name": "My Client", "folder": "/path/to/client/workspace" }, "another-client": { "customer_id": "444-555-6666", "name": "Another Client", "folder": "/path/to/another/workspace" } }, "defaults": { "create_paused": true, "label_prefix": "claude-", "require_approval_for_enable": true } }
Alternatively, set credentials via environment variables (these override config.json):
| Variable | Required | Description |
|---|---|---|
GOOGLE_ADS_DEVELOPER_TOKEN | Yes | Google Ads API developer token |
GOOGLE_ADS_CLIENT_ID | Yes | OAuth 2.0 client ID |
GOOGLE_ADS_CLIENT_SECRET | Yes | OAuth 2.0 client secret |
GOOGLE_ADS_REFRESH_TOKEN | Yes | OAuth 2.0 refresh token |
GOOGLE_ADS_MCP_WRITE | No | Set to true to expose mutating tools (create/update/pause/enable/remove/apply). Default: read-only. |
GOOGLE_ADS_MCP_OVERRIDE_LOG | No | JSONL file that records every confirm_large_change override (timestamp, tool, entity, old -> new, reason). Default: overrides.jsonl in the per-user config directory. |
GOOGLE_ADS_MCP_OVERRIDE_WEBHOOK_URL | No | Slack-compatible incoming webhook; each override also posts one line here. A missing or failing webhook never fails the write. |
GOOGLE_ADS_MCP_OVERRIDE_SLACK_TOKEN / GOOGLE_ADS_MCP_OVERRIDE_SLACK_CHANNEL | No | Slack bot token + channel id; when both are set each override posts via chat.postMessage and the webhook is skipped. run-mcp.sh sets these to the drak bot and #drak-ops. |
GOOGLE_ADS_MCP_ALWAYS_LOAD | No | Comma-separated tool names to mark as always-loaded, e.g. google_ads_get_client_context,google_ads_gaql_query. Default: unset (no tool is marked). |
Clients that defer tool schemas behind a tool-search step only load a tool once it is searched for. Naming tools in GOOGLE_ADS_MCP_ALWAYS_LOAD stamps them with _meta: {"anthropic/alwaysLoad": true} in tools/list, so those tools are offered directly. Names that match no tool are ignored, and the marker never exposes a tool that read-only mode hides.
The server ships read-only. Mutating tools (anything that creates, updates, pauses, enables, removes, links, or applies) are hidden from the tool list until you set GOOGLE_ADS_MCP_WRITE=true in the MCP server environment. If a write tool is somehow invoked without that flag, the server returns a clear error pointing at the env var.
This is deliberate: a casual chat message like "activate the Fundraising campaign" should not move live ad spend without an explicit opt-in.
Add to your Claude Code MCP settings (~/.claude/settings.json or project settings):
{
"mcpServers": { "google-ads": { "command": "node", "args": ["node_modules/mcp-google-ads/dist/index.js"] } } }
Or if installed from source:
{
"mcpServers": { "google-ads": { "command": "node", "args": ["/path/to/mcp-google-ads/dist/index.js"] } } }
Restart Claude Code.
Claude Desktop: Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).
1. cd into client folder → auto-detects account context
| Tool | Description |
|---|---|
google_ads_get_client_context | Detect which account from working directory |
google_ads_list_campaigns | List all campaigns with status and metrics |
google_ads_list_ad_groups | List ad groups in a campaign |
google_ads_list_pending_changes | Show paused items with claude- label |
google_ads_list_conversion_actions | List conversion actions |
| Tool | Description |
|---|---|
google_ads_create_campaign | Create campaign (PAUSED). Supports SEARCH + DEMAND_GEN channels, richer bidding (MANUAL_CPC / MAXIMIZE_CLICKS / MAXIMIZE_CONVERSIONS / TARGET_CPA), geo + language targeting, start/end dates |
google_ads_create_ad_group | Create ad group (PAUSED). type accepts SEARCH_STANDARD (default) or DEMAND_GEN_MULTI_ASSET_AD_GROUP |
google_ads_create_responsive_search_ad | Create RSA with validation (PAUSED) |
google_ads_create_image_asset | Upload PNG/JPG/GIF image asset (validates ≤5MB, ≥600×314) for use in Demand Gen ads |
google_ads_create_demand_gen_multi_asset_ad | Create a Demand Gen multi-asset ad (PAUSED) — validates char/count caps before API call, fails fast if ad_group isn't DG |
google_ads_create_keywords | Create keywords (PAUSED) |
google_ads_validate_ad | Validate RSA without creating |
google_ads_enable_items | Enable items (make LIVE) — requires approval |
google_ads_pause_items | Pause active items |
google_ads_pause_keywords | Pause specific keywords |
google_ads_update_campaign_budget | Update campaign daily budget |
| Tool | Description |
|---|---|
google_ads_get_campaign_tracking | Get tracking templates and URL parameters |
google_ads_update_campaign_tracking | Update tracking templates |
| Tool | Description |
|---|---|
google_ads_create_shared_set | Create shared negative keyword list |
google_ads_link_shared_set | Link shared set to campaign |
google_ads_unlink_shared_set | Unlink shared set from campaign |
google_ads_add_shared_negatives | Add keywords to shared negative list |
google_ads_remove_shared_negatives | Remove keywords from shared list |
google_ads_add_campaign_negatives | Add campaign-level negatives |
google_ads_remove_campaign_negatives | Remove campaign-level negatives |
google_ads_remove_adgroup_negatives | Remove ad group-level negatives |
| Tool | Description |
|---|---|
google_ads_keyword_performance | Keyword metrics with quality score |
google_ads_keyword_performance_by_conversion | Keyword metrics by conversion action |
google_ads_ad_performance | Ad-level performance metrics |
google_ads_ad_performance_by_conversion | Ad metrics by conversion action |
google_ads_search_term_report | Search term query report |
google_ads_search_term_report_by_conversion | Search terms by conversion action |
google_ads_search_term_insights | Search term category insights |
google_ads_search_term_insight_terms | Terms within insight categories |
google_ads_keyword_volume | Keyword planner volume estimates |
| Tool | Description |
|---|---|
google_ads_gaql_query | Run raw GAQL queries |
# Check which account you're working with
"What Google Ads account am I connected to?"
"Show me all campaigns in this account"
"Create a Search campaign for brand terms with $50/day budget"
"What changes are pending my review?"
"Enable the approved ads in the Brand campaign"
"Show me keyword performance for the last 30 days, sorted by cost"
"Run a GAQL query to get all ad groups with CTR below 2%"
# 1. Campaign: $75/day, DEMAND_GEN channel, MAXIMIZE_CONVERSIONS default,
google_ads_create_campaign({ name: "DG - Spring Promo", daily_budget: 75, channel_type: "DEMAND_GEN", geo_target_ids: ["21134", "21141"], start_date: "2026-05-01", end_date: "2026-06-30" })
google_ads_create_ad_group({ campaign_id: "555123", name: "DG AG 1", type: "DEMAND_GEN_MULTI_ASSET_AD_GROUP" })
google_ads_create_image_asset({ name: "hero-landscape", file_path: "/abs/path/hero.png" })
google_ads_create_image_asset({ name: "hero-square", file_path: "/abs/path/sq
Only the beginning is shown; read the rest in the repo