1.3.0 (2026-09-04)
1.2.0 (2026-09-03)
- correct REST mutation URLs that 404ed on all three write tools (#8) (ca43dd4)
- reports: campaign_ids filter was silently ignored (#10) (ac0b4ba)
- zero-row reports (Success with no ReportDownloadUrl) hang until timeout (#6) (e4bb325)
1.1.1 (2026-07-09)
- budget validation, GAQL mutation blocking, future date checks, limit caps (da8d128)
- critical: require account_id on write operations (59a072e)
- critical: use TimeoutStrategy.Aggressive to actually abort hung requests (db52390)
- drop unused file:../mcp-updatenotifier dependency (#3) (fc4a84c)
- error server prefix, isError consistency, validateCredentials, CHANGELOG (6c07766)
- error size limits, safeResponse mutation, budget docs, CHANGELOG, security warnings (48f1a23)
- ID validation, path resolution, health tools, descriptions (15c7392)
- Node 18.18 minimum, env var trimming, unhandledRejection, TTY guard (9c3433f)
- README accuracy, env var docs, dependency cleanup (440f2ff)
- resolve import and export issues from cascade failure (39d4003)
- startup checks, credential redaction, schema hardening, format validation (eed8c3b)
- stderr logging, Linux/Docker compat, SIGPIPE, version fallback (60add35)
- version field, safeResponse loop, auth retry, SIGTERM handling (26e5811)
- Read-only by default: mutating tools (
bing_ads_pause_keywords,bing_ads_update_campaign_budget,bing_ads_add_shared_negatives) are now hidden from the tool list and refused at call time unlessBING_ADS_MCP_WRITE=trueis set in the server environment. - New
writeGate.tsmodule withisWriteTool,isWriteEnabled,filterTools,assertWriteAllowed, andWRITE_TOOLSset. - Startup log line reports current write-mode status.
- Drift-alarm test asserts every registered tool in
tools.tsis classified as either a write or a read tool, so adding a new tool without classifying it fails CI.
- Foot-gun mitigation: prevents casual write actions (pausing keywords, editing budgets) from a passing chat request. Writes are now opt-in per server instance.
- Error responses now pass through
safeResponseto prevent oversized error payloads safeResponsedeep-clones before truncation to avoid mutating original data
- Budget unit documentation clarified in tool descriptions
- Published to npm
- CLI flags (--help, --version)
- SIGTERM/SIGINT graceful shutdown
- Env var trimming and validation
- Shell injection fix in token rotation
- All logging to stderr (stdout reserved for MCP protocol)
- Auth errors not retried (fail fast on 401/403)