Free Google Ads and PPC tools: ad copy, ROAS, CPC, budgets, wasted spend and landing page checks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Checks Google responsive search ad or Meta ad text against character limits and common rejection reasons (symbols, capitals, repeated text, claims). Returns issues per line: fix (likely rejected or cut off) or look (worth a second look).
Google display path fields (up to 2).
The main keyword or service the ad is for.
google for a responsive search ad, meta for a Facebook or Instagram ad
Google: up to 15 headlines. Meta: headlines.
Google: up to 4 descriptions. Meta: descriptions.
Meta primary text variations.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http free-tools https://spendcanary.com/mcp
Checks Google responsive search ad or Meta ad text against character limits and common rejection reasons (symbols, capitals, repeated text, claims). Returns issues per line: fix (likely rejected or cut off) or look (worth a second look).
| Argument | Type | Description |
|---|---|---|
| paths | array | Google display path fields (up to 2). |
| keyword | string | The main keyword or service the ad is for. |
| platform | string | google for a responsive search ad, meta for a Facebook or Instagram ad |
| headlines | array | Google: up to 15 headlines. Meta: headlines. |
| descriptions | array | Google: up to 4 descriptions. Meta: descriptions. |
| primary_text | array | Meta primary text variations. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"paths": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 2,
"description": "Google display path fields (up to 2)."
},
"keyword": {
"type": "string",
"maxLength": 200,
"description": "The main keyword or service the ad is for."
},
"platform": {
"enum": [
"google",
"meta"
],
"type": "string",
"default": "google",
"description": "google for a responsive search ad, meta for a Facebook or Instagram ad"
},
"headlines": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"default": [],
"maxItems": 15,
"description": "Google: up to 15 headlines. Meta: headlines."
},
"descriptions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"default": [],
"maxItems": 10,
"description": "Google: up to 4 descriptions. Meta: descriptions."
},
"primary_text": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 5,
"description": "Meta primary text variations."
}
}
}Loads a public landing page on a phone and a computer and checks speed, redirects, a way to call, book or buy, and the Google tag. Limited to 5 checks an hour.
| Argument | Type | Description |
|---|---|---|
| url* | string | The public web address an ad sends people to. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"description": "The public web address an ad sends people to."
}
}
}Cost per click from spend and clicks, or clicks from spend and cost per click (any two of the three), plus CPM and click-through rate from impressions.
| Argument | Type | Description |
|---|---|---|
| spend | number | Ad spend. |
| clicks | integer | Clicks. |
| currency | string | Currency code for the amounts; amounts are shown in it, never converted. |
| impressions | integer | Impressions, for CPM and click-through rate. |
| cost_per_click | number | Cost per click; give two of spend, clicks and cost_per_click. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"spend": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Ad spend."
},
"clicks": {
"type": "integer",
"maximum": 1000000000,
"minimum": 0,
"description": "Clicks."
},
"currency": {
"enum": [
"USD",
"EUR",
"GBP",
"CAD",
"AUD",
"NZD",
"AED",
"INR",
"SGD"
],
"type": "string",
"default": "USD",
"description": "Currency code for the amounts; amounts are shown in it, never converted."
},
"impressions": {
"type": "integer",
"maximum": 1000000000,
"minimum": 0,
"description": "Impressions, for CPM and click-through rate."
},
"cost_per_click": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Cost per click; give two of spend, clicks and cost_per_click."
}
}
}The most Google Ads can charge in one day (2× the average daily budget) and in a month (30.4×) for a campaign daily budget.
| Argument | Type | Description |
|---|---|---|
| currency | string | Currency code for the amounts; amounts are shown in it, never converted. |
| daily_budget* | number | Average daily budget of one campaign. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"daily_budget"
],
"properties": {
"currency": {
"enum": [
"USD",
"EUR",
"GBP",
"CAD",
"AUD",
"NZD",
"AED",
"INR",
"SGD"
],
"type": "string",
"default": "USD",
"description": "Currency code for the amounts; amounts are shown in it, never converted."
},
"daily_budget": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Average daily budget of one campaign."
}
}
}Return on ad spend from sales and ad spend, plus the break-even ROAS and profit for a profit margin.
| Argument | Type | Description |
|---|---|---|
| revenue* | number | Sales from the ads (conversion value) in the period. |
| ad_spend* | number | What the ads cost in the same period. |
| currency | string | Currency code for the amounts; amounts are shown in it, never converted. |
| margin_percent | number | Profit margin in percent, for the break-even ROAS. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"revenue",
"ad_spend"
],
"properties": {
"revenue": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Sales from the ads (conversion value) in the period."
},
"ad_spend": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "What the ads cost in the same period."
},
"currency": {
"enum": [
"USD",
"EUR",
"GBP",
"CAD",
"AUD",
"NZD",
"AED",
"INR",
"SGD"
],
"type": "string",
"default": "USD",
"description": "Currency code for the amounts; amounts are shown in it, never converted."
},
"margin_percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Profit margin in percent, for the break-even ROAS."
}
}
}Compares cost per conversion on Google Search with the Search Partners network and estimates what partners cost a month beyond Search, using the same rule as the SpendCanary scan.
| Argument | Type | Description |
|---|---|---|
| days | integer | Days the figures cover. |
| currency | string | Currency code for the amounts; amounts are shown in it, never converted. |
| google_search_cost* | number | |
| search_partners_cost* | number | |
| google_search_conversions* | number | |
| search_partners_conversions* | number |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"google_search_cost",
"google_search_conversions",
"search_partners_cost",
"search_partners_conversions"
],
"properties": {
"days": {
"type": "integer",
"default": 30,
"maximum": 366,
"minimum": 1,
"description": "Days the figures cover."
},
"currency": {
"enum": [
"USD",
"EUR",
"GBP",
"CAD",
"AUD",
"NZD",
"AED",
"INR",
"SGD"
],
"type": "string",
"default": "USD",
"description": "Currency code for the amounts; amounts are shown in it, never converted."
},
"google_search_cost": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
},
"search_partners_cost": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
},
"google_search_conversions": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
},
"search_partners_conversions": {
"type": "number",
"maximum": 1000000000,
"minimum": 0
}
}
}Reads a Google Ads search terms report (CSV text) and totals the spend on search terms with no conversions, with the costliest ones and a monthly figure.
| Argument | Type | Description |
|---|---|---|
| csv* | string | The Google Ads search terms report exported as CSV, as text (up to 2 MB). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"csv"
],
"properties": {
"csv": {
"type": "string",
"maxLength": 2000000,
"description": "The Google Ads search terms report exported as CSV, as text (up to 2 MB)."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.