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
THE tool for an account-level PERFORMANCE SUMMARY — one rolled-up total for a whole Microsoft
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising AccountId to report on. |
reason required | string | Why this tool call is needed |
6 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Microsoft Advertising CustomerId (agency/manager). Required when accessing accounts managed under a customer hierarchy. |
date_range | object | Custom date range. Mutually exclusive with date_preset. If neither is provided, defaults to the last 30 days. |
date_preset | string | Predefined date range. Mutually exclusive with date_range. If neither is provided, defaults to the last 30 days. |
include_all_conversions | boolean | When 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_goal | boolean | When 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_id | string | 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. |
activities
microsoft_ads_get_activities Get Microsoft Ads Change History
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising Account ID (numeric string). |
reason required | string | Why this tool call is needed |
9 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer (manager) ID. Optional: only used to check access to an agency-managed account. |
start_date | string | Start of the window, YYYY-MM-DD (UTC). Defaults to 7 days before end_date. |
end_date | string | End of the window, YYYY-MM-DD (UTC), inclusive. Defaults to today. |
item_types | array | Only these kinds of change. Keyword includes negative keyword lists and product groups; Extension includes sitelinks, callouts and other ad extensions. |
entity_ids | array | Only changes to these entity IDs (campaign, ad group, ad, keyword…). |
limit | integer | Changes per page (1-200, default 50). |
cursor | string | nextCursor from the previous response. Pass it with otherwise identical parameters for the next page. |
refresh | boolean | Re-read the account from Microsoft before answering. Normally not needed: it is re-read when the last read is over an hour old. |
connection_id | string | 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. |
accounts
microsoft_ads_list_accounts List Microsoft Ads Accounts
List Microsoft Advertising accounts accessible to the authenticated user, or look up one
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
8 optional parameters
| Parameter | Type | Description |
|---|---|---|
account_id | string | Look 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_id | string | Microsoft Advertising CustomerId of the agency/manager account. Required when accessing accounts managed under a customer hierarchy. Equivalent to Google Ads login_customer_id. |
status | array | Filter accounts by status. Accepts a JSON array or repeated values. |
search | string | Case-insensitive partial match on account name or account_id. |
limit | integer | Number of accounts per page (default: 20, max: 100). |
cursor | string | Opaque 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. |
refresh | boolean | Force 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_id | string | 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. |
customers
microsoft_ads_list_customers List Microsoft Ads Customers
List all Microsoft Advertising customers (manager/agency accounts) accessible to the authenticated user.
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
5 optional parameters
| Parameter | Type | Description |
|---|---|---|
search | string | Case-insensitive partial match on customer name or customer_id. |
status | string | Filter customers by status. |
limit | integer | Number of customers per page (default: 20, max: 100). |
cursor | string | Opaque 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_id | string | 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. |
ad-extensions
microsoft_ads_list_ad_extensions List Microsoft Ads Ad Extensions
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). |
reason required | string | Why this tool call is needed |
9 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
campaign_ids | array | Only 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_levels | array | Which 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_types | array | Only these extension types, e.g. ["Sitelink", "Callout", "StructuredSnippet"]. Default: every type. |
editorial_status | array | Only 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_raw | boolean | Default 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. |
limit | integer | Rows per page (1-500, default 50). |
cursor | string | Opaque 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_id | string | 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. |
ad-groups
microsoft_ads_list_ad_groups List Microsoft Ads Ad Groups
List ad groups across one or more Microsoft Ads campaigns.
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (numeric string). |
campaign_ids required | array | Required. 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 required | string | Why this tool call is needed |
9 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID. Required for managed accounts. |
ad_group_id | string | Look 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_ids | array | Look up multiple ad groups by ID (max 100). Mutually exclusive with ad_group_id. Filters and pagination are ignored when set. |
status | array | Filter by ad group status. One or more of: Active, Paused, Deleted, Expired. |
search | string | Filter ad groups by name (case-insensitive substring match). |
limit | integer | Number of ad groups per page (default: 20, max: 100). |
cursor | string | Opaque 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. |
refresh | boolean | Force 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_id | string | 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. |
ads
microsoft_ads_list_ads List Microsoft Ads
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId) |
ad_group_ids required | array | Required. 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 required | string | Why this tool call is needed |
11 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts through an agency/manager relationship. |
ad_id | string | Look up a single ad by ID. Mutually exclusive with ad_ids. Throws if not found. Filters and pagination are ignored when set. |
ad_ids | array | Look 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_types | array | Filter by ad type: ResponsiveSearch, ExpandedText, Responsive, DynamicSearch, Product (Shopping). Defaults to all five. Ignored when ad_id/ad_ids is set. |
status | array | Filter by ad status: Active, Paused, Deleted. Ignored when ad_id/ad_ids is set. |
editorial_status | array | Filter 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_issues | boolean | Default 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. |
limit | integer | Maximum number of ads to return (1-100, default 20) |
cursor | string | Opaque 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. |
refresh | boolean | Force 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_id | string | 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. |
audience-report
microsoft_ads_get_audience_report Get Microsoft Ads Audience Report
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). Required. |
reason required | string | Why this tool call is needed |
13 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy. |
date_range | object | Custom date range. Provide either date_range or date_preset. |
date_preset | string | Predefined date range: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
breakdowns | array | One 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_ids | array | Filter to specific campaign IDs (up to 100). Accepts JSON array string or actual array. |
campaign_type | array | Return 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. |
aggregation | string | Report aggregation period. Summary (default — collapses all dates), Daily, Weekly, Monthly. |
limit | integer | Page 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. |
cursor | string | Opaque 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_conversions | boolean | When 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_goal | boolean | When 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_by | string | Sort 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_id | string | 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. |
audience-segment-report
microsoft_ads_get_audience_segment_report Get Microsoft Ads Audience Segment Report
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). Required. |
reason required | string | Why this tool call is needed |
16 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy. |
date_range | object | Custom date range. Provide either date_range or date_preset. |
date_preset | string | Predefined date range: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
campaign_ids | array | Filter to specific campaign IDs (up to 100). Accepts JSON-string or actual array. |
ad_group_ids | array | Narrow 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_status | array | Filter by account status: Active, Paused, Deleted. |
campaign_status | array | Filter by campaign status: Active, Paused, Deleted. |
ad_group_status | array | Filter by ad group status: Active, Paused, Deleted. |
aggregation | string | Report aggregation period. Summary (default — collapses dates), Daily, Weekly, Monthly. TimePeriod column is added automatically when aggregation is not Summary. |
include_all_conversions | boolean | When 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_goal | boolean | When 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_metrics | boolean | Include VideoViews, ViewThroughRate, AverageCPV, VideoCompletionRate, CompletedVideoViews (Audience Network / video placements only). |
order_by | string | Sort rows server-side (descending) before applying limit. Options: spend, impressions, clicks, conversions, ctr, bid_adjustment. Default: spend. |
limit | integer | Page 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. |
cursor | string | Opaque 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_id | string | 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. |
audiences
microsoft_ads_list_audiences List Microsoft Ads Audiences
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). |
reason required | string | Why this tool call is needed |
5 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
audience_type | array | Filter 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. |
limit | integer | Maximum number of audiences to return (1-1000, default 200). |
cursor | string | Opaque 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_id | string | 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. |
auth
microsoft_ads_check_auth_status Check Microsoft Ads Auth Status
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.
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
1 optional parameter
| Parameter | Type | Description |
|---|---|---|
connection_id | string | 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. |
microsoft_ads_ping Ping Microsoft Ads MCP Server
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.
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
1 optional parameter
| Parameter | Type | Description |
|---|---|---|
message | string | Optional message to echo back |
billing-status
microsoft_ads_get_billing_status Billing status
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.
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
1 optional parameter
| Parameter | Type | Description |
|---|---|---|
checkout_tier | string | Organization owner only: also create a Stripe Checkout link for this plan. A member gets the owner's contact and a message to forward instead. |
campaigns
microsoft_ads_list_campaigns List Microsoft Ads Campaigns
List campaigns for a Microsoft Advertising account.
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising Account ID (numeric string) |
reason required | string | Why this tool call is needed |
13 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts via an agency manager. Equivalent to Google's login_customer_id. |
campaign_id | string | Look up a single campaign by ID. Mutually exclusive with campaign_ids. Filters and pagination are ignored when set. |
campaign_ids | array | Look 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. |
status | array | Filter by campaign status. One or more of: Active, Paused, BudgetPaused, Deleted. |
campaign_type | array | Filter by campaign type. Allowed: Search, Shopping, PerformanceMax, Audience. |
search | string | Filter campaigns by name (case-insensitive substring match). |
include_policy_issues | boolean | Default 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_tracking | boolean | Default 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_criteria | string | Campaign 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. |
limit | integer | Number 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. |
cursor | string | Opaque 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. |
refresh | boolean | Force 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_id | string | 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. |
chart
microsoft_ads_render_chart Render ChartMCP App
Interactive UI for rendering Microsoft Ads data visualization charts
bar scatter timeseries funnel waterfall choropleth| Parameter | Type | Description |
|---|---|---|
reason required | string | Brief explanation of why you are rendering this chart |
chart required | object | Chart configuration. Supported types: bar, scatter, timeseries, funnel, waterfall, choropleth. |
connections
microsoft_ads_list_connections List Microsoft Connections
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.
| Parameter | Type | Description |
|---|---|---|
reason required | string | Why this tool call is needed |
set-default-connection
microsoft_ads_set_default_connection Set Default Microsoft Connection
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).
| Parameter | Type | Description |
|---|---|---|
connection_id required | string | UUID of the connection to mark as the actor's default Microsoft connection. |
reason required | string | Why this tool call is needed |
share-connection
unshare-connection
rename-connection
microsoft_ads_rename_connection Rename Microsoft Connection
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.
| Parameter | Type | Description |
|---|---|---|
connection_id required | string | UUID of the connection to rename. You must be the owner. |
display_name required | string | New human-readable name for the connection. |
reason required | string | Why this tool call is needed |
revoke-connection
microsoft_ads_revoke_connection Revoke Microsoft Connection
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.
| Parameter | Type | Description |
|---|---|---|
connection_id required | string | UUID of the connection to revoke. You must be the owner. |
reason required | string | Why this tool call is needed |
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
| Parameter | Type | Description |
|---|---|---|
feedback_type required | string | Feedback category: missing_tool (capability gap), improvement (enhance existing), bug (incorrect result), workflow_gap (awkward multi-step), other |
message required | string | Description of the issue or request. Be specific: include what you tried, what the user needed, and why the current toolset fell short. |
reason required | string | Why this tool call is needed |
1 optional parameter
| Parameter | Type | Description |
|---|---|---|
tool_name | string | Name of the specific tool involved (e.g. microsoft_ads_list_campaigns). Omit for general feedback or missing-tool requests. |
impression-share
insights
microsoft_ads_get_insights Get Microsoft Ads Insights
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.
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising Account ID (numeric string) |
report_type required | string | Report type determining which dimensions and metrics are available. Options: CampaignPerformance, AdGroupPerformance, AdPerformance, KeywordPerformance, SearchQueryPerformance, AudiencePerformance. |
columns required | array | Columns 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 required | string | Why this tool call is needed |
10 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts through an agency manager. |
date_range | object | Custom date range. Use either date_range or date_preset, not both. |
date_preset | string | Predefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
aggregation | string | Time 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_ids | array | Filter 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_ids | array | Narrow 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_goal | boolean | When 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. |
limit | integer | 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 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. |
cursor | string | Opaque 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_id | string | 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. |
keyword-report
microsoft_ads_get_keyword_report Get Microsoft Ads Keyword Report
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). Required. |
reason required | string | Why this tool call is needed |
13 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required when accessing accounts under a manager hierarchy. |
date_range | object | Custom date range. Provide either date_range or date_preset, not both. |
date_preset | string | Predefined date range. One of: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
campaign_ids | array | Filter to specific campaign IDs (up to 100). Accepts JSON array string or actual array. |
ad_group_ids | array | Filter to specific ad group IDs (up to 200). Accepts JSON array string or actual array. |
keyword_match_type | string | Filter to keywords bid on this match type (bid_match_type): Exact, Phrase, or Broad. |
include_quality_score | boolean | When 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_conversions | boolean | When 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_goal | boolean | When 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. |
aggregation | string | Report aggregation period. Daily (default), Weekly, Monthly, or Summary (all dates collapsed). |
limit | integer | Page 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. |
cursor | string | Opaque 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_id | string | 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. |
keywords
microsoft_ads_list_keywords List Microsoft Ads Keywords
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId) |
ad_group_id required | string | Ad group ID to list keywords for. Required — API is scoped per ad group. |
reason required | string | Why this tool call is needed |
9 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
status | array | Filter by keyword status: Active, Paused, Deleted |
match_type | string | Filter by match type: Exact, Phrase, Broad |
editorial_status | array | Filter 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_issues | boolean | Default 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. |
limit | integer | Maximum number of keywords to return (1-1000, default 50) |
cursor | string | Opaque 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. |
refresh | boolean | Force 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_id | string | 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. |
negative-keyword-lists
microsoft_ads_list_negative_keyword_lists List Microsoft Ads Negative Keyword Lists
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId) whose shared library to read. |
reason required | string | Why this tool call is needed |
9 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
list_id | string | Return 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_keywords | boolean | Embed each list's negative keywords (text + match type). Defaults to true; set false for a names-and-counts overview. |
include_campaign_associations | boolean | Embed the campaigns each list is applied to (id, name, status). Defaults to true. |
max_keywords_per_list | integer | Most 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_list | integer | Most 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. |
limit | integer | Lists 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. |
cursor | string | Opaque 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_id | string | 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. |
negative-keywords
microsoft_ads_list_negative_keywords List Microsoft Ads Negative Keywords
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). |
reason required | string | Why this tool call is needed |
8 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
campaign_ids | array | Only 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_ids | array | Only 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. |
level | string | Campaign = negatives added to campaigns, AdGroup = to ad groups, All (default) = both. |
match_type | array | Only these match types. Microsoft negatives are Exact or Phrase. |
limit | integer | Negative 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. |
cursor | string | Opaque 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_id | string | 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. |
reporting
microsoft_ads_get_performance_report Get Microsoft Ads Performance Report
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.
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising Account ID (numeric string) |
reason required | string | Why this tool call is needed |
12 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID. Required when accessing accounts through an agency manager. |
level | string | 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 | Custom date range { start, end } in YYYY-MM-DD. Use either this or date_preset. |
date_preset | string | Predefined date range. Options: Today, Yesterday, LastSevenDays, ThisWeek, LastWeek, LastFourWeeks, ThisMonth, LastMonth, LastThreeMonths, LastSixMonths, ThisYear, LastYear. |
aggregation | string | 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 | Filter to specific campaign IDs (up to 50). |
campaign_type | array | 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 | 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 | 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 | 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 | 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 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. |
search-terms
microsoft_ads_get_search_terms Get Microsoft Ads Search Terms
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId) |
date_range required | object | Date range for the report. Required. |
reason required | string | Why this tool call is needed |
6 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer/manager ID (CustomerId). Required for agency-managed accounts. |
campaign_ids | array | Filter to specific campaign IDs (max 100). Omit to include all campaigns. |
limit | integer | Page 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. |
cursor | string | Opaque 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_conversions | boolean | When 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_id | string | 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. |
uet-tag-health
microsoft_ads_get_uet_tag_health Get Microsoft Ads UET Tag Health
| Parameter | Type | Description |
|---|---|---|
account_id required | string | Microsoft Advertising account ID (AccountId). Conversion goals scoped to this account are included alongside the customer-level ones. |
reason required | string | Why this tool call is needed |
4 optional parameters
| Parameter | Type | Description |
|---|---|---|
customer_id | string | Customer ID that owns the account. UET tags belong to the customer; when omitted it is looked up from the account. |
limit | integer | Maximum number of UET tags per page (1-100, default 50). Each tag carries all of its conversion goals. |
cursor | string | Opaque 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_id | string | 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. |