@cesteral/gads-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +262 -0
  3. package/dist/auth/gads-auth-adapter.d.ts +31 -0
  4. package/dist/auth/gads-auth-adapter.d.ts.map +1 -0
  5. package/dist/auth/gads-auth-adapter.js +70 -0
  6. package/dist/auth/gads-auth-adapter.js.map +1 -0
  7. package/dist/auth/gads-auth-strategy.d.ts +9 -0
  8. package/dist/auth/gads-auth-strategy.d.ts.map +1 -0
  9. package/dist/auth/gads-auth-strategy.js +27 -0
  10. package/dist/auth/gads-auth-strategy.js.map +1 -0
  11. package/dist/config/index.d.ts +100 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +37 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/container/index.d.ts +5 -0
  16. package/dist/container/index.d.ts.map +1 -0
  17. package/dist/container/index.js +14 -0
  18. package/dist/container/index.js.map +1 -0
  19. package/dist/container/registrations/core.d.ts +3 -0
  20. package/dist/container/registrations/core.d.ts.map +1 -0
  21. package/dist/container/registrations/core.js +14 -0
  22. package/dist/container/registrations/core.js.map +1 -0
  23. package/dist/container/registrations/mcp.d.ts +2 -0
  24. package/dist/container/registrations/mcp.d.ts.map +1 -0
  25. package/dist/container/registrations/mcp.js +3 -0
  26. package/dist/container/registrations/mcp.js.map +1 -0
  27. package/dist/container/tokens.d.ts +6 -0
  28. package/dist/container/tokens.d.ts.map +1 -0
  29. package/dist/container/tokens.js +6 -0
  30. package/dist/container/tokens.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +50 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts +4 -0
  36. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts.map +1 -0
  37. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js +230 -0
  38. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js.map +1 -0
  39. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts +4 -0
  40. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts.map +1 -0
  41. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js +237 -0
  42. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js.map +1 -0
  43. package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.d.ts +4 -0
  44. package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.d.ts.map +1 -0
  45. package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.js +154 -0
  46. package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.js.map +1 -0
  47. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts +4 -0
  48. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts.map +1 -0
  49. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js +299 -0
  50. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js.map +1 -0
  51. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts +4 -0
  52. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts.map +1 -0
  53. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js +170 -0
  54. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js.map +1 -0
  55. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts +4 -0
  56. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts.map +1 -0
  57. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js +221 -0
  58. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js.map +1 -0
  59. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts +4 -0
  60. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts.map +1 -0
  61. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js +207 -0
  62. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js.map +1 -0
  63. package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.d.ts +4 -0
  64. package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.d.ts.map +1 -0
  65. package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.js +182 -0
  66. package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.js.map +1 -0
  67. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts +4 -0
  68. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts.map +1 -0
  69. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js +223 -0
  70. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js.map +1 -0
  71. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts +4 -0
  72. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts.map +1 -0
  73. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js +125 -0
  74. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js.map +1 -0
  75. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts +4 -0
  76. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts.map +1 -0
  77. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js +177 -0
  78. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js.map +1 -0
  79. package/dist/mcp-server/prompts/index.d.ts +9 -0
  80. package/dist/mcp-server/prompts/index.d.ts.map +1 -0
  81. package/dist/mcp-server/prompts/index.js +97 -0
  82. package/dist/mcp-server/prompts/index.js.map +1 -0
  83. package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts +4 -0
  84. package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts.map +1 -0
  85. package/dist/mcp-server/resources/definitions/entity-examples.resource.js +574 -0
  86. package/dist/mcp-server/resources/definitions/entity-examples.resource.js.map +1 -0
  87. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts +3 -0
  88. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts.map +1 -0
  89. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js +124 -0
  90. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js.map +1 -0
  91. package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts +4 -0
  92. package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts.map +1 -0
  93. package/dist/mcp-server/resources/definitions/entity-schemas.resource.js +264 -0
  94. package/dist/mcp-server/resources/definitions/entity-schemas.resource.js.map +1 -0
  95. package/dist/mcp-server/resources/definitions/gaql-reference.resource.d.ts +3 -0
  96. package/dist/mcp-server/resources/definitions/gaql-reference.resource.d.ts.map +1 -0
  97. package/dist/mcp-server/resources/definitions/gaql-reference.resource.js +157 -0
  98. package/dist/mcp-server/resources/definitions/gaql-reference.resource.js.map +1 -0
  99. package/dist/mcp-server/resources/definitions/index.d.ts +8 -0
  100. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  101. package/dist/mcp-server/resources/definitions/index.js +42 -0
  102. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  103. package/dist/mcp-server/resources/definitions/insights-reference.resource.d.ts +3 -0
  104. package/dist/mcp-server/resources/definitions/insights-reference.resource.d.ts.map +1 -0
  105. package/dist/mcp-server/resources/definitions/insights-reference.resource.js +78 -0
  106. package/dist/mcp-server/resources/definitions/insights-reference.resource.js.map +1 -0
  107. package/dist/mcp-server/resources/index.d.ts +3 -0
  108. package/dist/mcp-server/resources/index.d.ts.map +1 -0
  109. package/dist/mcp-server/resources/index.js +2 -0
  110. package/dist/mcp-server/resources/index.js.map +1 -0
  111. package/dist/mcp-server/resources/types.d.ts +8 -0
  112. package/dist/mcp-server/resources/types.d.ts.map +1 -0
  113. package/dist/mcp-server/resources/types.js +2 -0
  114. package/dist/mcp-server/resources/types.js.map +1 -0
  115. package/dist/mcp-server/server.d.ts +5 -0
  116. package/dist/mcp-server/server.d.ts.map +1 -0
  117. package/dist/mcp-server/server.js +124 -0
  118. package/dist/mcp-server/server.js.map +1 -0
  119. package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts +270 -0
  120. package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts.map +1 -0
  121. package/dist/mcp-server/tools/definitions/adjust-bids.tool.js +189 -0
  122. package/dist/mcp-server/tools/definitions/adjust-bids.tool.js.map +1 -0
  123. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts +148 -0
  124. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts.map +1 -0
  125. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js +141 -0
  126. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js.map +1 -0
  127. package/dist/mcp-server/tools/definitions/bulk-mutate.tool.d.ts +136 -0
  128. package/dist/mcp-server/tools/definitions/bulk-mutate.tool.d.ts.map +1 -0
  129. package/dist/mcp-server/tools/definitions/bulk-mutate.tool.js +127 -0
  130. package/dist/mcp-server/tools/definitions/bulk-mutate.tool.js.map +1 -0
  131. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts +185 -0
  132. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts.map +1 -0
  133. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js +149 -0
  134. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js.map +1 -0
  135. package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts +123 -0
  136. package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts.map +1 -0
  137. package/dist/mcp-server/tools/definitions/create-entity.tool.js +98 -0
  138. package/dist/mcp-server/tools/definitions/create-entity.tool.js.map +1 -0
  139. package/dist/mcp-server/tools/definitions/gaql-search.tool.d.ts +197 -0
  140. package/dist/mcp-server/tools/definitions/gaql-search.tool.d.ts.map +1 -0
  141. package/dist/mcp-server/tools/definitions/gaql-search.tool.js +110 -0
  142. package/dist/mcp-server/tools/definitions/gaql-search.tool.js.map +1 -0
  143. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts +87 -0
  144. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts.map +1 -0
  145. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js +91 -0
  146. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js.map +1 -0
  147. package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts +92 -0
  148. package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts.map +1 -0
  149. package/dist/mcp-server/tools/definitions/get-entity.tool.js +87 -0
  150. package/dist/mcp-server/tools/definitions/get-entity.tool.js.map +1 -0
  151. package/dist/mcp-server/tools/definitions/get-insights.tool.d.ts +382 -0
  152. package/dist/mcp-server/tools/definitions/get-insights.tool.d.ts.map +1 -0
  153. package/dist/mcp-server/tools/definitions/get-insights.tool.js +246 -0
  154. package/dist/mcp-server/tools/definitions/get-insights.tool.js.map +1 -0
  155. package/dist/mcp-server/tools/definitions/get-pacing-status.tool.d.ts +141 -0
  156. package/dist/mcp-server/tools/definitions/get-pacing-status.tool.d.ts.map +1 -0
  157. package/dist/mcp-server/tools/definitions/get-pacing-status.tool.js +163 -0
  158. package/dist/mcp-server/tools/definitions/get-pacing-status.tool.js.map +1 -0
  159. package/dist/mcp-server/tools/definitions/index.d.ts +18 -0
  160. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  161. package/dist/mcp-server/tools/definitions/index.js +53 -0
  162. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  163. package/dist/mcp-server/tools/definitions/list-accounts.tool.d.ts +54 -0
  164. package/dist/mcp-server/tools/definitions/list-accounts.tool.d.ts.map +1 -0
  165. package/dist/mcp-server/tools/definitions/list-accounts.tool.js +61 -0
  166. package/dist/mcp-server/tools/definitions/list-accounts.tool.js.map +1 -0
  167. package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts +220 -0
  168. package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts.map +1 -0
  169. package/dist/mcp-server/tools/definitions/list-entities.tool.js +112 -0
  170. package/dist/mcp-server/tools/definitions/list-entities.tool.js.map +1 -0
  171. package/dist/mcp-server/tools/definitions/remove-entity.tool.d.ts +116 -0
  172. package/dist/mcp-server/tools/definitions/remove-entity.tool.d.ts.map +1 -0
  173. package/dist/mcp-server/tools/definitions/remove-entity.tool.js +120 -0
  174. package/dist/mcp-server/tools/definitions/remove-entity.tool.js.map +1 -0
  175. package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts +129 -0
  176. package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts.map +1 -0
  177. package/dist/mcp-server/tools/definitions/update-entity.tool.js +91 -0
  178. package/dist/mcp-server/tools/definitions/update-entity.tool.js.map +1 -0
  179. package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts +239 -0
  180. package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts.map +1 -0
  181. package/dist/mcp-server/tools/definitions/validate-entity.tool.js +151 -0
  182. package/dist/mcp-server/tools/definitions/validate-entity.tool.js.map +1 -0
  183. package/dist/mcp-server/tools/index.d.ts +2 -0
  184. package/dist/mcp-server/tools/index.d.ts.map +1 -0
  185. package/dist/mcp-server/tools/index.js +2 -0
  186. package/dist/mcp-server/tools/index.js.map +1 -0
  187. package/dist/mcp-server/tools/utils/computed-metrics.d.ts +8 -0
  188. package/dist/mcp-server/tools/utils/computed-metrics.d.ts.map +1 -0
  189. package/dist/mcp-server/tools/utils/computed-metrics.js +19 -0
  190. package/dist/mcp-server/tools/utils/computed-metrics.js.map +1 -0
  191. package/dist/mcp-server/tools/utils/entity-mapping.d.ts +22 -0
  192. package/dist/mcp-server/tools/utils/entity-mapping.d.ts.map +1 -0
  193. package/dist/mcp-server/tools/utils/entity-mapping.js +99 -0
  194. package/dist/mcp-server/tools/utils/entity-mapping.js.map +1 -0
  195. package/dist/mcp-server/tools/utils/gaql-helpers.d.ts +4 -0
  196. package/dist/mcp-server/tools/utils/gaql-helpers.d.ts.map +1 -0
  197. package/dist/mcp-server/tools/utils/gaql-helpers.js +82 -0
  198. package/dist/mcp-server/tools/utils/gaql-helpers.js.map +1 -0
  199. package/dist/mcp-server/tools/utils/parent-id-validation.d.ts +10 -0
  200. package/dist/mcp-server/tools/utils/parent-id-validation.d.ts.map +1 -0
  201. package/dist/mcp-server/tools/utils/parent-id-validation.js +58 -0
  202. package/dist/mcp-server/tools/utils/parent-id-validation.js.map +1 -0
  203. package/dist/mcp-server/tools/utils/resolve-session.d.ts +4 -0
  204. package/dist/mcp-server/tools/utils/resolve-session.d.ts.map +1 -0
  205. package/dist/mcp-server/tools/utils/resolve-session.js +6 -0
  206. package/dist/mcp-server/tools/utils/resolve-session.js.map +1 -0
  207. package/dist/mcp-server/transports/streamable-http-transport.d.ts +49 -0
  208. package/dist/mcp-server/transports/streamable-http-transport.d.ts.map +1 -0
  209. package/dist/mcp-server/transports/streamable-http-transport.js +84 -0
  210. package/dist/mcp-server/transports/streamable-http-transport.js.map +1 -0
  211. package/dist/services/gads/gads-http-client.d.ts +13 -0
  212. package/dist/services/gads/gads-http-client.d.ts.map +1 -0
  213. package/dist/services/gads/gads-http-client.js +113 -0
  214. package/dist/services/gads/gads-http-client.js.map +1 -0
  215. package/dist/services/gads/gads-service.d.ts +60 -0
  216. package/dist/services/gads/gads-service.d.ts.map +1 -0
  217. package/dist/services/gads/gads-service.js +363 -0
  218. package/dist/services/gads/gads-service.js.map +1 -0
  219. package/dist/services/gads/types.d.ts +211 -0
  220. package/dist/services/gads/types.d.ts.map +1 -0
  221. package/dist/services/gads/types.js +16 -0
  222. package/dist/services/gads/types.js.map +1 -0
  223. package/dist/services/session-services.d.ts +17 -0
  224. package/dist/services/session-services.d.ts.map +1 -0
  225. package/dist/services/session-services.js +14 -0
  226. package/dist/services/session-services.js.map +1 -0
  227. package/dist/types-global/mcp.d.ts +2 -0
  228. package/dist/types-global/mcp.d.ts.map +1 -0
  229. package/dist/types-global/mcp.js +2 -0
  230. package/dist/types-global/mcp.js.map +1 -0
  231. package/dist/utils/errors/index.d.ts +2 -0
  232. package/dist/utils/errors/index.d.ts.map +1 -0
  233. package/dist/utils/errors/index.js +2 -0
  234. package/dist/utils/errors/index.js.map +1 -0
  235. package/dist/utils/platform.d.ts +3 -0
  236. package/dist/utils/platform.d.ts.map +1 -0
  237. package/dist/utils/platform.js +5 -0
  238. package/dist/utils/platform.js.map +1 -0
  239. package/dist/utils/security/rate-limiter.d.ts +3 -0
  240. package/dist/utils/security/rate-limiter.d.ts.map +1 -0
  241. package/dist/utils/security/rate-limiter.js +5 -0
  242. package/dist/utils/security/rate-limiter.js.map +1 -0
  243. package/dist/utils/telemetry/index.d.ts +2 -0
  244. package/dist/utils/telemetry/index.d.ts.map +1 -0
  245. package/dist/utils/telemetry/index.js +2 -0
  246. package/dist/utils/telemetry/index.js.map +1 -0
  247. package/dist/utils/telemetry/tracing.d.ts +3 -0
  248. package/dist/utils/telemetry/tracing.d.ts.map +1 -0
  249. package/dist/utils/telemetry/tracing.js +4 -0
  250. package/dist/utils/telemetry/tracing.js.map +1 -0
  251. package/package.json +56 -0
@@ -0,0 +1,124 @@
1
+ let cachedContent;
2
+ function formatEntityHierarchyMarkdown() {
3
+ return `# Google Ads Entity Hierarchy
4
+
5
+ ## Relationship Diagram
6
+
7
+ \`\`\`
8
+ Customer (Google Ads Account)
9
+ ├── Campaign Budget (shared or dedicated)
10
+ ├── Campaign
11
+ │ ├── Ad Group
12
+ │ │ ├── Ad (AdGroupAd)
13
+ │ │ ├── Keyword (AdGroupCriterion)
14
+ │ │ └── (Targeting criteria)
15
+ │ └── Campaign-level targeting (locations, languages)
16
+ └── Asset (reusable text/image/video/sitelink/callout)
17
+ ├── CampaignAsset (links asset to campaign)
18
+ └── AdGroupAsset (links asset to ad group)
19
+ \`\`\`
20
+
21
+ ## Entity Types (6 in Phase 1)
22
+
23
+ | Entity Type | GAQL Resource | Mutate Endpoint | Parent |
24
+ |-------------|--------------|-----------------|--------|
25
+ | **campaign** | \`campaign\` | \`campaigns:mutate\` | customerId |
26
+ | **adGroup** | \`ad_group\` | \`adGroups:mutate\` | customerId + campaign |
27
+ | **ad** | \`ad_group_ad\` | \`adGroupAds:mutate\` | customerId + adGroup |
28
+ | **keyword** | \`ad_group_criterion\` | \`adGroupCriteria:mutate\` | customerId + adGroup |
29
+ | **campaignBudget** | \`campaign_budget\` | \`campaignBudgets:mutate\` | customerId |
30
+ | **asset** | \`asset\` | \`assets:mutate\` | customerId |
31
+
32
+ ## API Patterns
33
+
34
+ ### Reading: GAQL Queries
35
+ All reads use GAQL via \`POST /customers/{customerId}/googleAds:search\`:
36
+ \`\`\`json
37
+ {
38
+ "query": "SELECT campaign.id, campaign.name FROM campaign WHERE campaign.status = 'ENABLED'"
39
+ }
40
+ \`\`\`
41
+
42
+ ### Writing: :mutate Endpoints
43
+ All writes use \`POST /customers/{customerId}/{resource}:mutate\`:
44
+ \`\`\`json
45
+ {
46
+ "operations": [
47
+ { "create": { "name": "My Campaign", ... } },
48
+ { "update": { "resourceName": "customers/123/campaigns/456", "name": "Updated" }, "updateMask": "name" },
49
+ { "remove": "customers/123/campaigns/789" }
50
+ ]
51
+ }
52
+ \`\`\`
53
+
54
+ ### Resource Names
55
+ Every entity has a resource name: \`customers/{customerId}/{entityType}/{entityId}\`
56
+ - Campaign: \`customers/123/campaigns/456\`
57
+ - Ad Group: \`customers/123/adGroups/789\`
58
+ - Campaign Budget: \`customers/123/campaignBudgets/101\`
59
+ - Ad (composite): \`customers/123/adGroupAds/{adGroupId}~{adId}\`
60
+ - Keyword (composite): \`customers/123/adGroupCriteria/{adGroupId}~{criterionId}\`
61
+ - Asset: \`customers/123/assets/202\`
62
+
63
+ ## Creation Order
64
+
65
+ Full campaign structure (top-down):
66
+
67
+ 1. **List accessible accounts** — \`gads_list_accounts\` to find your customer ID
68
+ 2. **Campaign Budget** — create budget first (\`amountMicros\` = daily budget in micros)
69
+ 3. **Campaign** — reference budget via \`campaignBudget\` resource name field
70
+ 4. **Ad Group(s)** — reference campaign via \`campaign\` resource name field
71
+ 5. **Keyword(s)** — reference ad group via \`adGroup\` resource name field
72
+ 6. **Ad(s)** — reference ad group via \`adGroup\` resource name field
73
+ 7. **Asset(s)** — optional, create then link via CampaignAsset or AdGroupAsset
74
+
75
+ ## Key Differences from Other Platforms
76
+
77
+ | Feature | Google Ads | DV360 | TTD |
78
+ |---------|-----------|-------|-----|
79
+ | **Budget model** | Separate CampaignBudget entity | Budget in campaign object | Budget in campaign + ad group |
80
+ | **Query language** | GAQL (SQL-like) | REST GET with filters | POST to /query endpoints |
81
+ | **Mutations** | :mutate with operations[] | REST PUT/PATCH | REST POST/PUT |
82
+ | **Update mask** | Required on update | Required on update | Full PUT (no mask) |
83
+ | **Status values** | ENABLED/PAUSED/REMOVED | ACTIVE/PAUSED/DRAFT/ARCHIVED | Available/Paused/Archived |
84
+ | **ID format** | Numeric strings | Numeric strings | Alphanumeric strings |
85
+ | **Currency** | Micros (÷1,000,000) | Standard units | Standard units |
86
+
87
+ ## Deletion / Removal Order
88
+
89
+ Remove bottom-up to avoid dependency errors:
90
+
91
+ 1. **Keywords** and **Ads** first
92
+ 2. **Ad Groups**
93
+ 3. **Campaigns**
94
+ 4. **Campaign Budgets** (only if not shared)
95
+ 5. **Assets** (only if not linked to campaigns/ad groups)
96
+
97
+ Note: In Google Ads, "remove" sets status to REMOVED. Entities cannot be un-removed.
98
+
99
+ ## Available Tools Summary
100
+
101
+ | Tool | Purpose | Read/Write |
102
+ |------|---------|:----------:|
103
+ | \`gads_gaql_search\` | Execute arbitrary GAQL queries | Read |
104
+ | \`gads_list_accounts\` | List accessible customer accounts | Read |
105
+ | \`gads_get_entity\` | Get single entity by type/ID | Read |
106
+ | \`gads_list_entities\` | List entities with filters | Read |
107
+ | \`gads_create_entity\` | Create via :mutate API | Write |
108
+ | \`gads_update_entity\` | Update with updateMask | Write |
109
+ | \`gads_remove_entity\` | Remove via :mutate API | Write |
110
+ | \`gads_bulk_mutate\` | Multi-operation mutate | Write |
111
+ | \`gads_bulk_update_status\` | Batch enable/pause/remove | Write |
112
+ `;
113
+ }
114
+ export const entityHierarchyResource = {
115
+ uri: "entity-hierarchy://gads",
116
+ name: "Google Ads Entity Hierarchy",
117
+ description: "Parent-child relationships between Google Ads entities, API patterns, creation/deletion ordering, and platform differences",
118
+ mimeType: "text/markdown",
119
+ getContent: () => {
120
+ cachedContent ??= formatEntityHierarchyMarkdown();
121
+ return cachedContent;
122
+ },
123
+ };
124
+ //# sourceMappingURL=entity-hierarchy.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-hierarchy.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/entity-hierarchy.resource.ts"],"names":[],"mappings":"AAUA,IAAI,aAAiC,CAAC;AAEtC,SAAS,6BAA6B;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6GR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAa;IAC/C,GAAG,EAAE,yBAAyB;IAC9B,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,4HAA4H;IAC9H,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,GAAG,EAAE;QACf,aAAa,KAAK,6BAA6B,EAAE,CAAC;QAClD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Resource } from "../types.js";
2
+ export declare const entitySchemaResources: Resource[];
3
+ export declare const entitySchemaAllResource: Resource;
4
+ //# sourceMappingURL=entity-schemas.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-schemas.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/entity-schemas.resource.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAqQ5C,eAAO,MAAM,qBAAqB,EAAE,QAAQ,EAMzC,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,QASrC,CAAC"}
@@ -0,0 +1,264 @@
1
+ const cachedSchemas = new Map();
2
+ function campaignSchemaMarkdown() {
3
+ return `# Google Ads Campaign Schema
4
+
5
+ ## Fields
6
+
7
+ | Field | Type | Required | Description |
8
+ |-------|------|----------|-------------|
9
+ | \`name\` | string | **Yes** | Campaign name (unique within account) |
10
+ | \`advertisingChannelType\` | enum | **Yes** | \`SEARCH\`, \`DISPLAY\`, \`SHOPPING\`, \`VIDEO\`, \`MULTI_CHANNEL\`, \`PERFORMANCE_MAX\`, \`DEMAND_GEN\` |
11
+ | \`status\` | enum | No | \`ENABLED\`, \`PAUSED\`, \`REMOVED\` (default: \`ENABLED\`) |
12
+ | \`campaignBudget\` | string | **Yes** | Resource name of the campaign budget (e.g., \`customers/{id}/campaignBudgets/{budgetId}\`) |
13
+ | \`startDate\` | string | No | Start date in YYYY-MM-DD format |
14
+ | \`endDate\` | string | No | End date in YYYY-MM-DD format |
15
+ | \`biddingStrategyType\` | enum | No | \`MANUAL_CPC\`, \`MAXIMIZE_CONVERSIONS\`, \`MAXIMIZE_CONVERSION_VALUE\`, \`TARGET_CPA\`, \`TARGET_ROAS\`, etc. |
16
+ | \`manualCpc\` | object | Cond. | Manual CPC settings (when biddingStrategyType = MANUAL_CPC) |
17
+ | \`maximizeConversions\` | object | Cond. | Maximize conversions settings |
18
+ | \`targetCpa\` | object | Cond. | Target CPA settings with \`targetCpaMicros\` |
19
+ | \`targetRoas\` | object | Cond. | Target ROAS settings with \`targetRoas\` (float) |
20
+ | \`networkSettings\` | object | No | Network targeting (Search, Display, YouTube, partners) |
21
+ | \`geoTargetTypeSetting\` | object | No | Geo targeting type configuration |
22
+ | \`frequencyCaps\` | object[] | No | Frequency capping rules |
23
+ | \`urlCustomParameters\` | object[] | No | Custom URL parameters |
24
+
25
+ ## Network Settings Object
26
+
27
+ | Field | Type | Description |
28
+ |-------|------|-------------|
29
+ | \`targetGoogleSearch\` | boolean | Show ads on Google Search |
30
+ | \`targetSearchNetwork\` | boolean | Show ads on search partner sites |
31
+ | \`targetContentNetwork\` | boolean | Show ads on Display Network |
32
+ | \`targetPartnerSearchNetwork\` | boolean | Show ads on partner search network |
33
+
34
+ ## Notes
35
+ - \`campaignBudget\` must reference an existing CampaignBudget resource (create budget first).
36
+ - \`advertisingChannelType\` cannot be changed after creation.
37
+ - Use \`PERFORMANCE_MAX\` for AI-optimized campaigns across all Google surfaces.
38
+ - Bidding strategy fields are mutually exclusive — set only one.
39
+ `;
40
+ }
41
+ function adGroupSchemaMarkdown() {
42
+ return `# Google Ads Ad Group Schema
43
+
44
+ ## Fields
45
+
46
+ | Field | Type | Required | Description |
47
+ |-------|------|----------|-------------|
48
+ | \`name\` | string | **Yes** | Ad group name |
49
+ | \`campaign\` | string | **Yes** | Parent campaign resource name |
50
+ | \`status\` | enum | No | \`ENABLED\`, \`PAUSED\`, \`REMOVED\` |
51
+ | \`type\` | enum | No | \`SEARCH_STANDARD\`, \`DISPLAY_STANDARD\`, \`SHOPPING_PRODUCT_ADS\`, \`VIDEO_BUMPER\`, etc. |
52
+ | \`cpcBidMicros\` | string (int64) | No | Default max CPC bid in micros (1,000,000 micros = 1 currency unit) |
53
+ | \`cpmBidMicros\` | string (int64) | No | Default CPM bid in micros |
54
+ | \`targetCpaMicros\` | string (int64) | No | Target CPA bid in micros |
55
+ | \`targetRoas\` | number | No | Target ROAS (e.g., 2.0 = 200% return) |
56
+ | \`adRotationMode\` | enum | No | \`OPTIMIZE\`, \`ROTATE_FOREVER\` |
57
+ | \`urlCustomParameters\` | object[] | No | Custom URL parameters |
58
+
59
+ ## Notes
60
+ - \`campaign\` must be a valid campaign resource name: \`customers/{customerId}/campaigns/{campaignId}\`.
61
+ - \`cpcBidMicros\` is in micros: to set $2.50 bid, use \`"2500000"\`.
62
+ - Ad group type is typically inferred from the parent campaign's channel type.
63
+ - For Display campaigns, targeting options (audiences, placements) are set separately.
64
+ `;
65
+ }
66
+ function adSchemaMarkdown() {
67
+ return `# Google Ads Ad (AdGroupAd) Schema
68
+
69
+ ## Fields
70
+
71
+ | Field | Type | Required | Description |
72
+ |-------|------|----------|-------------|
73
+ | \`adGroup\` | string | **Yes** | Parent ad group resource name |
74
+ | \`status\` | enum | No | \`ENABLED\`, \`PAUSED\`, \`REMOVED\` |
75
+ | \`ad\` | object | **Yes** | The ad creative object (see below) |
76
+
77
+ ## Ad Object (varies by type)
78
+
79
+ ### Responsive Search Ad
80
+
81
+ | Field | Type | Required | Description |
82
+ |-------|------|----------|-------------|
83
+ | \`responsiveSearchAd\` | object | **Yes** | RSA creative content |
84
+ | \`responsiveSearchAd.headlines\` | object[] | **Yes** | 3-15 headline options (\`{ text: string }\`) |
85
+ | \`responsiveSearchAd.descriptions\` | object[] | **Yes** | 2-4 description options (\`{ text: string }\`) |
86
+ | \`responsiveSearchAd.path1\` | string | No | Display URL path 1 (max 15 chars) |
87
+ | \`responsiveSearchAd.path2\` | string | No | Display URL path 2 (max 15 chars) |
88
+ | \`finalUrls\` | string[] | **Yes** | Landing page URLs |
89
+ | \`finalMobileUrls\` | string[] | No | Mobile-specific landing pages |
90
+ | \`trackingUrlTemplate\` | string | No | Tracking URL template |
91
+
92
+ ### Responsive Display Ad
93
+
94
+ | Field | Type | Required | Description |
95
+ |-------|------|----------|-------------|
96
+ | \`responsiveDisplayAd\` | object | **Yes** | Display ad content |
97
+ | \`responsiveDisplayAd.headlines\` | object[] | **Yes** | Short headlines |
98
+ | \`responsiveDisplayAd.longHeadline\` | object | **Yes** | Long headline |
99
+ | \`responsiveDisplayAd.descriptions\` | object[] | **Yes** | Description options |
100
+ | \`responsiveDisplayAd.marketingImages\` | object[] | **Yes** | Marketing image assets |
101
+ | \`responsiveDisplayAd.squareMarketingImages\` | object[] | No | Square format images |
102
+ | \`responsiveDisplayAd.businessName\` | string | **Yes** | Business/brand name |
103
+ | \`finalUrls\` | string[] | **Yes** | Landing page URLs |
104
+
105
+ ## Notes
106
+ - Google Ads strongly favors Responsive Search Ads (RSA) over expanded text ads.
107
+ - Provide 8-15 headlines and 3-4 descriptions for best RSA performance.
108
+ - Headlines max 30 chars each; descriptions max 90 chars each.
109
+ - \`finalUrls\` is required for all ad types.
110
+ `;
111
+ }
112
+ function keywordSchemaMarkdown() {
113
+ return `# Google Ads Keyword (AdGroupCriterion) Schema
114
+
115
+ ## Fields
116
+
117
+ | Field | Type | Required | Description |
118
+ |-------|------|----------|-------------|
119
+ | \`adGroup\` | string | **Yes** | Parent ad group resource name |
120
+ | \`status\` | enum | No | \`ENABLED\`, \`PAUSED\`, \`REMOVED\` |
121
+ | \`keyword\` | object | **Yes** | Keyword targeting settings |
122
+ | \`keyword.text\` | string | **Yes** | The keyword text |
123
+ | \`keyword.matchType\` | enum | **Yes** | \`BROAD\`, \`PHRASE\`, \`EXACT\` |
124
+ | \`cpcBidMicros\` | string (int64) | No | Keyword-level max CPC bid override (in micros) |
125
+ | \`finalUrls\` | string[] | No | Keyword-level landing page override |
126
+ | \`negative\` | boolean | No | Whether this is a negative keyword |
127
+
128
+ ## Match Types
129
+
130
+ | Match Type | Behavior | Example for "running shoes" |
131
+ |------------|----------|---------------------------|
132
+ | \`BROAD\` | Shows for related searches | "buy sneakers", "jogging footwear" |
133
+ | \`PHRASE\` | Shows when search includes phrase | "best running shoes", "running shoes sale" |
134
+ | \`EXACT\` | Shows for exact or close variant | "running shoes", "running shoe" |
135
+
136
+ ## Notes
137
+ - Keywords are created as AdGroupCriterion resources.
138
+ - Bid in micros: $1.50 = \`"1500000"\`.
139
+ - Negative keywords exclude searches — set \`negative: true\`.
140
+ - Broad match is recommended with Smart Bidding strategies.
141
+ `;
142
+ }
143
+ function campaignBudgetSchemaMarkdown() {
144
+ return `# Google Ads Campaign Budget Schema
145
+
146
+ ## Fields
147
+
148
+ | Field | Type | Required | Description |
149
+ |-------|------|----------|-------------|
150
+ | \`name\` | string | No | Budget name (for reference) |
151
+ | \`amountMicros\` | string (int64) | **Yes** | Daily budget in micros (1,000,000 micros = 1 currency unit) |
152
+ | \`deliveryMethod\` | enum | No | \`STANDARD\` (spread evenly) or \`ACCELERATED\` (spend quickly, limited availability) |
153
+ | \`explicitlyShared\` | boolean | No | Whether budget is shared across campaigns |
154
+ | \`status\` | enum | Read-only | \`ENABLED\`, \`REMOVED\` |
155
+ | \`totalAmountMicros\` | string (int64) | No | Total lifetime budget in micros (optional) |
156
+
157
+ ## Notes
158
+ - Create budget first, then reference it in campaign creation via \`campaignBudget\` field.
159
+ - \`amountMicros\` is the **daily** budget: $50/day = \`"50000000"\`.
160
+ - A budget can be shared across multiple campaigns if \`explicitlyShared: true\`.
161
+ - \`STANDARD\` delivery is recommended — spreads spend evenly throughout the day.
162
+ `;
163
+ }
164
+ function assetSchemaMarkdown() {
165
+ return `# Google Ads Asset Schema
166
+
167
+ ## Overview
168
+
169
+ Assets are reusable building blocks (text, images, videos, etc.) that can be linked to
170
+ campaigns and ad groups via CampaignAsset and AdGroupAsset associations.
171
+
172
+ ## Common Fields
173
+
174
+ | Field | Type | Required | Description |
175
+ |-------|------|----------|-------------|
176
+ | \`name\` | string | No | Optional asset name for reference |
177
+ | \`type\` | enum | Read-only | Auto-set based on asset content: \`TEXT\`, \`IMAGE\`, \`YOUTUBE_VIDEO\`, \`CALLOUT\`, \`SITELINK\`, \`CALL\`, \`STRUCTURED_SNIPPET\`, etc. |
178
+ | \`resourceName\` | string | Read-only | \`customers/{customerId}/assets/{assetId}\` |
179
+
180
+ ## Asset Type-Specific Fields
181
+
182
+ ### Text Asset
183
+ | Field | Type | Description |
184
+ |-------|------|-------------|
185
+ | \`textAsset.text\` | string | The text content |
186
+
187
+ ### Image Asset
188
+ | Field | Type | Description |
189
+ |-------|------|-------------|
190
+ | \`imageAsset.data\` | bytes (base64) | Raw image data |
191
+ | \`imageAsset.fileSize\` | int64 | File size in bytes |
192
+ | \`imageAsset.mimeType\` | enum | \`IMAGE_JPEG\`, \`IMAGE_PNG\`, \`IMAGE_GIF\` |
193
+ | \`imageAsset.fullSize\` | object | Full-size image dimensions |
194
+
195
+ ### Sitelink Asset
196
+ | Field | Type | Description |
197
+ |-------|------|-------------|
198
+ | \`sitelinkAsset.linkText\` | string | Sitelink anchor text (max 25 chars) |
199
+ | \`sitelinkAsset.description1\` | string | Description line 1 |
200
+ | \`sitelinkAsset.description2\` | string | Description line 2 |
201
+ | \`finalUrls\` | string[] | Landing page URLs |
202
+
203
+ ### Callout Asset
204
+ | Field | Type | Description |
205
+ |-------|------|-------------|
206
+ | \`calloutAsset.calloutText\` | string | Callout text (max 25 chars) |
207
+
208
+ ### Call Asset
209
+ | Field | Type | Description |
210
+ |-------|------|-------------|
211
+ | \`callAsset.countryCode\` | string | Two-letter country code |
212
+ | \`callAsset.phoneNumber\` | string | Phone number string |
213
+
214
+ ## Notes
215
+ - Assets replaced the legacy Extension Feed Items API (removed in API v23).
216
+ - Create assets first, then link via \`CampaignAsset\` or \`AdGroupAsset\` associations.
217
+ - Assets can be shared across multiple campaigns/ad groups.
218
+ - At least 2 sitelink assets recommended for best ad performance.
219
+ `;
220
+ }
221
+ const SCHEMA_GENERATORS = {
222
+ campaign: campaignSchemaMarkdown,
223
+ adgroup: adGroupSchemaMarkdown,
224
+ ad: adSchemaMarkdown,
225
+ keyword: keywordSchemaMarkdown,
226
+ campaignbudget: campaignBudgetSchemaMarkdown,
227
+ asset: assetSchemaMarkdown,
228
+ };
229
+ const ENTITY_TYPES = ["campaign", "adGroup", "ad", "keyword", "campaignBudget", "asset"];
230
+ function getSchemaContent(entityType) {
231
+ const key = entityType.toLowerCase();
232
+ if (!cachedSchemas.has(key)) {
233
+ const generator = SCHEMA_GENERATORS[key];
234
+ if (generator) {
235
+ cachedSchemas.set(key, generator());
236
+ }
237
+ else {
238
+ return `# Unknown entity type: ${entityType}\n\nSupported types: ${ENTITY_TYPES.join(", ")}`;
239
+ }
240
+ }
241
+ return cachedSchemas.get(key);
242
+ }
243
+ let cachedAllSchemas;
244
+ function getAllSchemasMarkdown() {
245
+ return ENTITY_TYPES.map((t) => getSchemaContent(t)).join("\n---\n\n");
246
+ }
247
+ export const entitySchemaResources = ENTITY_TYPES.map((entityType) => ({
248
+ uri: `entity-schema://${entityType}`,
249
+ name: `Google Ads ${entityType} Schema`,
250
+ description: `Field reference for Google Ads ${entityType} entities including required fields, types, and nested objects`,
251
+ mimeType: "text/markdown",
252
+ getContent: () => getSchemaContent(entityType),
253
+ }));
254
+ export const entitySchemaAllResource = {
255
+ uri: "entity-schema://all",
256
+ name: "Google Ads All Entity Schemas",
257
+ description: "Combined field reference for all Google Ads entity types",
258
+ mimeType: "text/markdown",
259
+ getContent: () => {
260
+ cachedAllSchemas ??= getAllSchemasMarkdown();
261
+ return cachedAllSchemas;
262
+ },
263
+ };
264
+ //# sourceMappingURL=entity-schemas.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-schemas.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/entity-schemas.resource.ts"],"names":[],"mappings":"AAUA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD,SAAS,sBAAsB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCR,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBR,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CR,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BR,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDR,CAAC;AACF,CAAC;AAID,MAAM,iBAAiB,GAAiC;IACtD,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,qBAAqB;IAC9B,EAAE,EAAE,gBAAgB;IACpB,OAAO,EAAE,qBAAqB;IAC9B,cAAc,EAAE,4BAA4B;IAC5C,KAAK,EAAE,mBAAmB;CAC3B,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAU,CAAC;AAElG,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,0BAA0B,UAAU,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AACjC,CAAC;AAED,IAAI,gBAAoC,CAAC;AAEzC,SAAS,qBAAqB;IAC5B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAe,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjF,GAAG,EAAE,mBAAmB,UAAU,EAAE;IACpC,IAAI,EAAE,cAAc,UAAU,SAAS;IACvC,WAAW,EAAE,kCAAkC,UAAU,gEAAgE;IACzH,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC;CAC/C,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,uBAAuB,GAAa;IAC/C,GAAG,EAAE,qBAAqB;IAC1B,IAAI,EAAE,+BAA+B;IACrC,WAAW,EAAE,0DAA0D;IACvE,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,GAAG,EAAE;QACf,gBAAgB,KAAK,qBAAqB,EAAE,CAAC;QAC7C,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Resource } from "../types.js";
2
+ export declare const gaqlReferenceResource: Resource;
3
+ //# sourceMappingURL=gaql-reference.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaql-reference.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/gaql-reference.resource.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsJ5C,eAAO,MAAM,qBAAqB,EAAE,QAUnC,CAAC"}
@@ -0,0 +1,157 @@
1
+ let cachedContent;
2
+ function buildGaqlReferenceMarkdown() {
3
+ return `# GAQL (Google Ads Query Language) Reference
4
+
5
+ ## Query Structure
6
+
7
+ \`\`\`
8
+ SELECT field1, field2, metrics.metric1
9
+ FROM resource
10
+ WHERE condition1 AND condition2
11
+ ORDER BY field1 ASC
12
+ LIMIT 100
13
+ PARAMETERS include_drafts=true
14
+ \`\`\`
15
+
16
+ Only \`SELECT\` and \`FROM\` are required. All other clauses are optional.
17
+
18
+ ## Field Types
19
+
20
+ | Type | Example | Description |
21
+ |------|---------|-------------|
22
+ | **Resource fields** | \`campaign.name\`, \`campaign.id\` | Entity attributes |
23
+ | **Segment fields** | \`segments.date\`, \`segments.device\` | Breakdowns/dimensions |
24
+ | **Metrics** | \`metrics.impressions\`, \`metrics.clicks\` | Performance data |
25
+
26
+ ## Common Resources (FROM clause)
27
+
28
+ | Resource | Description | Key Fields |
29
+ |----------|-------------|------------|
30
+ | \`campaign\` | Campaign data | \`campaign.id\`, \`campaign.name\`, \`campaign.status\` |
31
+ | \`ad_group\` | Ad group data | \`ad_group.id\`, \`ad_group.name\`, \`ad_group.status\` |
32
+ | \`ad_group_ad\` | Ad data | \`ad_group_ad.ad.id\`, \`ad_group_ad.status\` |
33
+ | \`ad_group_criterion\` | Keywords/criteria | \`ad_group_criterion.keyword.text\`, \`ad_group_criterion.keyword.match_type\` |
34
+ | \`campaign_budget\` | Budget data | \`campaign_budget.amount_micros\`, \`campaign_budget.status\` |
35
+ | \`customer\` | Account data | \`customer.id\`, \`customer.descriptive_name\` |
36
+
37
+ ## Common Metrics
38
+
39
+ | Metric | Description |
40
+ |--------|-------------|
41
+ | \`metrics.impressions\` | Number of impressions |
42
+ | \`metrics.clicks\` | Number of clicks |
43
+ | \`metrics.ctr\` | Click-through rate (clicks/impressions) |
44
+ | \`metrics.average_cpc\` | Average cost per click (micros) |
45
+ | \`metrics.average_cpm\` | Average cost per thousand impressions (micros) |
46
+ | \`metrics.cost_micros\` | Total cost (micros) |
47
+ | \`metrics.conversions\` | Number of conversions |
48
+ | \`metrics.conversions_value\` | Total conversion value |
49
+ | \`metrics.cost_per_conversion\` | Cost per conversion (micros) |
50
+ | \`metrics.video_views\` | Video views |
51
+ | \`metrics.video_view_rate\` | Video view rate |
52
+
53
+ ## Common Segments
54
+
55
+ | Segment | Description |
56
+ |---------|-------------|
57
+ | \`segments.date\` | Date (YYYY-MM-DD) |
58
+ | \`segments.device\` | \`MOBILE\`, \`DESKTOP\`, \`TABLET\` |
59
+ | \`segments.ad_network_type\` | \`SEARCH\`, \`CONTENT\`, \`YOUTUBE_SEARCH\`, \`YOUTUBE_WATCH\` |
60
+ | \`segments.day_of_week\` | \`MONDAY\` through \`SUNDAY\` |
61
+ | \`segments.hour\` | Hour of day (0-23) |
62
+
63
+ ## WHERE Operators
64
+
65
+ | Operator | Example | Description |
66
+ |----------|---------|-------------|
67
+ | \`=\` | \`campaign.status = 'ENABLED'\` | Equals |
68
+ | \`!=\` | \`campaign.status != 'REMOVED'\` | Not equals |
69
+ | \`>\`, \`<\`, \`>=\`, \`<=\` | \`metrics.impressions > 100\` | Comparison |
70
+ | \`IN\` | \`campaign.status IN ('ENABLED', 'PAUSED')\` | Set membership |
71
+ | \`NOT IN\` | \`campaign.status NOT IN ('REMOVED')\` | Set exclusion |
72
+ | \`LIKE\` | \`campaign.name LIKE '%brand%'\` | Pattern match |
73
+ | \`CONTAINS ANY\` | \`campaign.labels CONTAINS ANY ('label1')\` | Label matching |
74
+ | \`IS NULL\` / \`IS NOT NULL\` | \`campaign.end_date IS NOT NULL\` | Null check |
75
+ | \`BETWEEN\` | \`segments.date BETWEEN '2025-01-01' AND '2025-01-31'\` | Date range |
76
+ | \`DURING\` | \`segments.date DURING LAST_30_DAYS\` | Relative date range |
77
+
78
+ ## DURING Predefined Ranges
79
+
80
+ \`TODAY\`, \`YESTERDAY\`, \`LAST_7_DAYS\`, \`LAST_14_DAYS\`, \`LAST_30_DAYS\`,
81
+ \`THIS_WEEK_MON_TODAY\`, \`THIS_MONTH\`, \`LAST_MONTH\`, \`THIS_QUARTER\`
82
+
83
+ ## Example Queries
84
+
85
+ ### Campaign Performance (Last 30 Days)
86
+ \`\`\`
87
+ SELECT campaign.name, campaign.status,
88
+ metrics.impressions, metrics.clicks, metrics.ctr,
89
+ metrics.cost_micros, metrics.conversions
90
+ FROM campaign
91
+ WHERE campaign.status != 'REMOVED'
92
+ AND segments.date DURING LAST_30_DAYS
93
+ ORDER BY metrics.cost_micros DESC
94
+ LIMIT 50
95
+ \`\`\`
96
+
97
+ ### Active Ad Groups with Performance
98
+ \`\`\`
99
+ SELECT ad_group.name, ad_group.status, ad_group.campaign,
100
+ metrics.impressions, metrics.clicks, metrics.average_cpc
101
+ FROM ad_group
102
+ WHERE ad_group.status = 'ENABLED'
103
+ AND segments.date DURING LAST_7_DAYS
104
+ ORDER BY metrics.impressions DESC
105
+ \`\`\`
106
+
107
+ ### Keywords with Low Quality Score
108
+ \`\`\`
109
+ SELECT ad_group_criterion.keyword.text,
110
+ ad_group_criterion.keyword.match_type,
111
+ ad_group_criterion.quality_info.quality_score,
112
+ metrics.impressions, metrics.clicks, metrics.average_cpc
113
+ FROM keyword_view
114
+ WHERE ad_group_criterion.quality_info.quality_score < 5
115
+ AND segments.date DURING LAST_30_DAYS
116
+ ORDER BY metrics.impressions DESC
117
+ \`\`\`
118
+
119
+ ### Daily Campaign Spend
120
+ \`\`\`
121
+ SELECT campaign.name, segments.date,
122
+ metrics.cost_micros, metrics.impressions, metrics.clicks
123
+ FROM campaign
124
+ WHERE segments.date DURING LAST_14_DAYS
125
+ AND campaign.status = 'ENABLED'
126
+ ORDER BY segments.date DESC
127
+ \`\`\`
128
+
129
+ ### Device Breakdown
130
+ \`\`\`
131
+ SELECT campaign.name, segments.device,
132
+ metrics.impressions, metrics.clicks, metrics.ctr
133
+ FROM campaign
134
+ WHERE segments.date DURING LAST_7_DAYS
135
+ AND campaign.status = 'ENABLED'
136
+ \`\`\`
137
+
138
+ ## Important Notes
139
+
140
+ - **Micros**: All monetary values are in micros. Divide by 1,000,000 for display currency.
141
+ - **Segment compatibility**: Not all segments can be combined. Use Google Ads FieldService for validation.
142
+ - **Date segments**: Adding \`segments.date\` returns one row per entity per day.
143
+ - **Resource limits**: Queries return max 10,000 rows by default; use \`LIMIT\` to control.
144
+ - **Removed entities**: By default, REMOVED entities are excluded. Add \`PARAMETERS include_drafts=true\` to include them.
145
+ `;
146
+ }
147
+ export const gaqlReferenceResource = {
148
+ uri: "gaql-reference://syntax",
149
+ name: "GAQL Syntax Reference",
150
+ description: "Google Ads Query Language syntax guide with common query patterns, operators, metrics, and segments",
151
+ mimeType: "text/markdown",
152
+ getContent: () => {
153
+ cachedContent ??= buildGaqlReferenceMarkdown();
154
+ return cachedContent;
155
+ },
156
+ };
157
+ //# sourceMappingURL=gaql-reference.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaql-reference.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/gaql-reference.resource.ts"],"names":[],"mappings":"AAUA,IAAI,aAAiC,CAAC;AAEtC,SAAS,0BAA0B;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8IR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,GAAG,EAAE,yBAAyB;IAC9B,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,qGAAqG;IACvG,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,GAAG,EAAE;QACf,aAAa,KAAK,0BAA0B,EAAE,CAAC;QAC/C,OAAO,aAAa,CAAC;IACvB,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { entityHierarchyResource } from "./entity-hierarchy.resource.js";
2
+ export { entitySchemaResources, entitySchemaAllResource } from "./entity-schemas.resource.js";
3
+ export { entityExampleResources, entityExampleAllResource } from "./entity-examples.resource.js";
4
+ export { gaqlReferenceResource } from "./gaql-reference.resource.js";
5
+ export { insightsReferenceResource } from "./insights-reference.resource.js";
6
+ import type { Resource } from "../types.js";
7
+ export declare const allResources: Resource[];
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAS7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAwB5C,eAAO,MAAM,YAAY,EAAE,QAAQ,EAUlC,CAAC"}
@@ -0,0 +1,42 @@
1
+ export { entityHierarchyResource } from "./entity-hierarchy.resource.js";
2
+ export { entitySchemaResources, entitySchemaAllResource } from "./entity-schemas.resource.js";
3
+ export { entityExampleResources, entityExampleAllResource } from "./entity-examples.resource.js";
4
+ export { gaqlReferenceResource } from "./gaql-reference.resource.js";
5
+ export { insightsReferenceResource } from "./insights-reference.resource.js";
6
+ import { entityHierarchyResource } from "./entity-hierarchy.resource.js";
7
+ import { entitySchemaResources, entitySchemaAllResource } from "./entity-schemas.resource.js";
8
+ import { entityExampleResources, entityExampleAllResource } from "./entity-examples.resource.js";
9
+ import { gaqlReferenceResource } from "./gaql-reference.resource.js";
10
+ import { insightsReferenceResource } from "./insights-reference.resource.js";
11
+ import { allTools } from "../../tools/definitions/index.js";
12
+ import { createToolExamplesResource, createServerCapabilitiesResource } from "@cesteral/shared";
13
+ const toolExamplesResource = createToolExamplesResource(allTools, "gads-mcp");
14
+ const serverCapabilitiesResource = createServerCapabilitiesResource({
15
+ serverName: "gads-mcp",
16
+ toolGroups: {
17
+ read: [
18
+ "gads_gaql_search",
19
+ "gads_list_accounts",
20
+ "gads_get_entity",
21
+ "gads_list_entities",
22
+ "gads_get_insights",
23
+ ],
24
+ write: ["gads_create_entity", "gads_update_entity", "gads_remove_entity"],
25
+ bulk: ["gads_bulk_mutate", "gads_bulk_update_status", "gads_adjust_bids"],
26
+ validation: ["gads_validate_entity"],
27
+ },
28
+ commonWorkflows: ["campaign_setup", "performance_analysis", "bulk_status_update"],
29
+ startHere: "gads_list_accounts",
30
+ });
31
+ export const allResources = [
32
+ entityHierarchyResource,
33
+ entitySchemaAllResource,
34
+ ...entitySchemaResources,
35
+ entityExampleAllResource,
36
+ ...entityExampleResources,
37
+ gaqlReferenceResource,
38
+ insightsReferenceResource,
39
+ ...(toolExamplesResource ? [toolExamplesResource] : []),
40
+ serverCapabilitiesResource,
41
+ ];
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAGhG,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC9E,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;IAClE,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,kBAAkB;YAClB,oBAAoB;YACpB,iBAAiB;YACjB,oBAAoB;YACpB,mBAAmB;SACpB;QACD,KAAK,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC;QACzE,IAAI,EAAE,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,CAAC;QACzE,UAAU,EAAE,CAAC,sBAAsB,CAAC;KACrC;IACD,eAAe,EAAE,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;IACjF,SAAS,EAAE,oBAAoB;CAChC,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,uBAAuB;IACvB,uBAAuB;IACvB,GAAG,qBAAqB;IACxB,wBAAwB;IACxB,GAAG,sBAAsB;IACzB,qBAAqB;IACrB,yBAAyB;IACzB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAA2C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,0BAAiD;CAClD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Resource } from "../types.js";
2
+ export declare const insightsReferenceResource: Resource;
3
+ //# sourceMappingURL=insights-reference.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights-reference.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/insights-reference.resource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,yBAAyB,EAAE,QA6EvC,CAAC"}