Install
openclaw skills install @jeannen/microsoft-adsRead and change Microsoft Advertising (Bing Ads) campaigns from an AI agent through the AdKit MCP connector, using the official Microsoft Advertising API v13. Every change is saved as a draft that the user approves before it goes live. Use when the user wants to run, change, or check Microsoft or Bing ads. Not for Microsoft Ads strategy or ad copy advice.
openclaw skills install @jeannen/microsoft-adsThis skill tells you how to read and change Microsoft Advertising (Bing Ads) campaigns through AdKit. It covers the steps, not the strategy.
AdKit connects Microsoft Advertising accounts and sends your requests to the official Microsoft Advertising API v13. AdKit has no campaigns, ad-groups, or ads entities for Microsoft yet, so you write Microsoft API requests directly.
AdKit is one MCP connector for Meta, Google, TikTok, LinkedIn, Microsoft, Reddit, X, and Pinterest ads.
https://mcp.adkit.so, then sign in.claude mcp add --transport http adkit https://mcp.adkit.soFor other AI apps, see how to set up the AdKit MCP server for Microsoft Ads. If the AdKit tools are not available, tell the user how to connect. Then stop.
The user must also turn on Advanced Platform Access in AdKit's Agent Permissions. Without it, the requests below fail.
accounts list, available, connect, disconnect.POST requests to .../Query... paths) run immediately, with no draft. Writes save a draft.In this skill, accounts connect means an adkit_manage call with entity: "accounts" and action: "connect".
adkit_projects and get the projectId. Every call needs it.adkit_status. If no Microsoft account is connected, call adkit_setup with platform: "microsoft" and give the user the link. After they sign in, use adkit_manage with platform: "microsoft": accounts available, then accounts connect.adkit_manage with entity: "drafts", action: "get", or give the user the link https://app.adkit.so/manage/drafts?open=<draftId>. Show them what will change.drafts publish, only after the user says yes.To build a new campaign, go from the top down: campaign, then ad group, then ads and keywords. Publish each level before you create the next one, and use the ID that Microsoft returns as the parent. A draft ID never works as a parent ID.
Every request is one adkit_manage call:
{
"projectId": "<projectId>",
"entity": "platform-api-request",
"action": "mutate",
"data": {
"platform": "microsoft",
"accountId": "<accountId>",
"endpoint": "https://campaign.api.bingads.microsoft.com/CampaignManagement/v13/Campaigns/QueryByAccountId",
"method": "POST",
"payload": { "AccountId": "<accountId>", "CampaignType": "Search" },
"description": "List Search campaigns"
}
}
endpoint is the full https URL. Microsoft spreads its API across several hosts (campaign, reporting, bulk, and others under .api.bingads.microsoft.com), so there is no short path.POST to .../Campaigns adds.PUT updates.DELETE with a JSON body of IDs deletes.POST requests to .../Query... paths.CampaignType is optional. Without it, Microsoft returns Search campaigns only.action is always mutate, also for reads.description is required. The user sees it when they review the draft.Only the data part changes. These follow the Microsoft Advertising API v13 reference.
Pause a campaign. Status is Active or Paused.
{
"platform": "microsoft",
"accountId": "<accountId>",
"endpoint": "https://campaign.api.bingads.microsoft.com/CampaignManagement/v13/Campaigns",
"method": "PUT",
"payload": {
"AccountId": "<accountId>",
"Campaigns": [{ "Id": "<campaignId>", "Status": "Paused" }]
},
"description": "Pause campaign <campaignId>"
}
Status. Microsoft also pauses a campaign when its budget runs out.adkit_feedback.The same AdKit connector runs Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Reddit Ads, X Ads, and Pinterest Ads ads. Each platform has its own skill in this repo, for example meta-ads and google-ads.