microsoft_ads_get_performance_report
Get Microsoft Ads Performance Report
MicrosoftDescription
Comprehensive Microsoft Advertising performance report broken down by ENTITY — one row per campaign, ad group, ad, or keyword — with pre-selected columns. Covers the full funnel: Impressions → Clicks → Spend → Conversions → Revenue. WHEN NOT TO USE THIS: if the user wants a single account-wide total, a "performance summary / overview" for a whole account, or an account-level conversion-goal breakdown ("which goals drove the most activity") that does NOT need to be split per campaign, use microsoft_ads_get_account_summary instead — it is the purpose-built account-level rollup (it also supports breakdown_by_goal) and is simpler and faster for that job. This holds REGARDLESS of the date shape: a custom start/end date range (e.g. "performance for January 2026", "how did my account do from 2026-01-01 to 2026-01-31") does NOT make this the right tool — get_account_summary accepts the same date_preset and custom date_range inputs, so an account-level total over a custom range still belongs there. Only the need for per-entity rows (per campaign, ad group, ad, or keyword) justifies reaching for this report. Levels: • Campaign (default): CampaignId, CampaignName, CampaignStatus, CampaignType + metrics • AdGroup: + AdGroupId, AdGroupName, Status (the ad group's status) • Ad: + AdId, AdType, AdTitle, AdGroupStatus, AdStatus • Keyword: + AdGroupId, AdGroupName, AdGroupStatus, KeywordId, Keyword, BidMatchType, QualityScore, ExpectedCtr, AdRelevance, LandingPageExperience. No CampaignType column, so campaign_type is rejected at this level; use campaign_ids. All levels include: TimePeriod, Impressions, Clicks, Spend, AverageCpc, Ctr, ConversionsQualified (surfaced as conversions), Revenue, derived cost_per_conversion. CONVERSION SURFACE (HOP-50): • conversions is bidding-set only (reads the ConversionsQualified column). The deprecated Conversions, ConversionRate, CostPerConversion, and ReturnOnAdSpend columns are REJECTED at the schema layer — Bing returns 0 for them on modern accounts. Derive the rate / per-conversion metrics client-side from spend + conversions. • include_all_conversions: boolean (default false). When true, the tool auto-adds AllConversionsQualified / AllRevenue / ViewThroughConversionsQualified to the column set and attaches an 'all_conversions' sub-object to every row capturing every conversion goal — not just the bidding-set. Mirrors google_ads_get_performance_report's enhanced-conversions flag. • breakdown_by_goal: boolean (default true). Runs a parallel GoalsAndFunnelsReport for the same scope and joins per-goal totals onto the response as 'goal_breakdown' keyed by campaign_id (or account_id when no campaign filter). Set to false to skip the parallel SOAP call when latency matters more than per-goal context. KEY DIFFERENCES FROM GOOGLE: • Single query (no dual-query needed — Microsoft has no conversion segment restriction) • Spend is in the account's currency (USD, GBP, etc.) — not micros • Conversion split surfaces via include_all_conversions + breakdown_by_goal flags For custom column selection, use microsoft_ads_get_insights. For search term analysis, use microsoft_ads_get_search_terms. For impression share metrics, use microsoft_ads_get_impression_share. PAGING: rows come back one page at a time, sorted Spend highest first. Leave limit unset: each page is then sized so the whole response fits what MCP clients accept (up to ${DEFAULT_REPORT_PAGE_ROWS} rows, ending early at about ${RESPONSE_CHAR_BUDGET.toLocaleString('en-US')} characters, so wide Keyword-level rows give fewer rows per page). To get more rows, follow the cursor rather than raising limit; an explicit limit (max ${MAX_REPORT_PAGE_ROWS}) is exact. count is the total across all pages. When the response has a nextCursor, call again with exactly the same parameters plus cursor = nextCursor; repeat until nextCursor is absent to collect every row. Later pages re-read the same report rather than running a new one (no queue wait, each row exactly once), and omit goal_breakdown, which only the first page carries. Note: Microsoft's async report pipeline typically takes 5–30 seconds per call.
Usage
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "microsoft_ads_get_performance_report",
"arguments": {
"account_id": "1234567890",
"level": "Campaign",
"date_preset": "LastMonth",
"aggregation": "Daily",
"reason": "Monthly performance review — show daily trends for all campaigns"
}
}
}
hopkin microsoft performance-report get
| Flag | Type | Required | Description |
|---|---|---|---|
--account | string | Required | Microsoft Advertising Account ID (numeric string) |
--customer-id | string | Optional | Customer/manager ID. Required when accessing accounts through an agency manager. |
--level | string | Optional | Report granularity. Campaign (default): one row per campaign. AdGroup: one row per ad group. Ad: one row per ad. Keyword: one row per keyword with BidMatchType and Quality Score components (QualityScore, ExpectedCtr, AdRelevance, LandingPageExperience); campaign_type is not supported at Keyword level. |
--date-range | object | Optional | Custom date range { start, end } in YYYY-MM-DD. Use either this or date_preset. |
--date-preset | string | Optional | Predefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
--aggregation | string | Optional | Time aggregation. Daily (default): row per day. Weekly: row per week. Monthly: row per month. Summary: single totals row for the full date range. |
--campaign-ids | array | Optional | Filter to specific campaign IDs (up to 50). |
--campaign-type | array | Optional | Return only rows from campaigns of these types. Allowed: Search, Shopping, PerformanceMax, Audience. Applied to the report rows (Microsoft reports cannot filter by type), so count and goal_breakdown cover only the matching campaigns. If not provided, all campaign types are included. Not supported at level Keyword (Microsoft's keyword report has no campaign type column); use campaign_ids there. |
--include-all-conversions | boolean | Optional | When true, adds AllConversionsQualified, AllRevenue, and ViewThroughConversionsQualified to the column request (mirrors google-ads-mcp enhanced-conversions opt-in). These columns capture ALL conversion goals including non-bidding goals. The response added_columns field lists which columns were automatically included. |
--breakdown-by-goal | boolean | Optional | When true (default), runs a parallel GoalsAndFunnelsReport and returns goal_breakdown keyed by account_id (account-scope) or campaign_id (campaign-scope when campaign_ids filter is set). Each entry is an array of per-goal rows with all_conversions, all_revenue, view_through_conversions, assists. Set goal_breakdown_granularity to "account" or "campaign" accordingly. Pass false to skip the parallel report when latency matters more than goal context. |
--limit | integer | Optional | Rows per page (1-10000). Usually omit it: the page is then sized so the whole response fits what MCP clients accept, up to 500 rows and ending early at about 45,000 characters, so wide rows (Keyword level) give fewer rows per page. To get more rows, follow nextCursor rather than raising limit; set limit only if your client takes large responses. The whole report is sorted by Spend (highest first), then by the row's column values, and returned one page at a time. count is the total across all pages; while more rows remain, the response has a top-level nextCursor. |
--cursor | string | Optional | Opaque cursor from nextCursor of the previous response; never construct one. To get the next page, repeat the call with exactly the same parameters (only limit may change) plus this cursor. Later pages re-read the same Microsoft report instead of generating a new one, so every row appears exactly once. Cursors expire with the report (about 24 hours). goal_breakdown is returned on the first page only. |
--connection-id | string | Optional | Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs. |
{
"mcpServers": {
"microsoft-ads": {
"url": "https://microsoft.mcp.hopkin.ai",
"transport": "sse"
}
}
}
- Monthly campaign overview
- Ad group drilldown for Q1
- Keyword Quality Score and ROI summary
- Ad performance for specific Search campaigns
- Managed account (agency) campaign report
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
account_id |
string |
Required | Microsoft Advertising Account ID (numeric string)minLength: 1, maxLength: 20, pattern: ^\d+$ |
reason |
string |
Required | Why this tool call is neededminLength: 1, maxLength: 500 |
Optional parameters (12)
| Name | Type | Required | Description |
|---|---|---|---|
customer_id |
string |
Optional | Customer/manager ID. Required when accessing accounts through an agency manager.minLength: 1 |
level |
string |
Optional | Report granularity. Campaign (default): one row per campaign. AdGroup: one row per ad group. Ad: one row per ad. Keyword: one row per keyword with BidMatchType and Quality Score components (QualityScore, ExpectedCtr, AdRelevance, LandingPageExperience); campaign_type is not supported at Keyword level.Campaign AdGroup Ad Keyword |
date_range |
object |
Optional | Custom date range { start, end } in YYYY-MM-DD. Use either this or date_preset. |
date_preset |
string |
Optional | Predefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.Today Yesterday LastSevenDays ThisWeek LastWeek LastFourWeeks ThisMonth LastMonth LastThreeMonths LastSixMonths ThisYear LastYear |
aggregation |
string |
Optional | Time aggregation. Daily (default): row per day. Weekly: row per week. Monthly: row per month. Summary: single totals row for the full date range.Daily Weekly Monthly Summary |
campaign_ids |
array |
Optional | Filter to specific campaign IDs (up to 50). |
campaign_type |
array |
Optional | Return only rows from campaigns of these types. Allowed: Search, Shopping, PerformanceMax, Audience. Applied to the report rows (Microsoft reports cannot filter by type), so count and goal_breakdown cover only the matching campaigns. If not provided, all campaign types are included. Not supported at level Keyword (Microsoft's keyword report has no campaign type column); use campaign_ids there. |
include_all_conversions |
boolean |
Optional | When true, adds AllConversionsQualified, AllRevenue, and ViewThroughConversionsQualified to the column request (mirrors google-ads-mcp enhanced-conversions opt-in). These columns capture ALL conversion goals including non-bidding goals. The response added_columns field lists which columns were automatically included. |
breakdown_by_goal |
boolean |
Optional | When true (default), runs a parallel GoalsAndFunnelsReport and returns goal_breakdown keyed by account_id (account-scope) or campaign_id (campaign-scope when campaign_ids filter is set). Each entry is an array of per-goal rows with all_conversions, all_revenue, view_through_conversions, assists. Set goal_breakdown_granularity to "account" or "campaign" accordingly. Pass false to skip the parallel report when latency matters more than goal context. |
limit |
integer |
Optional | Rows per page (1-10000). Usually omit it: the page is then sized so the whole response fits what MCP clients accept, up to 500 rows and ending early at about 45,000 characters, so wide rows (Keyword level) give fewer rows per page. To get more rows, follow nextCursor rather than raising limit; set limit only if your client takes large responses. The whole report is sorted by Spend (highest first), then by the row's column values, and returned one page at a time. count is the total across all pages; while more rows remain, the response has a top-level nextCursor.min: 1, max: 10000 |
cursor |
string |
Optional | Opaque cursor from nextCursor of the previous response; never construct one. To get the next page, repeat the call with exactly the same parameters (only limit may change) plus this cursor. Later pages re-read the same Microsoft report instead of generating a new one, so every row appears exactly once. Cursors expire with the report (about 24 hours). goal_breakdown is returned on the first page only.minLength: 1 |
connection_id |
string |
Optional | Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs. |
Examples
Monthly campaign overview
{
"account_id": "1234567890",
"level": "Campaign",
"date_preset": "LastMonth",
"aggregation": "Daily",
"reason": "Monthly performance review — show daily trends for all campaigns"
}
hopkin microsoft performance-report get --account 1234567890 --level Campaign --date-preset LastMonth --aggregation Daily
Ad group drilldown for Q1
{
"account_id": "1234567890",
"level": "AdGroup",
"date_range": {
"start": "2026-01-01",
"end": "2026-03-31"
},
"aggregation": "Weekly",
"reason": "Q1 ad group performance with weekly trend for budget reallocation decisions"
}
hopkin microsoft performance-report get --account 1234567890 --level AdGroup --date-range [object Object] --aggregation Weekly
Keyword Quality Score and ROI summary
{
"account_id": "1234567890",
"level": "Keyword",
"date_preset": "LastMonth",
"aggregation": "Summary",
"reason": "Identify low-QS keywords with high spend for optimization"
}
hopkin microsoft performance-report get --account 1234567890 --level Keyword --date-preset LastMonth --aggregation Summary
Ad performance for specific Search campaigns
{
"account_id": "1234567890",
"level": "Ad",
"date_preset": "LastSevenDays",
"aggregation": "Daily",
"campaign_type": [
"Search"
],
"reason": "A/B test RSA ad copy — compare conversion rates across ad variants"
}
hopkin microsoft performance-report get --account 1234567890 --level Ad --date-preset LastSevenDays --aggregation Daily --campaign-type Search
Managed account (agency) campaign report
{
"account_id": "9876543210",
"customer_id": "5555555555",
"level": "Campaign",
"date_preset": "ThisMonth",
"aggregation": "Daily",
"reason": "Client campaign performance for monthly report"
}
hopkin microsoft performance-report get --account 9876543210 --customer-id 5555555555 --level Campaign --date-preset ThisMonth --aggregation Daily