@dahoai/ads-mcp
v1.0.0
Published
MCP server for the DadADS paid-media audit API
Maintainers
Readme
@dahoai/ads-mcp
MCP server for DadADS, a paid-media audit tool. It runs 161 weighted controls over a Google, Meta or TikTok Ads account and returns a 0-100 score, an A-F grade, and the failing controls ranked by what they cost.
This package lets an MCP client (Claude Desktop, Claude Code, Cursor, or any other) read and act on those audits.
Requirements
An API key from your DadADS account: Settings → Developer API → Generate API key. The key is shown once, at creation.
Install
Nothing to install globally. Point your client at it with npx.
Claude Desktop / Claude Code
{
"mcpServers": {
"dadads": {
"command": "npx",
"args": ["-y", "@dahoai/ads-mcp"],
"env": {
"API_KEY": "sk_your_key_here"
}
}
}
}Hosted endpoint
A hosted instance runs at https://ads-mcp.daho.ai if you would rather not run
the process yourself. Authenticate with Authorization: Bearer sk_..., or
?token=sk_... for clients that cannot set headers.
Configuration
| Variable | Default | Purpose |
|---|---|---|
| API_KEY | none | Your DadADS API key. Required. |
| API_BASE_URL | http://localhost:3000 | Set to https://ads.daho.ai unless you are running the app locally. |
| TRANSPORT | stdio | http to listen instead of speaking over stdio. |
| PORT | 8787 | Only used when TRANSPORT=http. |
Tools
Projects
| Tool | Does |
|---|---|
| list_projects | Every advertiser you track |
| get_project | One project |
| create_project | Register a new advertiser |
| get_me | The account and its remaining audit allowance |
Audits
| Tool | Does |
|---|---|
| run_audit | Start an audit. Costs one audit from your plan, refunded if it fails |
| get_latest_audit | The newest audit, summarised rather than raw |
| get_budget_review | Where the money should go, from facts an audit already stored |
| run_job / get_job | Start or poll any job type, including the full audit document |
Findings
| Tool | Does |
|---|---|
| list_findings | The remediation ledger, carried across audits |
| update_finding | Mark something in progress, fixed, won't-fix or snoozed |
Tests and competitors
| Tool | Does |
|---|---|
| list_tests | Creative test standings, with days until the result can be trusted |
| update_test | Stop a test or record its winner |
| list_competitor_scan | What competitors launched, killed, and how long each ad survived |
Two things worth knowing
get_latest_audit returns a summary, not the stored run. A run is roughly 40KB
per platform because every check carries its evidence; the summary is about
2.8KB and keeps the scores, the weakest categories, the named quick wins and
what moved. Handing a model the raw run costs more than the audit did. The full
document is one get_job away when you want it.
A test's decision rule cannot be edited through update_test. The metric, the
minimum detectable lift and the significance threshold are fixed when the test
is registered, because a threshold moved after seeing the numbers is not a
decision rule.
License
MIT
