Two servers, one client config
Both speak JSON-RPC over stdio, so one .mcp.json entry each is the whole setup. Diagnostics go to stderr; one object per line goes over stdio.
.mcp.json2 servers · stdio
{
"mcpServers": {
"adrails": {
"command": "python3",
"args": ["-m", "adsops", "--config", "/absolute/path/config.json"]
},
"google-ads": {
// PLACEHOLDER — not an AdRails command.
// See Google's installation docs for google-ads-mcp and copy
// their exact command, args and env here, unchanged.
"command": "<see Google's installation docs>",
"args": ["<see Google's installation docs>"]
}
}
}
The AdRails block is the entry from the project README: point --config at the absolute path of your own config file. Everything AdRails needs — accounts, credential source, state files, policy files, log paths — lives in that file, not in this one. Google's server entry is deliberately a placeholder; AdRails does not ship, mirror or verify Google's launch command.
Keep the two configs separate in your head: Google's server holds its own credentials and reads only. AdRails reads credentials from the sources you configure in config.json (a service-account JSON file, a static token, or a secret-manager lookup) and writes only through adsops_plan / adsops_apply / adsops_set against your policy file.