microsoft_ads_get_performance_report

Get Microsoft Ads Performance Report

Microsoft

Description

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.

Read-onlyOpen-world

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"
    }
  }
}

Parameters

NameTypeRequiredDescription
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)
NameTypeRequiredDescription
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