{"_id":"@channel47/google-ads-mcp","_rev":"11-3dd49a9efea829c61c85abf904f44ed1","name":"@channel47/google-ads-mcp","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@channel47/google-ads-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.0","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"ffa05323b7958185a98cf7af70e6c2afd3505b15","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.0.tgz","fileCount":15,"integrity":"sha512-ioYCxfEFn1vClq2sZ1cKAbXhPn1hna9GA4kxyDrkFR+EeEBMuqibEayFankQ/AO7S21ZQbjOI174YNp03TNP5A==","signatures":[{"sig":"MEQCID0J6v35Ko5R6j4tqRuckgACcTzPSCcPi8yl6SXkl5PzAiBGqHx338uL+eD2GRJGBqOrQMxu5RNAfItempJ5flRPag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71010},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5a07be2178f8e413e02f3e7595be28b42d7a0255","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.0_1767822951069_0.3475399521995126","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@channel47/google-ads-mcp","version":"1.0.1","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.1","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"c6e96605e39e734c668c68573fda3bee10c31225","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.1.tgz","fileCount":15,"integrity":"sha512-ZhtbAkEP6L8kNug1yLKLgX43u1OSpLyesfWW91SBy5ycDAMZVEdxbjrnxXJV+Qmi588vV5mlj/XO9uSUnzaZ/Q==","signatures":[{"sig":"MEUCIAHjGzaEps2I2sIO2qGrBqexm3ZND+YCO0tQf5wJPlRiAiEApbwq0X9KWsEBTB9M7JWt+Hrg99SN7ghMUOxroZ20DCU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73790},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dc40b8a2ab1f5d07784f5374999ac5e08b5e84a1","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.1_1768002584073_0.4483044024421132","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@channel47/google-ads-mcp","version":"1.0.2","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.2","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"ef69ddd76dbe20572b9cdba095aff7004be36585","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.2.tgz","fileCount":16,"integrity":"sha512-PBj3eiyT1N2yggPu1a0tl6+Pud3b63xxIW9lTPwwg51+uzRtcUQBVwrmDJ5qNkaKvTmnQ9vORj3tgZHYvyuq8g==","signatures":[{"sig":"MEYCIQCbv0jRW/Zi2xE7WAxOAqObmTdL7B/YJpaxEJY1hfDxCwIhALhiqPTgzLPRY28sJ3XXOfMlIWpww9+67LCBjAtyqYIw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82500},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dcac136bedc277735a3b52e47244ff6ca6ff5fbc","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.2_1768106870836_0.004889082620197049","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@channel47/google-ads-mcp","version":"1.0.4","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.4","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"7501b6581b737cbd0edc9e220710528a9ffa76ef","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.4.tgz","fileCount":16,"integrity":"sha512-pfNlfBex2P87Z3fRfiwdIpkhM/l1j4KLlf7XBz+oMehRkw0CeaB0zCfPGWmdv86j89iNOKEtI+O44oAG4yHAUQ==","signatures":[{"sig":"MEQCIFbA1d7+BuDzEdYr1+/T9SlCS/YWZpBX+XyC8U0qO3NzAiBQ2Gn28j5758rr5tApiaG8Qs+4r4KpN9ZlPbA8heZhFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84323},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b3e1ad13818c731f25c17133023973fe4a68a7fe","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.4_1768110219523_0.021006789703134077","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@channel47/google-ads-mcp","version":"1.0.5","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.5","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"c7e7948ea0ac18c39e02e03dc67fcab77e9c20c7","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.5.tgz","fileCount":17,"integrity":"sha512-Vn+kyrWW4ZTynytzKaGDiEExjS3lil9BzrSFAEXM3E42ga+jKvG+GutZADexQyXH1WgCCZ+sp280kkSqhMaoIg==","signatures":[{"sig":"MEQCIHiAkrRLCMDbQeVa/rBbaAKJIInYnFxKY+q1LaxON2+mAiAgl3lbxPAyJPo+SrPNRTDWS2gOamnYeVyY2YTg3z90+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92300},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3199fba914fe24086b1fc2389bc614b0e0b170cd","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.5_1768246252793_0.8927046245923744","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@channel47/google-ads-mcp","version":"1.0.6","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.6","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"935d0467d8931c176054136c75858fda621099b2","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.6.tgz","fileCount":17,"integrity":"sha512-pu1MiIR5sIenVJvV7lzl7NRYixSjWKB9gpa4T//syjslaFWkpblbGtSpVoHNCYyS63lozSIDGKfxkwjFRIg5IQ==","signatures":[{"sig":"MEUCIDHeTbH886uhcjnMadfAEJTC5AqfH0peyyYzc87qqGNrAiEAyMIeJx1sDfLH1uEPTQ5cippJ/NuOO2YqC5XE5bxVOFs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92800},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"0146af23be556cf3593520e838e0adc21af74a46","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.6_1768249034229_0.525955205646133","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@channel47/google-ads-mcp","version":"1.0.7","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.7","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/google-ads-mcp-server#readme","bugs":{"url":"https://github.com/channel47/google-ads-mcp-server/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"72d827e0364cfc088a4d861d4d0a30244bea7445","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.7.tgz","fileCount":17,"integrity":"sha512-NXDBgEsF+so5VY3uYqjFiq4jH9Lbq7KMlmSv65BTXhYMGULR93vIFIe3a9aB8uLsaiVAAcXyP5pYqoqVhu8eTQ==","signatures":[{"sig":"MEYCIQDkQNTATutevsvXIl6WBfCAkuM5ecCMaHvbspAyT5Rd/gIhAKeC3o8CzNvebGhqyF1R3jZ3exbYYd2xa5vK55SsEKLc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99723},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"7fe8019a54c5bf4c690ee1b23c1f947903d29b8f","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/google-ads-mcp-server.git","type":"git"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.7_1768334467935_0.7738489217604021","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@channel47/google-ads-mcp","version":"1.0.8","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.0.8","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/mcps/tree/main/google-ads#readme","bugs":{"url":"https://github.com/channel47/mcps/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"87ad7340258ffa8515f5d57a0a1ecab2752c2c62","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.0.8.tgz","fileCount":17,"integrity":"sha512-P5qzFaLhbhQaSgobRzcuDLounA6CsZ55IcVl016AjZ+fEZl+QLiEs1f98BcGbi9drawmjM81Yee+obGsaecfYw==","signatures":[{"sig":"MEQCIBwkv/YQpWXHpn8SfwZIbb9B1idKrYSBmIyCIXZ++qulAiB7Zr2ZGcQHfW0EvuEfyY+WNKKty3JF1nlBHmJlqEBxLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99786},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"905bbe27d894eb02a459c27e4546dbdcd5b8a464","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/mcps.git","type":"git","directory":"google-ads"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.0.8_1771365045221_0.07424302538515093","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@channel47/google-ads-mcp","version":"1.1.0","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.1.0","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/mcps/tree/main/google-ads#readme","bugs":{"url":"https://github.com/channel47/mcps/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"c3b7928114d7e84b392952ce8a0ed7e75262a3f8","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.1.0.tgz","fileCount":17,"integrity":"sha512-pEah0jPhsJ6a6DEC3cVBsvRlZKaNPqH8ZC3cGZDv4d8xFANvIWjGV3WGDkcp38it8Suh5wrofhI16aW2usxDtQ==","signatures":[{"sig":"MEYCIQC2LJYT1rBNARMldKr5gDeL/W3JNhwEGfIb4EToOxmkqAIhAI++zevkov9TgcgHF2wKcLRCd31K6r5spzcH2xhj+9Sb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99011},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"7ffcedaefffae0176cc9f36c872bae21f6bf158a","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/mcps.git","type":"git","directory":"google-ads"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.1.0_1772044186287_0.548413625409413","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@channel47/google-ads-mcp","version":"1.1.1","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","_id":"@channel47/google-ads-mcp@1.1.1","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"homepage":"https://github.com/channel47/mcps/tree/main/google-ads#readme","bugs":{"url":"https://github.com/channel47/mcps/issues"},"bin":{"google-ads-mcp":"server/index.js"},"dist":{"shasum":"563c5fa18c1da45334dd98ff0b85efdb01bdfd80","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.1.1.tgz","fileCount":17,"integrity":"sha512-JO0wY1X6zytaQhexF7xK2+yV9PTj4dd0GXaDVbkgi9sZKDCW4L+v2dOZ+oyBqN5CcDvJjP6qe8UtwiKmZv9BlQ==","signatures":[{"sig":"MEYCIQC070mSGpKm0Oq/anRjIiAfSu1FDVsa2PjqAmHjrl9XjgIhANvFAUtJeMfHEUPdSv1XRFIq5FUXk64dTdyyjQGxWXTu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99667},"main":"server/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"74ba3acdc7f69f4fd8629bcfb15d4da40cbedec9","scripts":{"lint":"eslint server/","test":"node --test *.test.js test/*.test.js","start":"node server/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"repository":{"url":"git+https://github.com/channel47/mcps.git","type":"git","directory":"google-ads"},"_npmVersion":"11.3.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","directories":{},"_nodeVersion":"24.1.0","dependencies":{"google-ads-api":"^21.0.1","google-auth-library":"^9.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/google-ads-mcp_1.1.1_1773265426986_0.508599403919263","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@channel47/google-ads-mcp","version":"1.2.0","description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","main":"server/index.js","bin":{"google-ads-mcp":"server/index.js"},"type":"module","scripts":{"start":"node server/index.js","test":"node --test *.test.js test/*.test.js","lint":"eslint server/","prepublishOnly":"npm test"},"keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"author":{"name":"Channel47"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/channel47/mcps.git","directory":"google-ads"},"bugs":{"url":"https://github.com/channel47/mcps/issues"},"homepage":"https://github.com/channel47/mcps/tree/main/google-ads#readme","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","google-ads-api":"^21.0.1","google-auth-library":"^9.0.0"},"engines":{"node":">=18.0.0"},"gitHead":"33d50f70a88e894fe313821588f7aea546efe07e","_id":"@channel47/google-ads-mcp@1.2.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-3gA/gB2kmaXtiwPCZyfofsF2Ao3csqx5kX+zcNA5gH/Fo3WioX6T/pEyBNLrsNDqQG4pYY0bF9yVOM5EAUTOtw==","shasum":"778baf98fbc77da40d73e28d2dcebfa0443b50ff","tarball":"https://registry.npmjs.org/@channel47/google-ads-mcp/-/google-ads-mcp-1.2.0.tgz","fileCount":17,"unpackedSize":100914,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAP9GIpEMzcF4afj/qLQLz7x0g/OBy7zEIBB1iWv7re9AiEAvMW0qkH2v3xLfM8ZV0KwQEDx3j4sojOmhsS5oLDOx7A="}]},"_npmUser":{"name":"ctrlswing","email":"jacksondean.me@gmail.com"},"directories":{},"maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/google-ads-mcp_1.2.0_1774467834821_0.3981641476801576"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-07T21:55:50.918Z","modified":"2026-03-25T19:43:55.118Z","1.0.0":"2026-01-07T21:55:51.230Z","1.0.1":"2026-01-09T23:49:44.235Z","1.0.2":"2026-01-11T04:47:50.980Z","1.0.4":"2026-01-11T05:43:39.675Z","1.0.5":"2026-01-12T19:30:52.963Z","1.0.6":"2026-01-12T20:17:14.380Z","1.0.7":"2026-01-13T20:01:08.075Z","1.0.8":"2026-02-17T21:50:45.385Z","1.1.0":"2026-02-25T18:29:46.437Z","1.1.1":"2026-03-11T21:43:47.144Z","1.2.0":"2026-03-25T19:43:54.962Z"},"bugs":{"url":"https://github.com/channel47/mcps/issues"},"author":{"name":"Channel47"},"license":"MIT","homepage":"https://github.com/channel47/mcps/tree/main/google-ads#readme","keywords":["mcp","model-context-protocol","google-ads","gaql","analytics","advertising","claude"],"repository":{"type":"git","url":"git+https://github.com/channel47/mcps.git","directory":"google-ads"},"description":"Google Ads MCP Server - Query and mutate Google Ads data using GAQL","maintainers":[{"name":"ctrlswing","email":"jacksondean.me@gmail.com"}],"readme":"# @channel47/google-ads-mcp\n\n[![npm version](https://badge.fury.io/js/@channel47%2Fgoogle-ads-mcp.svg)](https://www.npmjs.com/package/@channel47/google-ads-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nMCP server for Google Ads API access via GAQL (Google Ads Query Language). Built by a practitioner managing 25+ ad accounts daily — not a demo.\n\nPart of [channel47](https://channel47.dev), the open-source ecosystem of profession plugins for Claude Code. [Get the newsletter](https://channel47.dev/subscribe) for weekly skill breakdowns from production use.\n\n## What It Does\n\n- **List accounts** accessible under your MCC or individual credentials\n- **Query anything** with raw GAQL — campaigns, ad groups, keywords, search terms, assets, any resource\n- **Mutate entities** — campaigns, ad groups, ads, keywords, budgets, assets with dry-run safety\n- **Resources and prompts** — bundled GAQL reference docs and operation templates\n\n## Installation\n\n### For Claude Code Plugin Users\n\nBundled with the [media-buyer plugin](https://github.com/channel47/plugins). No manual install required.\n\n### Standalone Use\n\n```bash\nnpx @channel47/google-ads-mcp@latest\n```\n\nOr install globally:\n\n```bash\nnpm install -g @channel47/google-ads-mcp\ngoogle-ads-mcp\n```\n\n## Configuration\n\n### Required\n\n| Variable | Description |\n|----------|-------------|\n| `GOOGLE_ADS_DEVELOPER_TOKEN` | Your Google Ads API Developer Token |\n| `GOOGLE_ADS_CLIENT_ID` | OAuth 2.0 Client ID from Google Cloud |\n| `GOOGLE_ADS_CLIENT_SECRET` | OAuth 2.0 Client Secret |\n| `GOOGLE_ADS_REFRESH_TOKEN` | OAuth 2.0 Refresh Token |\n\n### Optional\n\n| Variable | Description |\n|----------|-------------|\n| `GOOGLE_ADS_LOGIN_CUSTOMER_ID` | MCC Account ID (10 digits, no dashes) |\n| `GOOGLE_ADS_DEFAULT_CUSTOMER_ID` | Default account ID for queries |\n| `GOOGLE_ADS_READ_ONLY` | Set to `true` to hide the mutate tool entirely — query and list only |\n\n### MCP Config Example\n\n```json\n{\n  \"mcpServers\": {\n    \"google-ads\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@channel47/google-ads-mcp@latest\"],\n      \"env\": {\n        \"GOOGLE_ADS_DEVELOPER_TOKEN\": \"your-developer-token\",\n        \"GOOGLE_ADS_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_ADS_CLIENT_SECRET\": \"your-client-secret\",\n        \"GOOGLE_ADS_REFRESH_TOKEN\": \"your-refresh-token\",\n        \"GOOGLE_ADS_LOGIN_CUSTOMER_ID\": \"1234567890\",\n        \"GOOGLE_ADS_READ_ONLY\": \"true\"\n      }\n    }\n  }\n}\n```\n\nRemove `GOOGLE_ADS_READ_ONLY` or set to `false` to enable the mutate tool.\n\n## Tools\n\n### list_accounts\n\nList all accessible Google Ads accounts.\n\n**Returns:** Array of account objects with ID, name, currency, and status.\n\n### query\n\nExecute any GAQL SELECT query. Returns clean JSON results.\n\n**Parameters:**\n- `customer_id` (string, optional): Account ID (10 digits, no dashes)\n- `query` (string, required): GAQL SELECT query\n- `limit` (integer, optional): Max rows to return (default: 100, max: 10000)\n\n**Example:**\n```javascript\n{\n  \"customer_id\": \"1234567890\",\n  \"query\": \"SELECT campaign.name, campaign.status FROM campaign WHERE campaign.status = 'ENABLED'\",\n  \"limit\": 50\n}\n```\n\n### mutate\n\nExecute write operations using GoogleAdsService.Mutate.\n\n**Parameters:**\n- `customer_id` (string, optional): Account ID\n- `operations` (array, required): Mutation operations\n- `partial_failure` (boolean, optional): Enable partial failure mode (default: true)\n- `dry_run` (boolean, optional): Validate without executing (default: true for safety)\n\n**Example:**\n```javascript\n{\n  \"customer_id\": \"1234567890\",\n  \"operations\": [\n    {\n      \"campaignOperation\": {\n        \"update\": {\n          \"resourceName\": \"customers/1234567890/campaigns/123\",\n          \"status\": \"PAUSED\"\n        },\n        \"updateMask\": \"status\"\n      }\n    }\n  ],\n  \"dry_run\": false\n}\n```\n\n#### Working with Responsive Search Ads (RSAs)\n\nRSAs have two different resource types with different mutability:\n\n| Resource | Entity | Use Case |\n|----------|--------|----------|\n| `customers/{id}/ads/{ad_id}` | `ad` | Update ad **content** (headlines, descriptions, URLs) |\n| `customers/{id}/adGroupAds/{ad_group_id}~{ad_id}` | `ad_group_ad` | Change ad **status** (pause, enable, remove) |\n\n**Update RSA headlines/descriptions** (use `entity: 'ad'`):\n```javascript\n{\n  \"operations\": [{\n    \"entity\": \"ad\",\n    \"operation\": \"update\",\n    \"resource\": {\n      \"resource_name\": \"customers/1234567890/ads/9876543210\",\n      \"responsive_search_ad\": {\n        \"headlines\": [\n          {\"text\": \"New Headline 1\"},\n          {\"text\": \"New Headline 2\"},\n          {\"text\": \"New Headline 3\"}\n        ],\n        \"descriptions\": [\n          {\"text\": \"New Description 1\"},\n          {\"text\": \"New Description 2\"}\n        ]\n      },\n      \"final_urls\": [\"https://example.com\"]\n    }\n  }],\n  \"dry_run\": false\n}\n```\n\n**Change RSA status** (use `entity: 'ad_group_ad'`):\n```javascript\n{\n  \"operations\": [{\n    \"entity\": \"ad_group_ad\",\n    \"operation\": \"update\",\n    \"resource\": {\n      \"resource_name\": \"customers/1234567890/adGroupAds/111222333~9876543210\",\n      \"status\": \"PAUSED\"\n    }\n  }],\n  \"dry_run\": false\n}\n```\n\n#### Creating Image Assets with File Paths\n\nWhen creating image assets, you can provide a local file path instead of base64 data:\n\n```javascript\n{\n  \"operations\": [{\n    \"entity\": \"asset\",\n    \"operation\": \"create\",\n    \"resource\": {\n      \"name\": \"My Image Asset\",\n      \"image_file_path\": \"/path/to/image.png\"\n    }\n  }]\n}\n```\n\nThe server will automatically read the file and convert it to the required base64 format.\n\n#### Creating Campaigns\n\nCampaign creation requires specific fields since Google Ads API v19.2 (September 2025):\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name` | Yes | Campaign name |\n| `advertising_channel_type` | Yes | Campaign type (SEARCH, DISPLAY, etc.) |\n| `campaign_budget` | Yes | Reference to budget resource |\n| `bidding strategy` | Yes | One of: `manual_cpc`, `maximize_conversions`, `target_cpa`, etc. |\n| `contains_eu_political_advertising` | Auto | Auto-defaults to `DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING` |\n\n**Complete campaign creation example:**\n```javascript\n{\n  \"operations\": [\n    // 1. Create budget first (with temp ID for atomic creation)\n    {\n      \"entity\": \"campaign_budget\",\n      \"operation\": \"create\",\n      \"resource\": {\n        \"resource_name\": \"customers/1234567890/campaignBudgets/-1\",\n        \"name\": \"My Budget\",\n        \"amount_micros\": 10000000,\n        \"delivery_method\": \"STANDARD\"\n      }\n    },\n    // 2. Create campaign referencing the budget\n    {\n      \"entity\": \"campaign\",\n      \"operation\": \"create\",\n      \"resource\": {\n        \"name\": \"My Search Campaign\",\n        \"advertising_channel_type\": \"SEARCH\",\n        \"status\": \"PAUSED\",\n        \"campaign_budget\": \"customers/1234567890/campaignBudgets/-1\",\n        \"manual_cpc\": { \"enhanced_cpc_enabled\": false },\n        \"network_settings\": {\n          \"target_google_search\": true,\n          \"target_search_network\": true\n        }\n      }\n    }\n  ],\n  \"dry_run\": false\n}\n```\n\n**Supported bidding strategies:**\n- `manual_cpc` - Manual cost-per-click\n- `maximize_conversions` - Maximize conversions\n- `maximize_conversion_value` - Maximize conversion value (with optional `target_roas`)\n- `target_cpa` - Target cost-per-acquisition\n- `target_spend` - Maximize clicks (target spend)\n- `target_impression_share` - Target impression share\n- `bidding_strategy` - Reference to portfolio bidding strategy\n\n## Development\n\n```bash\ngit clone https://github.com/channel47/mcps.git\ncd mcps\nnpm install    # workspaces — installs all servers\nnpm test       # runs all server tests\n```\n\n3 core tools. Dry-run by default. OAuth 2.0 with environment-based credentials.\n\nPairs with the [media-buyer plugin](https://github.com/channel47/plugins), which adds skills, mutation validation hooks, and GAQL reference docs on top of this server.\n\n## Links\n\n- [channel47](https://channel47.dev) — open-source profession plugins for Claude Code\n- [Build Notes](https://channel47.dev/subscribe) — weekly skill breakdowns from production use\n- [Media Buyer Plugin](https://github.com/channel47/plugins) — the paid-search toolkit this MCP powers\n- [NPM Package](https://www.npmjs.com/package/@channel47/google-ads-mcp)\n- [Google Ads API](https://developers.google.com/google-ads/api/docs/start) / [GAQL Reference](https://developers.google.com/google-ads/api/docs/query/overview)\n- [X](https://x.com/ctrlswing) / [LinkedIn](https://www.linkedin.com/in/jackson-d-9979a7a0/) / [GitHub](https://github.com/channel47)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}