Full-featured campaign management and reporting via Bing Ads API
Server has 9 tools with basic verb-noun naming (get_, create_, update_, search_). All tools have descriptions (10-150 chars, mostly adequate). However, input schemas are present but minimal: most parameters lack detailed descriptions, enums are absent where needed (e.g., status in update_campaign_status accepts free-form 'Active'/'Paused' without enum constraint), and output schemas are completely undocumented. Error handling returns generic error strings without recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Descriptions are functional but terse (avg ~80 chars vs. production baseline 194 chars). Parameters like 'status' and 'include_deleted' lack constraint documentation. No pagination support despite potential for large result sets (e.g., get_campaigns, get_ad_groups, get_keywords). Responses are free-text strings rather than structured JSON, forcing LLM parsing.
Complete OAuth with the redirect URL from browser.
Create an ad group in a campaign.
Create a new search campaign (paused by default for safety).
Get all ad groups in a campaign.
Get OAuth URL. Open in browser, sign in, then use complete_auth with the redirect URL.
Get all campaigns in the account.
Get all keywords in an ad group.
Output schemas completely undocumented. All tools return free-text strings instead of structured JSON. LLMs cannot parse results reliably or chain tools without manual extraction.
No enum constraints on status parameters. update_campaign_status accepts 'status' as free-form string; should declare enum: ['Active', 'Paused']. Invites hallucinated invalid values.
Parameter descriptions are minimal or missing. 'include_deleted' has description but lacks context on default behavior. 'campaign_id', 'ad_group_id' lack type hints (integer vs string ambiguity).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
List all Microsoft Advertising accounts accessible to the authenticated user.
Update campaign status.
No pagination support. get_campaigns, get_ad_groups, get_keywords return all results as unstructured text. Large accounts could return hundreds of items, exhausting context window.
Error handling returns generic error strings without recovery guidance. 'Error: {str(e)}' gives LLM no actionable next step. Should categorize errors and suggest alternatives.