← Back to Clawdbot Tools
Clawdbot Tools by @duartemartins

microsoft-ads-mcp

Create and manage Microsoft Advertising campaigns

0
Source Code

Microsoft Ads MCP Server

Create and manage Microsoft Advertising campaigns programmatically. This MCP server enables full campaign management for Bing and DuckDuckGo search ads.

Why Microsoft Advertising?

  • DuckDuckGo Integration - Microsoft Advertising powers DDG search ads, reaching privacy-conscious users
  • Lower CPCs - Often 30-50% cheaper than Google Ads
  • Bing + Yahoo + AOL - Access to the full Microsoft Search Network
  • Import from Google - Easy migration of existing campaigns

Setup

1. Install the MCP server

git clone https://github.com/Duartemartins/microsoft-ads-mcp-server.git
cd microsoft-ads-mcp-server
pip install -r requirements.txt

2. Get credentials

  1. Microsoft Ads Account: Sign up at ads.microsoft.com
  2. Developer Token: Apply at developers.ads.microsoft.com
  3. Azure AD App: Create at portal.azure.com with redirect URI https://login.microsoftonline.com/common/oauth2/nativeclient

3. Configure mcporter

Add to ~/.mcporter/mcporter.json:

{
  "mcpServers": {
    "microsoft-ads": {
      "command": "python3",
      "args": ["/path/to/microsoft-ads-mcp-server/server.py"],
      "type": "stdio",
      "env": {
        "MICROSOFT_ADS_DEVELOPER_TOKEN": "your_token",
        "MICROSOFT_ADS_CLIENT_ID": "your_azure_app_client_id"
      }
    }
  }
}

4. Authenticate

mcporter call microsoft-ads.get_auth_url
# Open URL in browser, sign in, copy redirect URL
mcporter call microsoft-ads.complete_auth '{"redirect_url": "https://login.microsoftonline.com/common/oauth2/nativeclient?code=..."}'

Available Tools

Account Management

mcporter call microsoft-ads.search_accounts

Campaign Operations

# List campaigns
mcporter call microsoft-ads.get_campaigns

# Create campaign (starts paused for safety)
mcporter call microsoft-ads.create_campaign '{"name": "My Campaign", "daily_budget": 20}'

# Activate or pause
mcporter call microsoft-ads.update_campaign_status '{"campaign_id": 123456, "status": "Active"}'

Ad Groups

# List ad groups
mcporter call microsoft-ads.get_ad_groups '{"campaign_id": 123456}'

# Create ad group
mcporter call microsoft-ads.create_ad_group '{"campaign_id": 123456, "name": "Product Keywords", "cpc_bid": 1.50}'

Keywords

# List keywords
mcporter call microsoft-ads.get_keywords '{"ad_group_id": 789012}'

# Add keywords (Broad, Phrase, or Exact match)
mcporter call microsoft-ads.add_keywords '{"ad_group_id": 789012, "keywords": "buy widgets, widget store", "match_type": "Phrase", "default_bid": 1.25}'

Ads

# List ads
mcporter call microsoft-ads.get_ads '{"ad_group_id": 789012}'

# Create Responsive Search Ad
mcporter call microsoft-ads.create_responsive_search_ad '{
  "ad_group_id": 789012,
  "final_url": "https://example.com/widgets",
  "headlines": "Buy Widgets Online|Best Widget Store|Free Shipping",
  "descriptions": "Shop our selection. Free shipping over $50.|Quality widgets at great prices."
}'

Reporting

# Submit report request
mcporter call microsoft-ads.submit_campaign_performance_report '{"date_range": "LastWeek"}'
mcporter call microsoft-ads.submit_keyword_performance_report '{"date_range": "LastMonth"}'
mcporter call microsoft-ads.submit_search_query_report '{"date_range": "LastWeek"}'
mcporter call microsoft-ads.submit_geographic_report '{"date_range": "LastMonth"}'

# Check status and get download URL
mcporter call microsoft-ads.poll_report_status

Other

mcporter call microsoft-ads.get_budgets
mcporter call microsoft-ads.get_labels

Complete Workflow Example

# 1. Check account
mcporter call microsoft-ads.search_accounts

# 2. Create campaign
mcporter call microsoft-ads.create_campaign '{"name": "PopaDex - DDG Search", "daily_budget": 15}'
# Returns: Campaign ID 123456

# 3. Create ad group
mcporter call microsoft-ads.create_ad_group '{"campaign_id": 123456, "name": "Privacy Keywords", "cpc_bid": 0.75}'
# Returns: Ad Group ID 789012

# 4. Add keywords
mcporter call microsoft-ads.add_keywords '{
  "ad_group_id": 789012,
  "keywords": "privacy search engine, private browsing, anonymous search",
  "match_type": "Phrase",
  "default_bid": 0.60
}'

# 5. Create ad
mcporter call microsoft-ads.create_responsive_search_ad '{
  "ad_group_id": 789012,
  "final_url": "https://popadex.com",
  "headlines": "PopaDex Private Search|Search Without Tracking|Privacy-First Search Engine",
  "descriptions": "Search the web without being tracked. No ads, no profiling.|Your searches stay private. Try PopaDex today."
}'

# 6. Activate campaign
mcporter call microsoft-ads.update_campaign_status '{"campaign_id": 123456, "status": "Active"}'

# 7. Check performance after a few days
mcporter call microsoft-ads.submit_campaign_performance_report '{"date_range": "LastWeek"}'
mcporter call microsoft-ads.poll_report_status

Match Types

Type Syntax Triggers
Broad keyword Related searches, synonyms
Phrase "keyword" Contains phrase in order
Exact [keyword] Exact match only

Report Columns

Campaign Reports: CampaignName, Impressions, Clicks, Ctr, AverageCpc, Spend, Conversions, Revenue

Keyword Reports: Keyword, AdGroupName, CampaignName, Impressions, Clicks, Ctr, AverageCpc, Spend, Conversions, QualityScore

Search Query Reports: SearchQuery, Keyword, CampaignName, Impressions, Clicks, Spend, Conversions

Geographic Reports: Country, State, City, CampaignName, Impressions, Clicks, Spend, Conversions

Tips

  1. Start paused - Campaigns are created paused by default. Review before activating.
  2. Use Phrase match - Good balance between reach and relevance for most keywords.
  3. Multiple headlines - RSAs need 3-15 headlines (30 chars each) and 2-4 descriptions (90 chars each).
  4. Check search queries - Review actual search terms to find negative keywords.
  5. Geographic targeting - Use geo reports to optimize by location.

Credits

MCP Server: github.com/Duartemartins/microsoft-ads-mcp-server

Built with FastMCP and the Bing Ads Python SDK