list_search_terms
Review the Google Ads search terms report with filtering, sorting, and pagination.
Read search
Returns data. Calling it changes nothing, so it is safe in an unattended loop.
What it does
Review the Google Ads search terms report with filtering, sorting, and pagination.
PURPOSE:
List the actual search queries that triggered the account's Google Ads, so you can
review wasteful or off-target terms and decide which ones to add to a negative
keywords list. Mirrors the "Search Terms" library page in the Metadata UI.
WHEN TO USE:
- Investigate which queries are costing money without producing clicks or conversions
- Find queries to add to a negative keywords list (pair with add_keywords_to_negative_lists)
- Inspect search terms tied to a specific experiment or matched keyword
- Sort by cost / clicks / conversions to surface the worst offenders
FILTERS (all optional):
- searchTerm: substring match on the search term text
- experiment: experiment name substring match
- keyword: matched keyword substring
- matchType: array subset of [PHRASE, BROAD, EXACT, NEAR_EXACT, NEAR_PHRASE]
- startDate / endDate: ISO-8601 timestamps (e.g. 2026-06-01T00:00:00.000Z).
The UI defaults to the last 30 days when both are omitted.
PAGINATION & SORT:
- page: 0-based (default 0)
- size: rows per page (default 12, max 100)
- sort: "<field>,<direction>". Sortable fields include searchTerm, matchType,
experiment, addedExcluded, keyword, impressions, clicks, ctr, averageCpc,
spent, conversions, costPerConversion. Direction is asc or desc.
Default: "clicks,desc".
RESPONSE FORMAT:
Returns a paginated response:
{
"totalElements": 123,
"totalPages": 5,
"data": [
{
"id": "bGVhZCBnZW5lcmF0aW9uIGNhbmFkYQ",
"searchTerm": "lead generation canada",
"experiment": "MD_Experiment",
"experimentId": "179908",
"matchType": "PHRASE",
"keyword": "lead generation",
"addedExcluded": "Added",
"impressions": 200,
"clicks": 11,
"ctr": 5.5,
"averageCpc": 2.3,
"spent": 25.30,
"conversions": 0,
"costPerConversion": null
},
...
]
}
COMMON USE CASES:
1. Top spenders with zero conversions in the last 30 days:
list_search_terms(sort="spent,desc")
then filter the response client-side for conversions == 0.
2. Worst CTR among phrase matches:
list_search_terms(matchType=["PHRASE"], sort="ctr,asc")
3. Search terms tied to a specific experiment:
list_search_terms(experiment="Q2 Brand Test")
4. Date-bounded review:
list_search_terms(
startDate="2026-05-01T00:00:00.000Z",
endDate="2026-05-31T23:59:59.999Z",
sort="spent,desc"
)
PARAMETERS:
- searchTerm (string, optional): substring filter on the search term text.
- experiment (string, optional): experiment name substring filter.
- keyword (string, optional): matched keyword substring filter.
- matchType (array of strings, optional): subset of
[PHRASE, BROAD, EXACT, NEAR_EXACT, NEAR_PHRASE].
- startDate (string, optional): ISO-8601 timestamp lower bound.
- endDate (string, optional): ISO-8601 timestamp upper bound.
- page (integer, optional): 0-based page index (default 0).
- size (integer, optional): rows per page (default 12).
- sort (string, optional): "<field>,<direction>" (default "clicks,desc").
CHANNEL SCOPE:
BOTH search channels are supported: pass channel=MICROSOFT_ADS for Microsoft
Ads (Bing) and channel=GOOGLE_ADS for Google. The two channels hold SEPARATE
reports, so never substitute one channel for the other to get "close enough"
results.Arguments
| Argument | Type | Notes | |
|---|---|---|---|
searchTerm |
string | Optional substring filter on the search term text. | |
experiment |
string | Optional experiment name substring filter. | |
keyword |
string | Optional matched-keyword substring filter. | |
matchType |
array | Optional subset of match types to include. | |
startDate |
string | Optional ISO-8601 timestamp lower bound (e.g. 2026-06-01T00:00:00.000Z). | |
endDate |
string | Optional ISO-8601 timestamp upper bound (e.g. 2026-06-30T23:59:59.999Z). | |
page |
integer | 0-based page index. Default 0. | |
size |
integer | Rows per page. Default 12 (kept small to limit chat-context tokens), max 100. | |
sort |
string | Sort criteria in format '<field>,<direction>'. Default 'clicks,desc'. Sortable fields: searchTerm, matchType, experiment, addedExcluded, keyword, impressions, clicks, ctr, averageCpc, spent, conversions, costPerConversion. | |
channel |
string | Ad channel scope. Both search channels are supported. These are PER-CHANNEL resources: GOOGLE_ADS and MICROSOFT_ADS hold separate sets, and one is invisible to the other. Defaults to GOOGLE_ADS when the user does not say which. one of: GOOGLE_ADS, MICROSOFT_ADS |
Request
curl
curl -s -X POST https://mcp-server.metadata.io/mcp \
-H "Authorization: $METADATA_PAT" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_search_terms","arguments":{}}}'
Response
Real, from the production server, in 2164 ms. The full response was 6,620 bytes; this is the first part of it. Values that identify a customer or disclose money are replaced with typed placeholders; keys, types and nesting are exactly as returned.
recorded response
{
"data": [
{
"id": "[id redacted]",
"searchTerm": "metadata",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "metadata",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": "[number redacted]",
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "[keyword redacted]",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 1,
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "[keyword redacted]",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 3,
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "[keyword redacted]",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 1,
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "PHRASE",
"keyword": "metadata",
"addedExcluded": "NONE",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 0,
"costPerConversion": 0
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "PHRASE",
"keyword": "metadata",
"addedExcluded": "NONE",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 0,
"costPerConversion": 0
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "[keyword redacted]",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": "[number redacted]",
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": "[number redacted]",
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "[searchTerm redacted]",
"experiment": "[experiment redacted]",
"experimentId": "[experimentId redacted]",
"matchType": "EXACT",
"keyword": "[keyword redacted]",
"addedExcluded": "ADDED",
"impressions": "[number redacted]",
"clicks": 99,
"ctr": "[number redacted]",
"averageCpc": "[number redacted]",
"spent": "[number redacted]",
"conversions": 1,
"costPerConversion": "[number redacted]"
},
{
"id": "[id redacted]",
"searchTerm": "adroll",
"experiment": "[experiment
… truncated
Related
Other search tools: