{"_id":"@dahoai/ads-mcp","name":"@dahoai/ads-mcp","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@dahoai/ads-mcp","version":"1.0.0","description":"MCP server for the DadADS paid-media audit API","license":"MIT","type":"module","main":"dist/index.js","bin":{"ads-mcp":"dist/index.js"},"scripts":{"start":"node dist/index.js","dev":"tsx watch src/index.ts","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"engines":{"node":">=18"},"dependencies":{"@modelcontextprotocol/sdk":"^1.6.1","express":"^5.2.1","zod":"^3.23.8"},"devDependencies":{"@types/express":"^5.0.6","@types/node":"^22.10.0","tsx":"^4.19.2","typescript":"^5.7.2"},"repository":{"type":"git","url":"git+https://github.com/etugrand/dadads.git","directory":"mcp-server"},"homepage":"https://ads.daho.ai","keywords":["mcp","model-context-protocol","google-ads","meta-ads","ppc","ads-audit"],"gitHead":"d93aa14589dade7d950248ec4341f24f4bdcd81b","types":"./dist/index.d.ts","_id":"@dahoai/ads-mcp@1.0.0","bugs":{"url":"https://github.com/etugrand/dadads/issues"},"_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-vcbDXkOhmNS/MQF+ZMny8QNF+mepfni3MkQjeYXLKeIBeMlRfrk66onCq5KiNKOXSFDQehtGSmKnVqc7YmtWJw==","shasum":"0aa0732e5afb5a57ff40b501b229ca60a34fff86","tarball":"https://registry.npmjs.org/@dahoai/ads-mcp/-/ads-mcp-1.0.0.tgz","fileCount":10,"unpackedSize":52602,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICsqCUtjpLHYOExNclkcNAov1FGbamc/OOIfgAidG7qPAiEA6fGJduPA1VIIPX9WPos0j2ee9wT3ECU4R65YKDr+M+I="}]},"_npmUser":{"name":"etugrand","email":"igounton@gmail.com"},"directories":{},"maintainers":[{"name":"etugrand","email":"igounton@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ads-mcp_1.0.0_1788541583083_0.28710789348342947"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-04T17:06:22.880Z","1.0.0":"2026-09-04T17:06:23.237Z","modified":"2026-09-04T17:06:23.515Z"},"maintainers":[{"name":"etugrand","email":"igounton@gmail.com"}],"description":"MCP server for the DadADS paid-media audit API","homepage":"https://ads.daho.ai","keywords":["mcp","model-context-protocol","google-ads","meta-ads","ppc","ads-audit"],"repository":{"type":"git","url":"git+https://github.com/etugrand/dadads.git","directory":"mcp-server"},"bugs":{"url":"https://github.com/etugrand/dadads/issues"},"license":"MIT","readme":"# @dahoai/ads-mcp\n\nMCP server for [DadADS](https://ads.daho.ai), a paid-media audit tool. It runs\n161 weighted controls over a Google, Meta or TikTok Ads account and returns a\n0-100 score, an A-F grade, and the failing controls ranked by what they cost.\n\nThis package lets an MCP client (Claude Desktop, Claude Code, Cursor, or any\nother) read and act on those audits.\n\n## Requirements\n\nAn API key from your DadADS account: **Settings → Developer API → Generate API\nkey**. The key is shown once, at creation.\n\n## Install\n\nNothing to install globally. Point your client at it with `npx`.\n\n### Claude Desktop / Claude Code\n\n```json\n{\n  \"mcpServers\": {\n    \"dadads\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@dahoai/ads-mcp\"],\n      \"env\": {\n        \"API_KEY\": \"sk_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Hosted endpoint\n\nA hosted instance runs at `https://ads-mcp.daho.ai` if you would rather not run\nthe process yourself. Authenticate with `Authorization: Bearer sk_...`, or\n`?token=sk_...` for clients that cannot set headers.\n\n## Configuration\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `API_KEY` | none | Your DadADS API key. Required. |\n| `API_BASE_URL` | `http://localhost:3000` | Set to `https://ads.daho.ai` unless you are running the app locally. |\n| `TRANSPORT` | `stdio` | `http` to listen instead of speaking over stdio. |\n| `PORT` | `8787` | Only used when `TRANSPORT=http`. |\n\n## Tools\n\n**Projects**\n\n| Tool | Does |\n|---|---|\n| `list_projects` | Every advertiser you track |\n| `get_project` | One project |\n| `create_project` | Register a new advertiser |\n| `get_me` | The account and its remaining audit allowance |\n\n**Audits**\n\n| Tool | Does |\n|---|---|\n| `run_audit` | Start an audit. Costs one audit from your plan, refunded if it fails |\n| `get_latest_audit` | The newest audit, summarised rather than raw |\n| `get_budget_review` | Where the money should go, from facts an audit already stored |\n| `run_job` / `get_job` | Start or poll any job type, including the full audit document |\n\n**Findings**\n\n| Tool | Does |\n|---|---|\n| `list_findings` | The remediation ledger, carried across audits |\n| `update_finding` | Mark something in progress, fixed, won't-fix or snoozed |\n\n**Tests and competitors**\n\n| Tool | Does |\n|---|---|\n| `list_tests` | Creative test standings, with days until the result can be trusted |\n| `update_test` | Stop a test or record its winner |\n| `list_competitor_scan` | What competitors launched, killed, and how long each ad survived |\n\n## Two things worth knowing\n\n`get_latest_audit` returns a summary, not the stored run. A run is roughly 40KB\nper platform because every check carries its evidence; the summary is about\n2.8KB and keeps the scores, the weakest categories, the named quick wins and\nwhat moved. Handing a model the raw run costs more than the audit did. The full\ndocument is one `get_job` away when you want it.\n\nA test's decision rule cannot be edited through `update_test`. The metric, the\nminimum detectable lift and the significance threshold are fixed when the test\nis registered, because a threshold moved after seeing the numbers is not a\ndecision rule.\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-ab487ce370ffc2f5146da4d45976d7c2"}