Microsoft Ads

Microsoft Advertising (Bing Ads) API v13 for Search, Shopping, Performance Max and Audience campaigns — read-only

31 tools available

Installation

Claude Desktop

{
  "mcpServers": {
    "hopkin-microsoft-ads": {
      "url": "https://microsoft.mcp.hopkin.ai",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

CLI

npm install -g @hopkin/cli
hopkin auth set-key hpk_live_...
hopkin microsoft ping

Tools

account-summary

microsoft_ads_get_account_summary Get Microsoft Ads Account Summary

Read-onlyOpen-world

THE tool for an account-level PERFORMANCE SUMMARY — one rolled-up total for a whole Microsoft

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising AccountId to report on.
reason requiredstringWhy this tool call is needed
6 optional parameters
ParameterTypeDescription
customer_idstringMicrosoft Advertising CustomerId (agency/manager). Required when accessing accounts managed under a customer hierarchy.
date_rangeobjectCustom date range. Mutually exclusive with date_preset. If neither is provided, defaults to the last 30 days.
date_presetstringPredefined date range. Mutually exclusive with date_range. If neither is provided, defaults to the last 30 days.
include_all_conversionsbooleanWhen true, includes an additional all_conversions block (all_conversions, all_revenue, all_cost_per_conversion, all_roas, view_through_conversions). This captures ALL conversion goals including those not marked "Include in Conversions" (e.g., view-through, non-bidding goals). Note: conversions is the bidding-set count only; all_conversions.all_conversions is every conversion goal — typically much larger for accounts with non-bidding goals.
breakdown_by_goalbooleanWhen true (default), runs a parallel GoalsAndFunnelsReport and returns goal_breakdown keyed by account_id. Each entry is an array of per-goal rows with all_conversions, all_revenue, view_through_conversions, and assists. Pass false to skip the parallel report when latency matters more than goal context. goal_breakdown_granularity will be "account" for this tool.
connection_idstringOptional 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.
View full documentation →

activities

microsoft_ads_get_activities Get Microsoft Ads Change History

Read-onlyIdempotentOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising Account ID (numeric string).
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
customer_idstringCustomer (manager) ID. Optional: only used to check access to an agency-managed account.
start_datestringStart of the window, YYYY-MM-DD (UTC). Defaults to 7 days before end_date.
end_datestringEnd of the window, YYYY-MM-DD (UTC), inclusive. Defaults to today.
item_typesarrayOnly these kinds of change. Keyword includes negative keyword lists and product groups; Extension includes sitelinks, callouts and other ad extensions.
entity_idsarrayOnly changes to these entity IDs (campaign, ad group, ad, keyword…).
limitintegerChanges per page (1-200, default 50).
cursorstringnextCursor from the previous response. Pass it with otherwise identical parameters for the next page.
refreshbooleanRe-read the account from Microsoft before answering. Normally not needed: it is re-read when the last read is over an hour old.
connection_idstringOptional 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.
View full documentation →

accounts

microsoft_ads_list_accounts List Microsoft Ads Accounts

Read-onlyOpen-world

List Microsoft Advertising accounts accessible to the authenticated user, or look up one

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
8 optional parameters
ParameterTypeDescription
account_idstringLook up a single account by its Microsoft Advertising AccountId. When provided, other filters and pagination are ignored and the tool returns exactly one account. This is the single-account lookup pattern — there is no separate get_account tool.
customer_idstringMicrosoft Advertising CustomerId of the agency/manager account. Required when accessing accounts managed under a customer hierarchy. Equivalent to Google Ads login_customer_id.
statusarrayFilter accounts by status. Accepts a JSON array or repeated values.
searchstringCase-insensitive partial match on account name or account_id.
limitintegerNumber of accounts per page (default: 20, max: 100).
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
refreshbooleanForce a live fetch from the Microsoft Ads API, bypassing the local cache. Defaults to false (cache-first — the normal, faster path). Set to true whenever the user asks for fresh / latest / real-time / up-to-date data, or explicitly says they do NOT want cached / stale data. If the user does not care about freshness, leave it false.
connection_idstringOptional 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.
View full documentation →

customers

microsoft_ads_list_customers List Microsoft Ads Customers

Read-onlyIdempotentOpen-world

List all Microsoft Advertising customers (manager/agency accounts) accessible to the authenticated user.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
5 optional parameters
ParameterTypeDescription
searchstringCase-insensitive partial match on customer name or customer_id.
statusstringFilter customers by status.
limitintegerNumber of customers per page (default: 20, max: 100).
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →

ad-extensions

microsoft_ads_list_ad_extensions List Microsoft Ads Ad Extensions

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId).
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
campaign_idsarrayOnly these campaigns and their ad groups. Account-level extensions are still listed (they serve on every campaign) unless association_levels leaves Account out. Default: every campaign.
association_levelsarrayWhich attachments to list: Account, Campaign, AdGroup. Default: all three — leave it out to see everything that serves on a campaign, since account-level extensions serve on every campaign and ad-group ones override the campaign's. Narrow it only when the user asks about one level.
extension_typesarrayOnly these extension types, e.g. ["Sitelink", "Callout", "StructuredSnippet"]. Default: every type.
editorial_statusarrayOnly associations in these editorial (policy) states: Disapproved (failed review, not serving), ActiveLimited (approved in some markets only), Inactive (under review), Active (approved). Applied to the whole scan before paging, so nothing is missed. Pass ["Disapproved", "ActiveLimited", "Inactive"] for "what is not approved". Default: every state.
include_rawbooleanDefault false. When true, each row also carries the full extension as returned by Microsoft (every field, e.g. scheduling, device preference, all URLs). Much larger output.
limitintegerRows per page (1-500, default 50).
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →

ad-groups

microsoft_ads_list_ad_groups List Microsoft Ads Ad Groups

Read-onlyOpen-world

List ad groups across one or more Microsoft Ads campaigns.

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (numeric string).
campaign_ids requiredarrayRequired. Parent campaign IDs to list ad groups for (1–50). Ad groups are scoped to a campaign in Bing — supply one or more campaign IDs whether listing or looking up by ID. Accepts JSON array string or native array.
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID. Required for managed accounts.
ad_group_idstringLook up a single ad group by ID. Mutually exclusive with ad_group_ids. Throws if not found. Filters and pagination are ignored when set.
ad_group_idsarrayLook up multiple ad groups by ID (max 100). Mutually exclusive with ad_group_id. Filters and pagination are ignored when set.
statusarrayFilter by ad group status. One or more of: Active, Paused, Deleted, Expired.
searchstringFilter ad groups by name (case-insensitive substring match).
limitintegerNumber of ad groups per page (default: 20, max: 100).
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
refreshbooleanForce a live fetch from the Microsoft Ads API, bypassing the local cache. Defaults to false (cache-first — the normal, faster path). Set to true whenever the user asks for fresh / latest / real-time / up-to-date data, or explicitly says they do NOT want cached / stale data. If the user does not care about freshness, leave it false.
connection_idstringOptional 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.
View full documentation →

ads

microsoft_ads_list_ads List Microsoft Ads

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId)
ad_group_ids requiredarrayRequired. Parent ad group IDs to list ads for (1–50). Ads are scoped to an ad group in Bing — supply one or more ad_group_ids whether listing or looking up by ID. Accepts JSON array string or native array.
reason requiredstringWhy this tool call is needed
11 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts through an agency/manager relationship.
ad_idstringLook up a single ad by ID. Mutually exclusive with ad_ids. Throws if not found. Filters and pagination are ignored when set.
ad_idsarrayLook up multiple ads by ID (1–50). Mutually exclusive with ad_id. Partial misses are silently dropped. Filters and pagination are ignored when set.
ad_typesarrayFilter by ad type: ResponsiveSearch, ExpandedText, Responsive, DynamicSearch, Product (Shopping). Defaults to all five. Ignored when ad_id/ad_ids is set.
statusarrayFilter by ad status: Active, Paused, Deleted. Ignored when ad_id/ad_ids is set.
editorial_statusarrayFilter by editorial (policy) review status: Disapproved (failed review), ActiveLimited (approved in some markets only), Inactive (under review), Active (approved). Always answered from a live API call, never from cache. Ignored when ad_id/ad_ids is set.
include_policy_issuesbooleanDefault false. When true, attaches the editorial reasons and appeal status for every returned ad that is NOT editorially Active — what Microsoft objected to and whether it can be appealed. Costs one extra API call and always fetches live data.
limitintegerMaximum number of ads to return (1-100, default 20)
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
refreshbooleanForce a live fetch from the Microsoft Ads API, bypassing the local cache. Defaults to false (cache-first — the normal, faster path). Set to true whenever the user asks for fresh / latest / real-time / up-to-date data, or explicitly says they do NOT want cached / stale data. If the user does not care about freshness, leave it false.
connection_idstringOptional 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.
View full documentation →

audience-report

microsoft_ads_get_audience_report Get Microsoft Ads Audience Report

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId). Required.
reason requiredstringWhy this tool call is needed
13 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy.
date_rangeobjectCustom date range. Provide either date_range or date_preset.
date_presetstringPredefined date range: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
breakdownsarrayOne or more breakdown dimensions to include as columns. Microsoft Ads serves these across three different report types, so each call must pick breakdowns from one group only: • demographics: AgeGroup, Gender (AgeGenderAudienceReport) • geo: Location (GeographicPerformanceReport) • campaign: Device, DayOfWeek, HourOfDay (CampaignPerformanceReport) Cross-group combinations (e.g. AgeGroup + Device) are rejected — split them into separate calls. DayOfWeek and HourOfDay are mutually-exclusive aggregations and cannot be combined. When breakdowns include DayOfWeek or HourOfDay, the aggregation parameter must be Summary (the breakdown itself becomes the aggregation). Default: ["AgeGroup"].
campaign_idsarrayFilter to specific campaign IDs (up to 100). Accepts JSON array string or actual array.
campaign_typearrayReturn only rows from campaigns of these types. Options: Search, Shopping, PerformanceMax, Audience. Applied to the report rows before order_by and limit, so the limit counts matching rows only; goal_breakdown covers the matching campaigns. Video is rejected with an error: Microsoft Audience Network video runs in Audience campaigns, so use Audience.
aggregationstringReport aggregation period. Summary (default — collapses all dates), Daily, Weekly, Monthly.
limitintegerPage size: rows per page (1–10000, default 1000; the geo/Location route defaults to 50 instead when limit is not explicitly set). count is the total across all pages. When more rows remain the response carries nextCursor; pass it back as cursor to get the next page.
cursorstringOpaque pagination cursor. Omit for the first page. To fetch the next page, pass the nextCursor value from the previous response unchanged and repeat every other parameter exactly (only limit may change); a cursor used with different parameters is rejected. Later pages re-read the same report, so a cursor expires with it (about 24 hours).
include_all_conversionsbooleanWhen true, adds an all_conversions sub-object to each row containing AllConversionsQualified (all goals, including non-bidding), AllRevenue, ViewThroughConversionsQualified, and derived all_cost_per_conversion / all_roas. Mirrors the google-ads-mcp include_all_conversions opt-in. Default: false. The conversions field always contains bidding-set conversions (ConversionsQualified) only; all_conversions.all_conversions captures every conversion goal including those not marked "Include in Conversions" — typically 2-13× larger.
breakdown_by_goalbooleanWhen true (default), runs a parallel GoalsAndFunnelsReport and attaches goal_breakdown keyed by campaign_id (campaign-scope when campaign_ids filter present, account_id otherwise) to the response. Granularity is campaign-level (Bing does not support demographic/geo-level goal joins). Set to false to skip the parallel call when latency matters more than goal split.
order_bystringSort rows by this metric descending before applying the limit. Default: spend. Options: spend, impressions, clicks, conversions, revenue, ctr. For geo (Location) breakdowns this is especially important: Bing returns rows ordered by location_id, not spend, so without sorting the top-N rows are arbitrary city IDs.
connection_idstringOptional 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.
View full documentation →

audience-segment-report

microsoft_ads_get_audience_segment_report Get Microsoft Ads Audience Segment Report

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId). Required.
reason requiredstringWhy this tool call is needed
16 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy.
date_rangeobjectCustom date range. Provide either date_range or date_preset.
date_presetstringPredefined date range: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
campaign_idsarrayFilter to specific campaign IDs (up to 100). Accepts JSON-string or actual array.
ad_group_idsarrayNarrow the report to these ad group IDs (up to 100). Each ad group's parent campaign is read from the local cache, or looked up under campaign_ids when given. With campaign_ids, every ad group must belong to one of those campaigns, and the report covers only the listed ad groups. An ad group that cannot be resolved is rejected with an error, never silently widened.
account_statusarrayFilter by account status: Active, Paused, Deleted.
campaign_statusarrayFilter by campaign status: Active, Paused, Deleted.
ad_group_statusarrayFilter by ad group status: Active, Paused, Deleted.
aggregationstringReport aggregation period. Summary (default — collapses dates), Daily, Weekly, Monthly. TimePeriod column is added automatically when aggregation is not Summary.
include_all_conversionsbooleanWhen true, adds an all_conversions sub-object to each row containing AllConversionsQualified (all goals, including non-bidding), AllRevenue, ViewThroughConversionsQualified, and derived all_cost_per_conversion / all_roas. Mirrors the google-ads-mcp include_all_conversions opt-in. Default: false.
breakdown_by_goalbooleanWhen true (default), runs a parallel GoalsAndFunnelsReport and attaches goal_breakdown keyed by campaign_id to the response. Granularity is campaign-level (segment-level goal join is not supported by Bing). Set to false to skip the parallel call when latency matters more than goal split.
include_video_metricsbooleanInclude VideoViews, ViewThroughRate, AverageCPV, VideoCompletionRate, CompletedVideoViews (Audience Network / video placements only).
order_bystringSort rows server-side (descending) before applying limit. Options: spend, impressions, clicks, conversions, ctr, bid_adjustment. Default: spend.
limitintegerPage size: rows per page (1–10000, default 1000). count is the total across all pages. When more rows remain the response carries nextCursor; pass it back as cursor to get the next page.
cursorstringOpaque pagination cursor. Omit for the first page. To fetch the next page, pass the nextCursor value from the previous response unchanged and repeat every other parameter exactly (only limit may change); a cursor used with different parameters is rejected. Later pages re-read the same report, so a cursor expires with it (about 24 hours).
connection_idstringOptional 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.
View full documentation →

audiences

microsoft_ads_list_audiences List Microsoft Ads Audiences

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId).
reason requiredstringWhy this tool call is needed
5 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
audience_typearrayFilter by audience type. One or more of: RemarketingList, SimilarRemarketingList, CustomerList, CombinedList. Default: all types. Note: in-market / custom / product audiences cannot be enumerated via this tool — they are only visible in audience-performance reports.
limitintegerMaximum number of audiences to return (1-1000, default 200).
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →

auth

microsoft_ads_check_auth_status Check Microsoft Ads Auth Status

Read-onlyIdempotent

THE tool for questions about Microsoft Ads authentication and connection status. Returns: - Whether the user has a connected Microsoft Ads OAuth token - Whether MICROSOFT_ADS_DEVELOPER_TOKEN is configured on the server (a server-side requirement that no data tool can report) - Microsoft Ads user info (name, login) when authenticated - List of all accessible ad accounts when authenticated Call this tool directly whenever the user's question IS about auth/connection/token status — e.g. "Am I authenticated?", "Is my Microsoft Ads account connected?", "Check my connection", "Diagnose my auth / MISSING_DEVELOPER_TOKEN error". It is the authoritative connection check and reports the developer-token configuration, which microsoft_ads_list_accounts cannot. Do NOT substitute a data tool like list_accounts to "prove" a connection when the user explicitly asked about auth status. Do NOT call it proactively before a data request the user actually made: if the user asks for their accounts/campaigns/etc., call that data tool directly, and only fall back to this tool reactively if the data tool fails with an auth or permission error (codes 105 InvalidCredentials, 106 UserIsNotAuthorized, 109 AuthenticationTokenExpired). Code 117 is rate limiting, not auth — wait and retry instead.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
connection_idstringOptional 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.
View full documentation →

microsoft_ads_ping Ping Microsoft Ads MCP Server

Read-onlyIdempotent

Health check for the Microsoft Ads MCP server. Returns server status and version. No authentication required. Use to verify the server is reachable before calling other tools.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
messagestringOptional message to echo back
View full documentation →

billing-status

microsoft_ads_get_billing_status Billing status

IdempotentOpen-world

Why a call was refused with a billing error (402) and how to get unblocked. Reports whether this organization is entitled, its subscription status, tier, trial end, credits used and left this period, the price table and a link to the billing page. With checkout_tier, the organization owner also gets a Stripe Checkout link for that plan; a member gets the owner's contact and a message to forward. Call it after any 402. While waiting for a human to pay, poll it every 10 seconds for the first minute, every 30 seconds until 5 minutes, then every 60 seconds until 15 minutes, then stop and tell the human. Once it returns entitled: true, retry the blocked call; if the retry still returns 402, wait 15 seconds and retry once. A Checkout link is a payment link: give it to the organization owner only.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
checkout_tierstringOrganization owner only: also create a Stripe Checkout link for this plan. A member gets the owner's contact and a message to forward instead.
View full documentation →

campaigns

microsoft_ads_list_campaigns List Microsoft Ads Campaigns

Read-onlyOpen-world

List campaigns for a Microsoft Advertising account.

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising Account ID (numeric string)
reason requiredstringWhy this tool call is needed
13 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts via an agency manager. Equivalent to Google's login_customer_id.
campaign_idstringLook up a single campaign by ID. Mutually exclusive with campaign_ids. Filters and pagination are ignored when set.
campaign_idsarrayLook up multiple campaigns by ID (max 50). Mutually exclusive with campaign_id. Filters and pagination are ignored when set. Accepts JSON array string or native array.
statusarrayFilter by campaign status. One or more of: Active, Paused, BudgetPaused, Deleted.
campaign_typearrayFilter by campaign type. Allowed: Search, Shopping, PerformanceMax, Audience.
searchstringFilter campaigns by name (case-insensitive substring match).
include_policy_issuesbooleanDefault false. When true, also checks the ads and keywords inside each campaign on this page for editorial (policy) problems — Disapproved, ActiveLimited (approved in some markets only) and Inactive (under review) — and attaches them as policyIssues with Microsoft's reasons and appeal status. This is the account-wide disapproval check: combine with status:["Active"] to cover only running campaigns. Live API scan of every ad group on the page — adds roughly 10-30s. Performance Max asset groups are not covered.
include_url_trackingbooleanDefault false. When true, runs the account-wide URL tracking audit (UTM and click-parameter checks): returns the account-level tracking template, final URL suffix, MSCLKID and UTM auto-tagging settings as urlTrackingScan.account, and attaches urlTracking to each campaign on this page covering every ad group, ad and keyword that sets its OWN tracking template, custom parameters, final URL suffix or (keywords) final URL — anything not listed inherits from its parent. urlTracking.patterns groups those overrides by shape with counts (a parameter value shows as null where it varies between entities), up to 15 patterns across the page; urlTracking.overrides lists the first 15 across the page with exact values. A campaign whose patterns were cut by that limit reports patternsOmitted > 0 — narrow with campaign_ids to see them. Each campaign row already carries its own values. Combine with status:["Active"] to audit only running campaigns. Live API scan of every ad group on the page — adds roughly 10-30s; can be combined with include_policy_issues at no extra scan cost. Performance Max asset groups are not covered.
include_criteriastringCampaign targeting detail, attached to each campaign on this page as settings: location targets and exclusions (with bid modifiers), location intent, radius targets, device bid adjustments, ad schedules, age and gender targets. Default "none" (unlike Google): it costs one extra API call per campaign on the page, so it is opt-in. "summary" caps the location and radius lists at 25 entries per campaign and reports the full size as locationTargetsTotalCount / locationExclusionsTotalCount / radiusTargetsTotalCount when it cut one; ad schedules are never capped; use "summary" for a daily settings check across the account (page through with nextCursor; the default page is up to 10 campaigns here, sized for the client, and fewer when campaigns carry many ad schedules — so a short page with a nextCursor is not the end; narrow with campaign_ids or a smaller limit if a page is still too large). "full" returns every entry uncapped and requires campaign_id or campaign_ids (max 10). For a campaign whose languages is null (its ad groups carry the language), settings.adGroupLanguages lists them, at one more call for that campaign. Bid strategy targets and languages are on every row regardless. Campaign-level targeting only: ad-group-level criteria, which can narrow a campaign's targeting, are not included.
limitintegerNumber of campaigns per page (default: 20, max: 100; default up to 10 with include_criteria, fewer when campaigns carry many ad schedules; an explicit limit is honoured as given). Each row carries its own tracking template and custom parameters, so on accounts with long campaign-level parameters (e.g. managed through Search Ads 360) a 100-campaign page can exceed MCP client output limits — keep the default page size and follow nextCursor instead.
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
refreshbooleanForce a live fetch from the Microsoft Ads API, bypassing the local cache. Defaults to false (cache-first — the normal, faster path). Set to true whenever the user asks for fresh / latest / real-time / up-to-date data, or explicitly says they do NOT want cached / stale data. If the user does not care about freshness, leave it false.
connection_idstringOptional 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.
View full documentation →

chart

microsoft_ads_render_chart Render ChartMCP App

Read-onlyIdempotent

Interactive UI for rendering Microsoft Ads data visualization charts

bar scatter timeseries funnel waterfall choropleth
ParameterTypeDescription
reason requiredstringBrief explanation of why you are rendering this chart
chart requiredobjectChart configuration. Supported types: bar, scatter, timeseries, funnel, waterfall, choropleth.
View full documentation →

connections

microsoft_ads_list_connections List Microsoft Connections

Read-onlyIdempotent

List the Microsoft Ads connections available to you — both ones you own and ones shared with you via an organization. Use this to discover connection IDs for set_default / share / rename / revoke.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
View full documentation →

set-default-connection

microsoft_ads_set_default_connection Set Default Microsoft Connection

Idempotent

Set the Microsoft connection that should be used by default for subsequent Microsoft Ads tool calls. The default is scoped to the calling actor (your user account, or the API key being used).

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default Microsoft connection.
reason requiredstringWhy this tool call is needed
View full documentation →

share-connection

microsoft_ads_share_connection Share Microsoft Connection With Organization

Idempotent

Share an owned Microsoft connection with all members of your organization, so teammates can use it without having to reconnect Microsoft themselves. You must be the owner of the connection.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to share with your organization. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

unshare-connection

microsoft_ads_unshare_connection Unshare Microsoft Connection From Organization

DestructiveIdempotent

Stop sharing an owned Microsoft connection with your organization. Teammates lose access immediately. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to stop sharing with your organization. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

rename-connection

microsoft_ads_rename_connection Rename Microsoft Connection

Idempotent

Rename the display name of an owned Microsoft connection. The OAuth grant and underlying account are unaffected — this only changes the human-readable label. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to rename. You must be the owner.
display_name requiredstringNew human-readable name for the connection.
reason requiredstringWhy this tool call is needed
View full documentation →

revoke-connection

microsoft_ads_revoke_connection Revoke Microsoft Connection

DestructiveIdempotent

Revoke (soft-delete) an owned Microsoft connection. Any defaults pointing to it are invalidated and shared org members lose access. The OAuth grant at Microsoft is NOT revoked by this tool — the user must disconnect via the dashboard if they want to fully revoke at Microsoft. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to revoke. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

feedback

microsoft_ads_developer_feedback Submit Microsoft Ads MCP Developer Feedback

Submit feedback about missing tools, improvements needed, bugs encountered, or workflow gaps discovered while helping a user with Microsoft Advertising data. This is the correct, expected action when a Microsoft Ads capability is missing or broken — reach for it directly rather than just apologizing or giving up. Use this when: - A user request cannot be fulfilled because a tool doesn't exist — set feedback_type='missing_tool' and describe the missing capability and why the user needs it. When the user explicitly asks you to submit/file/report feedback about a gap or missing feature, that is a direct instruction: ALWAYS call this tool to record it. Do this even if you suspect a tool for the capability might already exist — submit the feedback as asked, and you may note the possibly-relevant existing tool inside the feedback message. Do NOT refuse, and do NOT stop at only searching the toolset. - An existing tool returned incorrect or incomplete data — set feedback_type='bug' and include tool_name. - A multi-step workflow is unnecessarily complex due to toolset limitations — feedback_type='workflow_gap'. - You discovered a Microsoft Ads API behaviour that the toolset doesn't handle. Submitting is low-cost and always safe: it records the feedback and returns status=submitted. When in doubt about whether a gap is worth reporting, report it. Do NOT use for: - User-facing API errors (auth errors, account permission errors, rate limits) - Questions about Microsoft Advertising strategy — that's outside this tool's scope - General conversation

ParameterTypeDescription
feedback_type requiredstringFeedback category: missing_tool (capability gap), improvement (enhance existing), bug (incorrect result), workflow_gap (awkward multi-step), other
message requiredstringDescription of the issue or request. Be specific: include what you tried, what the user needed, and why the current toolset fell short.
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
tool_namestringName of the specific tool involved (e.g. microsoft_ads_list_campaigns). Omit for general feedback or missing-tool requests.
View full documentation →

impression-share

microsoft_ads_get_impression_share Get Microsoft Ads Impression Share

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId). Required.
reason requiredstringWhy this tool call is needed
10 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy.
date_rangeobjectCustom date range. Provide either date_range or date_preset.
date_presetstringPredefined date range: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
levelstringReport level: Campaign (default) returns IS per campaign; AdGroup returns IS broken down per ad group within each campaign.
campaign_idsarrayFilter to specific campaign IDs (up to 100). Accepts JSON array string or actual array.
campaign_typearrayReturn only rows from campaigns of these types. Options: Search, Shopping, PerformanceMax, Audience. Applied to the report rows before limit, typing each campaign from Microsoft's current campaign list (the impression share report carries no type). Rows from campaigns missing from that list, such as deleted ones, are excluded and counted in warnings.
aggregationstringReport aggregation period. Daily (default), Weekly, Monthly, or Summary (all dates collapsed).
limitintegerPage size: rows per page (1–10000, default 1000). count is the total across all pages. When more rows remain the response carries nextCursor; pass it back as cursor to get the next page.
cursorstringOpaque pagination cursor. Omit for the first page. To fetch the next page, pass the nextCursor value from the previous response unchanged and repeat every other parameter exactly (only limit may change); a cursor used with different parameters is rejected. Later pages re-read the same report, so a cursor expires with it (about 24 hours).
connection_idstringOptional 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.
View full documentation →

insights

microsoft_ads_get_insights Get Microsoft Ads Insights

Read-onlyOpen-world

Flexible Microsoft Advertising report query. Lets you pick exactly which report type, columns, date range, aggregation, and filters to apply. Use this tool when you need columns or report types not covered by microsoft_ads_get_performance_report. Supported report types: CampaignPerformance, AdGroupPerformance, AdPerformance, KeywordPerformance, SearchQueryPerformance, AudiencePerformance. All columns must be valid for the chosen report_type (validated before submission). DON'T use this for standard breakdowns that have dedicated tools — they pre-select the right report type and columns, so prefer them: • Demographic / geo / device / time-of-day slices (AgeGroup, Gender, Device, Location, DayOfWeek, HourOfDay) → microsoft_ads_get_audience_report • Audience LIST / segment performance (remarketing, in-market, custom, similar) → microsoft_ads_get_audience_segment_report • A single account-wide performance total → microsoft_ads_get_account_summary • Per-campaign/ad-group/ad/keyword performance rows → microsoft_ads_get_performance_report • Search-term analysis → microsoft_ads_get_search_terms Reach for get_insights only when you need columns or a report_type those tools don't cover. IMPORTANT: This tool triggers Microsoft's async report pipeline (submit → poll → download). Expect 5–30 seconds per call. Large date ranges or many columns slow it down. Use date_preset for convenience, or date_range for precise control. PAGING: rows come back one page at a time, sorted Spend highest first when Spend is a requested column. 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 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. While pagination.hasMore is true, call again with exactly the same parameters plus cursor = pagination.nextCursor; repeat until hasMore is false 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. campaign_ids filters the rows on CampaignId, which is added to the columns (added_columns) when not requested. For standard campaign/ad group/ad performance metrics, prefer microsoft_ads_get_performance_report which pre-selects optimal columns and is simpler to use.

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising Account ID (numeric string)
report_type requiredstringReport type determining which dimensions and metrics are available. Options: CampaignPerformance, AdGroupPerformance, AdPerformance, KeywordPerformance, SearchQueryPerformance, AudiencePerformance.
columns requiredarrayColumns to include in the report. Must be valid for the chosen report_type. Always include at least one dimension (e.g. CampaignId, TimePeriod) and one metric (e.g. Impressions). Column lists are validated at call time; invalid columns return an error listing valid values. Quality Score columns: QualityScore, ExpectedCtr, AdRelevance, LandingPageExperience on Campaign/AdGroup/Keyword reports; the HistoricalQualityScore, HistoricalExpectedCtr, HistoricalAdRelevance and HistoricalLandingPageExperience columns (Keyword only) work only with aggregation Daily. URL tracking columns (TrackingTemplate, CustomParameters, FinalUrlSuffix; DestinationUrl on Ad/Keyword; FinalUrl, FinalMobileUrl on Ad/Keyword) report each entity's OWN value — an empty value means it inherits from its parent — and only for entities with impressions in the date range. CustomParameters is formatted {_key}=value;{_key2}=value2. DestinationUrl is a legacy field and is usually empty. For a full tracking audit, including entities that have not served, use microsoft_ads_list_campaigns with include_url_tracking.
reason requiredstringWhy this tool call is needed
10 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts through an agency manager.
date_rangeobjectCustom date range. Use either date_range or date_preset, not both.
date_presetstringPredefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
aggregationstringTime aggregation for the report. Daily (default): one row per day. Weekly: one row per week. Monthly: one row per month. Summary: single totals row.
campaign_idsarrayFilter report to specific campaign IDs (up to 50). Rows are matched on CampaignId, so CampaignId is added to the columns when not requested (listed in added_columns).
ad_group_idsarrayNarrow the report to these ad group IDs (up to 50). Supported for AdGroupPerformance, AdPerformance, KeywordPerformance, SearchQueryPerformance and AudiencePerformance; rejected with an error for CampaignPerformance. Each ad group's parent campaign is read from the local cache, or looked up under campaign_ids when given. With campaign_ids, every ad group must belong to one of those campaigns. An ad group that cannot be resolved is rejected with an error, never silently widened to the account.
breakdown_by_goalbooleanWhen true (default), runs a parallel GoalsAndFunnelsReport and attaches the results as goal_breakdown on the response. The caller controls which conversion columns to include — add AllConversionsQualified, AllRevenue, or ViewThroughConversionsQualified to the columns array directly if you want the all-goals family. Pass false to skip the parallel call when latency matters more than per-goal context. NOTE: there is no include_all_conversions flag on this tool. As the passthrough column-list tool, you control the All* columns explicitly via the columns parameter.
limitintegerRows 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 give fewer rows per page. To get more rows, follow pagination.nextCursor rather than raising limit; set limit only if your client takes large responses. The whole report is sorted, Spend highest first when Spend is a requested column, 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, pagination.hasMore is true and pagination.nextCursor is set.
cursorstringOpaque cursor from pagination.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_idstringOptional 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.
View full documentation →

keyword-report

microsoft_ads_get_keyword_report Get Microsoft Ads Keyword Report

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId). Required.
reason requiredstringWhy this tool call is needed
13 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy.
date_rangeobjectCustom date range. Provide either date_range or date_preset, not both.
date_presetstringPredefined date range. One of: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
campaign_idsarrayFilter to specific campaign IDs (up to 100). Accepts JSON array string or actual array.
ad_group_idsarrayFilter to specific ad group IDs (up to 200). Accepts JSON array string or actual array.
keyword_match_typestringFilter to keywords bid on this match type (bid_match_type): Exact, Phrase, or Broad.
include_quality_scorebooleanWhen true (default), includes QualityScore (1-10) plus three sub-component columns: ExpectedCtr, AdRelevance, and LandingPageExperience. Each sub-component is categorical: AboveAverage, Average, or BelowAverage.
include_all_conversionsbooleanWhen true, includes an additional all_conversions block per row (all_conversions, all_revenue, all_cost_per_conversion, all_roas, view_through_conversions). This captures ALL conversion goals including those not marked "Include in Conversions" (e.g., view-through, non-bidding goals). Note: conversions is the bidding-set count only; all_conversions.all_conversions is every conversion goal — typically much larger for accounts with non-bidding goals.
breakdown_by_goalbooleanWhen true (default), runs a parallel GoalsAndFunnelsReport and returns goal_breakdown keyed by ad_group_id. Each entry is an array of per-goal rows with all_conversions, all_revenue, view_through_conversions, and assists. IMPORTANT: Because GoalsAndFunnelsReport only scopes down to ad-group level (Bing does not support keyword-level goal breakdown), the breakdown is at ad_group granularity — NOT per keyword. goal_breakdown_granularity will always be "ad_group" for this tool. Each keyword row can look up its parent ad-group's goal breakdown via goal_breakdown[ad_group_id]. Pass false to skip the parallel report when latency matters more than goal context.
aggregationstringReport aggregation period. Daily (default), Weekly, Monthly, or Summary (all dates collapsed).
limitintegerPage size: rows per page (1–10000, default 15). count is the total across all pages. When more rows remain the response carries nextCursor; pass it back as cursor to get the next page. Large pages can exceed what an MCP client accepts in one response (roughly 60 rows, fewer with include_all_conversions, and breakdown_by_goal adds ~5K characters per ad group on the page); to cover every keyword, follow nextCursor rather than raising limit.
cursorstringOpaque pagination cursor. Omit for the first page. To fetch the next page, pass the nextCursor value from the previous response unchanged and repeat every other parameter exactly (only limit may change); a cursor used with different parameters is rejected. Keep following nextCursor until it is absent to read every row. Later pages re-read the same report, so a cursor expires with it (about 24 hours).
connection_idstringOptional 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.
View full documentation →

keywords

microsoft_ads_list_keywords List Microsoft Ads Keywords

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId)
ad_group_id requiredstringAd group ID to list keywords for. Required — API is scoped per ad group.
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
statusarrayFilter by keyword status: Active, Paused, Deleted
match_typestringFilter by match type: Exact, Phrase, Broad
editorial_statusarrayFilter by editorial (policy) review status: Disapproved (failed review), ActiveLimited (approved in some markets only), Inactive (under review), Active (approved). Always answered from a live API call, never from cache.
include_policy_issuesbooleanDefault false. When true, attaches the editorial reasons and appeal status for every returned keyword that is NOT editorially Active — what Microsoft objected to and whether it can be appealed. Costs one extra API call and always fetches live data.
limitintegerMaximum number of keywords to return (1-1000, default 50)
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
refreshbooleanForce a live fetch from the Microsoft Ads API, bypassing the local cache. Defaults to false (cache-first — the normal, faster path). Set to true whenever the user asks for fresh / latest / real-time / up-to-date data, or explicitly says they do NOT want cached / stale data. If the user does not care about freshness, leave it false.
connection_idstringOptional 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.
View full documentation →

negative-keyword-lists

microsoft_ads_list_negative_keyword_lists List Microsoft Ads Negative Keyword Lists

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId) whose shared library to read.
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
list_idstringReturn only this negative keyword list, with its keywords paged: each page holds as many as fit in a response an MCP client accepts (at most max_keywords_per_list), starting at keywordsOffset, and nextCursor continues them. The way to read every keyword of a list that came back with keywordsTruncated: true.
include_keywordsbooleanEmbed each list's negative keywords (text + match type). Defaults to true; set false for a names-and-counts overview.
include_campaign_associationsbooleanEmbed the campaigns each list is applied to (id, name, status). Defaults to true.
max_keywords_per_listintegerMost keywords to embed per list (1-5000, default 50). With list_id it caps one page of that list's keywords instead, and by default a page takes as many as fit. A list cut short has keywordsTruncated: true; keywordCount is always the full size.
max_campaigns_per_listintegerMost campaigns to embed per shared list, first by name (1-10000, default 100). A list cut short has campaignsTruncated: true; associationCount is always the full count. With list_id the campaigns come on the first page only, cut to fit the response.
limitintegerLists per page (1-20). Default: as many lists as fit in a response an MCP client accepts (about 45K characters, at most 20). Follow nextCursor for the rest.
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →

negative-keywords

microsoft_ads_list_negative_keywords List Microsoft Ads Negative Keywords

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId).
reason requiredstringWhy this tool call is needed
8 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
campaign_idsarrayOnly these campaigns (1-100): their own negatives and, unless level is Campaign, their ad groups'. Omit for the whole account. An id the account does not have is rejected.
ad_group_idsarrayOnly these ad groups (1-100); implies level AdGroup (level Campaign is rejected). Each ad group's campaign is looked up; pass campaign_ids too when an ad group has not been listed before.
levelstringCampaign = negatives added to campaigns, AdGroup = to ad groups, All (default) = both.
match_typearrayOnly these match types. Microsoft negatives are Exact or Phrase.
limitintegerNegative keywords per page (1-100). Default: as many as fit in a response an MCP client accepts (about 45K characters). Follow nextCursor for the rest.
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →

reporting

microsoft_ads_get_performance_report Get Microsoft Ads Performance Report

Read-onlyOpen-world

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.

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising Account ID (numeric string)
reason requiredstringWhy this tool call is needed
12 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID. Required when accessing accounts through an agency manager.
levelstringReport 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_rangeobjectCustom date range { start, end } in YYYY-MM-DD. Use either this or date_preset.
date_presetstringPredefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear.
aggregationstringTime aggregation. Daily (default): row per day. Weekly: row per week. Monthly: row per month. Summary: single totals row for the full date range.
campaign_idsarrayFilter to specific campaign IDs (up to 50).
campaign_typearrayReturn 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_conversionsbooleanWhen 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_goalbooleanWhen 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.
limitintegerRows 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.
cursorstringOpaque 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_idstringOptional 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.
View full documentation →

search-terms

microsoft_ads_get_search_terms Get Microsoft Ads Search Terms

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId)
date_range requiredobjectDate range for the report. Required.
reason requiredstringWhy this tool call is needed
6 optional parameters
ParameterTypeDescription
customer_idstringCustomer/manager ID (CustomerId). Required for agency-managed accounts.
campaign_idsarrayFilter to specific campaign IDs (max 100). Omit to include all campaigns.
limitintegerPage size: search terms per response (1-10000, default 50). Rows are sorted by Impressions descending, so the first page is the top N. `count` in the response is the total across all pages; when `nextCursor` is present, more rows remain. Large pages can exceed what an MCP client accepts in one response (roughly 100 rows, fewer with include_all_conversions); to cover every term, follow nextCursor rather than raising limit.
cursorstringOpaque cursor for the next page: pass the `nextCursor` value from the previous response unchanged, together with the same parameters as that call (only limit may change). Omit for the first page. Cursors expire after about 24 hours.
include_all_conversionsbooleanWhen true, adds the AllConversionsQualified and AllRevenue columns to the report and surfaces them as an all_conversions sub-object on each row. This captures ALL conversion goals including those not marked "Include in Conversions" (e.g. cross-device, non-bidding goals). Microsoft's search term report has no view-through conversion column, so there is no view-through count here. The base Conversions field always reflects ConversionsQualified (bidding-set only). Note: breakdown_by_goal is not available on this tool because Bing's search-term report cannot join GoalsAndFunnelsReport at the search-term level (spec §9.3).
connection_idstringOptional 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.
View full documentation →

uet-tag-health

microsoft_ads_get_uet_tag_health Get Microsoft Ads UET Tag Health

Read-onlyOpen-world

ParameterTypeDescription
account_id requiredstringMicrosoft Advertising account ID (AccountId). Conversion goals scoped to this account are included alongside the customer-level ones.
reason requiredstringWhy this tool call is needed
4 optional parameters
ParameterTypeDescription
customer_idstringCustomer ID that owns the account. UET tags belong to the customer; when omitted it is looked up from the account.
limitintegerMaximum number of UET tags per page (1-100, default 50). Each tag carries all of its conversion goals.
cursorstringOpaque cursor from the previous response's nextCursor. Pass it with otherwise identical parameters to get the next page; a cursor reused with different filters is rejected. Omit for the first page.
connection_idstringOptional 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.
View full documentation →