# Google Ads reporting from your terminal.

Adwarp is an open-source MCP server and CLI that pulls Google Ads performance at 5 levels, from campaigns down to the search terms that triggered your ads. Ask in plain words or run 1 command, and a read-only GAQL query covers anything else.

## What you can ask.

Real requests, answered from your terminal.

### Which search terms spent the most last month?

```text
> Which search terms spent the most last month?
adwarp.gads_performance search_term, last_month: by cost
Each term with spend, clicks, click-through rate and conversions, highest cost first
Ready to pick negatives from the top of the list.
```

### Which keywords spent money without converting?

```text
> Which keywords spent money without converting?
adwarp.gads_performance keyword, last_30_days: by cost
Keywords with cost and no conversions, each with its match type and ad group
Candidates to pause in Google Ads, highest cost first.
```

### How is each campaign doing this month?

```text
> How is each campaign doing this month?
adwarp.gads_performance campaign, month_to_date: totals + rows
Spend, clicks, click-through rate, cost per click and cost per conversion for each campaign
The account total on top, worked out from the same rows
```

### What's the quality score on each of my keywords?

```text
> What's the quality score on each of my keywords?
adwarp.gads_search SELECT ... FROM ad_group_criterion: read-only
Each keyword with its quality score, straight from a GAQL query
```

## How it works.

1. Ask. Ask in plain words, or run npx adwarp google report perf from your terminal.
2. Pick the level. Campaign, ad group, ad, keyword or search term, for a named period or any 2 dates, narrowed to 1 campaign when you need it.
3. Go deeper with GAQL. Anything the reports don't cover, such as quality scores, is 1 read-only GAQL query away.

## Why it gets better results.

### Waste shows up weekly

Search terms and keyword costs are 1 question away, so you check them every week instead of at month end.

### The biggest costs lead

Rows come back highest spend first, so the line items that matter most are on top.

### Reading never changes anything

Every reporting tool is read-only, and the GAQL tool only runs SELECT queries.

## Questions, answered.

### Can I see the search terms behind my ads?

Yes. The search_term level lists the searches that triggered your ads, with their cost and conversions, so you can spot the ones to add as negatives.

### Does reporting need Basic access?

No. Reporting and campaign creation work on Explorer access. Only keyword research needs Basic access.

### Does it work on the hosted endpoint?

No. The Google tools run on your machine, through the local MCP server or the CLI, with your own developer token and OAuth client.

### Which metrics can I get?

Impressions, clicks, cost, conversions and conversion value, plus the rates worked out from them and totals for the whole report, over the period you pick.

| Part | Options |
| --- | --- |
| Metrics | Impressions, clicks, cost, conversions and conversion value |
| Worked out | Click-through rate, cost per click, cost per 1,000 impressions, conversion rate and cost per conversion |
| Totals | The whole report summed, with the same rates worked out from the totals |
| Periods | Last 7, 30 or 90 days, month to date, last month, or any 2 dates through the MCP server |
| Filter | 1 campaign, for the levels under it |

### Which levels can I report on?

5: campaign, ad group, ad, keyword and search term, each row named the way Google Ads names it.

| Level | What a row is |
| --- | --- |
| campaign | A campaign, with its status. |
| ad_group | An ad group, under its campaign. |
| ad | A responsive search ad, named by its first headline, under its campaign and ad group. |
| keyword | A keyword with its match type, under its campaign and ad group. |
| search_term | A search that triggered your ads, under the ad group it matched. |

### What is GAQL?

Google Ads Query Language, which the Google Ads API reads data with. gads_search runs any SELECT query, so anything the reports don't cover is still 1 question away, and it refuses anything that isn't a SELECT.

From the terminal, npx adwarp google query runs the same queries and returns the rows as they come from Google.

quality-scores.gaql:

```text
SELECT ad_group_criterion.keyword.text,
       ad_group_criterion.quality_info.quality_score
FROM ad_group_criterion
WHERE ad_group_criterion.type = KEYWORD
```

### Which tools and commands does it use?

3 MCP tools and 3 CLI commands, with what each one does.

| Tool | What it does |
| --- | --- |
| `gads_performance` | Rows at campaign, ad group, ad, keyword or search term level, with totals |
| `gads_search` | A raw, read-only GAQL query for anything else |
| `gads_list_campaigns` | Campaigns with their ad groups, paused ones included |

CLI:

```bash
npx adwarp google report perf search_term -p last_month
npx adwarp google report perf keyword --campaign <id>
npx adwarp google query "<GAQL>"
```

### What are the limits?

4 things to know before you start.

- Reports skip rows with no impressions in the period. To see paused or new campaigns, use gads_list_campaigns.
- Costs are in the ad account's currency, which Google fixes when the account is created.
- Conversions only show when conversion tracking is set up.
- The Google tools run locally. The hosted endpoint serves 0 of the 9 Google tools.

## Related

- [Search campaigns](https://adwarp.dev/google-ads/search-campaigns): Build from a brief, paused
- [Keyword research](https://adwarp.dev/google-ads/keyword-research): Find what to bid on next
- [LinkedIn Ads reporting](https://adwarp.dev/linkedin-ads/reporting): The same reads for LinkedIn

Unofficial. Not affiliated with or endorsed by LinkedIn or Google.

Canonical page: https://adwarp.dev/google-ads/reporting
Last updated: 2026-10-18
