Connect Google Ads to Cursor and run your campaigns from the editor

Opus Growth is a hosted MCP connector. Paste one mcpServers block into ~/.cursor/mcp.json, sign in with Google, and Cursor's agent gains 69 Google Ads tools right next to your code — reports, campaign builds, budgets, keywords and creatives. Reads answer immediately; anything that changes the account comes back as a preview you approve. The identical JSON works in VS Code and Windsurf, and the same connector drops into Codex and Gemini CLI.

Google Ads, Microsoft Advertising, TikTok Ads and LinkedIn Ads are live in Cursor today. The 27 Meta Ads tools are built but not switched on while platform review is in progress; they appear in your plan at no extra cost once approval lands. The 7 Business Profile tools are similarly waiting on Google quota approval.

https://mcp.opus-growth.com
See pricing

What you can do

One JSON block, and three editors read the same schema

~/.cursor/mcp.json takes a single mcpServers entry pointing at https://mcp.opus-growth.com. VS Code reads the identical JSON from .vscode/mcp.json and Windsurf from ~/.codeium/windsurf/mcp_config.json — same keys, same value, nothing to rewrite when you switch editors. Codex takes the TOML equivalent in ~/.codex/config.toml, and Gemini CLI adds it with one command. No npm package, no local process to keep alive, and no credential in the file: it holds a URL and nothing else.

The page and the ad get written in the same session

The agent already has your pricing page, feature components and landing copy open. Ask for responsive search ad headlines and they come from the copy that actually ships — real plan names, real prices, real feature wording — instead of a summary you pasted into a chat window an hour ago. It works in reverse too: have it compare the headlines on your live ads with the hero copy of the page they point to, and rewrite whichever one drifted.

Ship the route and the campaign together

The commit that adds /pricing/enterprise is also the right moment to build the Search campaign pointing at it. Create the campaign, the ad group and the ads, and attach sitelinks aimed at routes you wrote four minutes ago rather than routes you half-remember. No tab switch, no copying URLs by hand, and the whole thing waits as a staged preview until you approve it.

Guardrails sized for an agent that keeps going on its own

Cursor's agent chains tool calls, and plenty of people leave auto-run enabled, which is exactly why the write path is gated on the server side. Every account-changing action comes back first as a dry run — account, entity, current value, proposed value — and is applied only after an explicit confirmation. A single budget increase of more than 50% is refused outright. Everything applied is written to an audit log you can read back later. That is the entire safety model; the rest of this page assumes it.

Tag Manager and GA4 wiring without a browser detour

18 Google Tag Manager tools plus 10 GA4, 6 Search Console and 5 YouTube tools mean the developer wiring a conversion can create the tag and the trigger, publish the container version, and then confirm the event is arriving — in the same window as the button component that fires it.

The answer lands in your repo, not just the chat pane

Because Cursor writes files, reporting does not have to stop at a message. Ask for last week's spend, conversions and CPA across Google Ads, Microsoft Advertising, TikTok and LinkedIn, have it written into docs/marketing/weekly.md, and commit the report next to the code it is reporting on. Next week's run then diffs against a file instead of a screenshot.

Set it up in 60 seconds

  1. 1

    Create ~/.cursor/mcp.json

    Open (or create) ~/.cursor/mcp.json and paste: { "mcpServers": { "opus-growth": { "url": "https://mcp.opus-growth.com" } } } — that is the whole installation. Nothing to npm install, no local server to run, and no API key or developer token anywhere in the file.

  2. 2

    Reload Cursor and sign in with Google

    Restart Cursor or reload the window so the file is read; opus-growth then appears in Cursor's MCP settings with its tool list. The first tool call opens hosted OAuth in your browser: sign in with Google, approve access, and choose exactly which ad accounts the connector may work with. About 60 seconds end to end.

  3. 3

    Ask in agent mode, then approve

    MCP tools are invoked by Cursor's agent, so use agent mode rather than a plain editor question. Read requests answer immediately. Anything that would change the account stops at the preview until you confirm it.

  4. 4

    Same connector, other editors and CLIs

    VS Code takes the same JSON at .vscode/mcp.json and Windsurf at ~/.codeium/windsurf/mcp_config.json. Codex uses ~/.codex/config.toml with an [mcp_servers.opus-growth] section and the line url = "https://mcp.opus-growth.com". Gemini CLI is one command: gemini mcp add -t http opus-growth https://mcp.opus-growth.com. Your Opus Growth account and your ad account authorization carry across all of them, so you set up the connection once and pick whichever client you happen to be in.

Ask in plain English

Read src/app/pricing/page.tsx, then write 15 responsive search ad headlines and 4 descriptions using the real plan names and prices, and stage the ad in my Brand campaign for approval.

Compare the headlines on my live search ads with the hero copy in app/(marketing)/page.tsx and rewrite the ones that no longer match the page.

The /integrations route ships today — create a paused Search campaign with a $60 daily budget, one ad group of exact-match keywords for our integration names, and sitelinks pointing at the routes in this repo.

Create a GTM tag and trigger for the signup button in components/signup-modal.tsx, then publish the container version.

Which pages in this repo get Search Console impressions but almost no clicks? Cross-check with GA4 and tell me which two to rewrite first.

Pull the last 30 days of spend, conversions and CPA across Google Ads, Microsoft Advertising, TikTok and LinkedIn and write the summary to docs/marketing/weekly.md.

Run a search-terms audit on my Search campaigns and add the obvious waste as phrase-match negatives — show me the list before anything is applied.

How they compare

Opus GrowthWriting your own Google Ads API script
Time to first working callPaste one JSON block, reload Cursor, sign in with Google. Roughly a minute, and the first report runs in the same session.Apply for a developer token, register an OAuth client, mint a refresh token, install a client library, then debug your first GAQL query. Days of elapsed time, not minutes.
CredentialsHosted OAuth. The config file holds a public URL and nothing else, so there is no secret in your dotfiles or your repository.You hold the client ID, client secret, refresh token and developer token — and you own keeping them out of git, out of logs and rotated.
Coverage you get on day one69 Google Ads tools plus Microsoft Advertising 30, TikTok 25 and LinkedIn 18 — 142 live ad tools — with Tag Manager 18, GA4 10, Search Console 6 and YouTube 5 behind the same connection.Exactly what you build. Every extra report type, mutate operation or additional platform is another chunk of work you own permanently.
Safety on writesPreview and confirmation enforced on the server, plus the 50% budget cap, so the guardrail holds even when the agent is running unattended.Whatever guardrails you remember to write. A mutate call with a wrong micros value applies the moment it is sent.
MaintenanceAPI version upgrades, deprecated fields and token refresh are handled by the hosted service. Nothing on your side breaks quietly.Google Ads API versions retire on a schedule, so keeping the client, the queries and the mutate payloads current is permanent background work.
Who on the team can use itAnyone who can open Cursor, VS Code, Claude or ChatGPT — the marketer does not need to run your script or read your code.Whoever can execute the code and holds the credentials, which in practice is usually one engineer.
Where it runsRemote and hosted. No process on your laptop, no cron box, nothing to pay for or babysit.Somewhere you host it: a laptop, a scheduled job, a serverless function — each with the credentials it needs to run unattended.
CostFree 7-day trial with 50 actions and full write access, then $49.99/month Pro on a single account or $99.99/month Agency for multiple accounts.No licence fee, then your engineering hours to build it and more hours every time the API or the requirement moves.
When it is the right choiceYou want ad operations available conversationally, in the editor, today — and you would rather spend the week on product.You need a bespoke pipeline, unusual bulk logic or something no tool exposes. In that case building it really is the right call.

Frequently asked questions

Open ~/.cursor/mcp.json and add the connector: { "mcpServers": { "opus-growth": { "url": "https://mcp.opus-growth.com" } } }. Reload the Cursor window so the server is picked up, then trigger a tool from agent mode — Cursor opens hosted OAuth in your browser, you sign in with Google and choose the Google Ads accounts the connector may touch. From empty file to first report is about a minute, and there is nothing to install locally.

No. Opus Growth is a remote MCP server over HTTP, so there is no npm package, no Docker container and no stdio process on your machine that has to be running when you ask a question. It also means there is no Google Ads developer token to apply for, no OAuth client to register and no refresh token to keep out of git: you sign in with Google once through hosted OAuth and pick the accounts the connector may use. The practical difference on a laptop is that there is nothing to restart and nothing to update, and a second machine works the moment you paste the same block.

~/.cursor/mcp.json is the user-level file, so the connector is available in every project you open. A .cursor/mcp.json in a repository root scopes it to that one codebase instead, and VS Code's .vscode/mcp.json behaves the same way. Both are safe to commit: the file contains a public URL and no credentials at all — no API key, no client secret, no refresh token — so putting it in git leaks nothing. Each teammate still signs in with their own Google account and selects their own ad accounts on first use, so access is granted, and revoked, per person.

Three things, in order. Reload the window first: Cursor reads MCP configuration at startup, so a file edited while the window is open has not been seen yet, and this is the most common cause by a distance. Then check that the JSON is valid — one trailing comma or a missing brace makes the whole file unreadable and the server simply does not appear. Finally, make sure you are in agent mode, because MCP tools are called by the agent and a plain editor question will never trigger one. If the server is listed but every call fails, the OAuth step has not been finished: trigger any tool and complete the browser sign-in.

No. It is a remote MCP server and it only ever receives the arguments of the tool calls the agent makes: a customer ID, a date range, the headline text to create, a budget value. It has no filesystem access and does not index your repository. When you ask for headlines based on your pricing page, Cursor is the side that reads the file locally; what reaches us is the copy the agent composed as a tool argument. You decide what leaves the editor.

No, because the gate is not in Cursor. Even with auto-run fully enabled, a write tool returns a dry-run preview instead of performing the change, and applying it needs a separate explicit confirmation; a budget increase of more than 50% in one step is refused whatever the client is set to. Client-side approval settings can only make the agent faster at proposing things — they cannot hand it spend authority. Worth knowing before you switch auto-run on with an ad account connected.

Yes — same connector, different file location. VS Code: the same JSON in .vscode/mcp.json. Windsurf: ~/.codeium/windsurf/mcp_config.json. Codex: ~/.codex/config.toml with an [mcp_servers.opus-growth] section and url = "https://mcp.opus-growth.com". Gemini CLI: gemini mcp add -t http opus-growth https://mcp.opus-growth.com. It also works in Claude, Claude Code and ChatGPT, and because the authorization lives with your Opus Growth account rather than with the editor, connecting once covers every one of them.

That depends on the plan, and it is worth being blunt about. The free trial and Pro are locked to a single ad account: you choose which one, you can change it, but the agent works one account at a time. Agency removes the lock — several connected accounts plus manager (MCC) hierarchies through login-customer-id, so one request can span client accounts. If you run ads for one brand, Pro is the right plan. If you run them for clients, only Agency does what you are picturing.

Actions are metered per tool call and weighted by cost, so 50 stretches further than it sounds. Creating a Search campaign costs 8, adding a batch of keywords 5, a full account audit 3, keyword research 3, and a performance or search-terms report 2 each. Connecting an account and checking your usage cost nothing. In practice that is roughly six complete campaign builds, or about sixteen account audits, or a couple of months of weekly reporting. The trial runs 7 days, needs no card, and has full write access — you can create campaigns and add negatives, not only read reports. After it, Pro is $49.99/month for 5,000 actions on a single account and Agency is $99.99/month for unlimited actions and multiple accounts; yearly is $499.99 and $999.99, billed in USD through Lemon Squeezy as merchant of record, cancel anytime.

Explore more

Paste one block into ~/.cursor/mcp.json, sign in with Google, and make your first approved campaign change without leaving the editor — 7-day free trial, 50 actions, full write access, no card required.