@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,221 @@
1
+ export const entityDuplicationWorkflowPrompt = {
2
+ name: "gads_entity_duplication_workflow",
3
+ description: "Step-by-step guide for duplicating Google Ads entities (campaigns, adGroups, ads, keywords) using the get-then-create pattern. Covers field stripping, naming conventions, and budget handling.",
4
+ arguments: [
5
+ {
6
+ name: "customerId",
7
+ description: "Google Ads customer ID (no dashes)",
8
+ required: true,
9
+ },
10
+ {
11
+ name: "entityType",
12
+ description: "Entity type to duplicate: campaign, adGroup, ad, or keyword",
13
+ required: true,
14
+ },
15
+ {
16
+ name: "sourceEntityId",
17
+ description: "ID of the source entity to copy from",
18
+ required: true,
19
+ },
20
+ ],
21
+ };
22
+ export function getEntityDuplicationWorkflowMessage(args) {
23
+ const customerId = args?.customerId || "{customerId}";
24
+ const entityType = args?.entityType || "{entityType}";
25
+ const sourceEntityId = args?.sourceEntityId || "{sourceEntityId}";
26
+ return `# Google Ads Entity Duplication Workflow
27
+
28
+ ## Context
29
+ - Customer ID: \`${customerId}\`
30
+ - Entity Type: \`${entityType}\`
31
+ - Source Entity ID: \`${sourceEntityId}\`
32
+ - Platform: Google Ads API v23
33
+
34
+ Google Ads has no native "duplicate" endpoint. Duplication is done by reading the source entity and creating a new one with adjusted fields.
35
+
36
+ ---
37
+
38
+ ## Step 1: Fetch the Source Entity
39
+
40
+ Retrieve the full source entity using GAQL to get all relevant fields:
41
+
42
+ \`\`\`
43
+ Tool: gads_get_entity
44
+ Input: {
45
+ "entityType": "${entityType}",
46
+ "customerId": "${customerId}",
47
+ "entityId": "${sourceEntityId}"
48
+ }
49
+ \`\`\`
50
+
51
+ **Save the full response** — you will use it as the template for the new entity.
52
+
53
+ ---
54
+
55
+ ## Step 2: Strip Immutable and ID Fields
56
+
57
+ Before creating the copy, remove the following fields from the response:
58
+ - \`id\` — auto-assigned by the API
59
+ - \`resource_name\` — auto-assigned by the API
60
+ - \`status\` — set explicitly to \`PAUSED\` for safety
61
+
62
+ ### Fields to strip by entity type
63
+
64
+ | Entity Type | Fields to Remove |
65
+ |-------------|-----------------|
66
+ | campaign | \`id\`, \`resource_name\`, \`campaign_budget\` (recreate separately) |
67
+ | adGroup | \`id\`, \`resource_name\` |
68
+ | ad | \`id\`, \`resource_name\`, \`ad.id\` |
69
+ | keyword | \`id\`, \`resource_name\` |
70
+
71
+ ---
72
+
73
+ ## Step 3: Adjust Name and Settings
74
+
75
+ Update the \`name\` to distinguish the copy from the original. Common conventions:
76
+ - Append " — Copy" (e.g., \`"Q1 Search Campaign — Copy"\`)
77
+ - Append a date or variant label (e.g., \`"Q1 Search Campaign — Q2"\`)
78
+
79
+ Set \`status\` to \`"PAUSED"\` initially — enable after verifying the copy is correct.
80
+
81
+ ---
82
+
83
+ ## Step 4: Handle Campaign Budget (Campaign Duplication Only)
84
+
85
+ ⚠️ **GOTCHA**: Campaigns cannot share a \`campaignBudget\` resource directly — each campaign needs its own budget resource or should link to an existing shared budget.
86
+
87
+ If duplicating a **campaign**, first create a new budget:
88
+
89
+ \`\`\`
90
+ Tool: gads_create_entity
91
+ Input: {
92
+ "entityType": "campaignBudget",
93
+ "customerId": "${customerId}",
94
+ "data": {
95
+ "name": "Q2 Search Campaign Budget — Copy",
96
+ "amountMicros": "{original amountMicros}",
97
+ "deliveryMethod": "STANDARD"
98
+ }
99
+ }
100
+ \`\`\`
101
+
102
+ Save the returned resource name — you will reference it in the campaign creation step.
103
+
104
+ ---
105
+
106
+ ## Step 5: Create the Duplicate
107
+
108
+ Create the new entity with the cleaned payload:
109
+
110
+ ### Duplicate a Campaign
111
+ \`\`\`
112
+ Tool: gads_create_entity
113
+ Input: {
114
+ "entityType": "campaign",
115
+ "customerId": "${customerId}",
116
+ "data": {
117
+ "name": "{original name} — Copy",
118
+ "advertisingChannelType": "{original advertisingChannelType}",
119
+ "status": "PAUSED",
120
+ "campaignBudget": "customers/${customerId}/campaignBudgets/{newBudgetId}",
121
+ "startDate": "{desired start date}",
122
+ "networkSettings": "{original networkSettings}",
123
+ "biddingStrategyType": "{original biddingStrategyType}"
124
+ }
125
+ }
126
+ \`\`\`
127
+
128
+ ### Duplicate an Ad Group
129
+ \`\`\`
130
+ Tool: gads_create_entity
131
+ Input: {
132
+ "entityType": "adGroup",
133
+ "customerId": "${customerId}",
134
+ "data": {
135
+ "name": "{original name} — Copy",
136
+ "campaign": "customers/${customerId}/campaigns/{targetCampaignId}",
137
+ "status": "PAUSED",
138
+ "type": "{original type}",
139
+ "cpcBidMicros": "{original cpcBidMicros}"
140
+ }
141
+ }
142
+ \`\`\`
143
+
144
+ ### Duplicate an Ad
145
+ \`\`\`
146
+ Tool: gads_create_entity
147
+ Input: {
148
+ "entityType": "ad",
149
+ "customerId": "${customerId}",
150
+ "data": {
151
+ "adGroup": "customers/${customerId}/adGroups/{targetAdGroupId}",
152
+ "status": "PAUSED",
153
+ "ad": {
154
+ "responsiveSearchAd": {
155
+ "headlines": "{original headlines}",
156
+ "descriptions": "{original descriptions}"
157
+ },
158
+ "finalUrls": "{original finalUrls}"
159
+ }
160
+ }
161
+ }
162
+ \`\`\`
163
+
164
+ ---
165
+
166
+ ## Step 6: Duplicate Child Entities (if needed)
167
+
168
+ When duplicating a campaign or ad group, you may also want to copy its children:
169
+
170
+ 1. **Campaign → Ad Groups**: List all ad groups under the source campaign, then duplicate each
171
+ 2. **Ad Group → Ads**: List all ads under the source ad group, then duplicate each
172
+ 3. **Ad Group → Keywords**: List all keywords under the source ad group, then duplicate each
173
+
174
+ \`\`\`
175
+ Tool: gads_list_entities
176
+ Input: {
177
+ "entityType": "adGroup",
178
+ "customerId": "${customerId}",
179
+ "filters": {
180
+ "ad_group.campaign": "= 'customers/${customerId}/campaigns/${sourceEntityId}'"
181
+ }
182
+ }
183
+ \`\`\`
184
+
185
+ ---
186
+
187
+ ## Step 7: Verify the Duplicate
188
+
189
+ Confirm the new entity was created correctly:
190
+
191
+ \`\`\`
192
+ Tool: gads_list_entities
193
+ Input: {
194
+ "entityType": "${entityType}",
195
+ "customerId": "${customerId}"
196
+ }
197
+ \`\`\`
198
+
199
+ Review the new entity's name, status, and settings. Enable it when satisfied.
200
+
201
+ ---
202
+
203
+ ## Success Checklist
204
+
205
+ - [ ] Source entity fetched and saved
206
+ - [ ] ID/resource_name fields stripped from template
207
+ - [ ] Name updated to distinguish copy from original
208
+ - [ ] Status set to PAUSED for initial creation
209
+ - [ ] For campaigns: new budget created separately and linked
210
+ - [ ] New entity created via \`gads_create_entity\`
211
+ - [ ] Child entities duplicated if needed (ad groups, ads, keywords)
212
+ - [ ] Duplicate verified via \`gads_list_entities\`
213
+ - [ ] Duplicate enabled when ready
214
+
215
+ ## Related Resources
216
+ - \`entity-schema://${entityType}\` — Full field reference for this entity type
217
+ - \`entity-hierarchy://gads\` — Entity parent-child relationships
218
+ - \`entity-examples://${entityType}\` — Example create payloads
219
+ `;
220
+ }
221
+ //# sourceMappingURL=entity-duplication-workflow.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-duplication-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,+BAA+B,GAAW;IACrD,IAAI,EAAE,kCAAkC;IACxC,WAAW,EACT,iMAAiM;IACnM,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,6DAA6D;YAC1E,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAC;AAEF,MAAM,UAAU,mCAAmC,CAAC,IAA6B;IAC/E,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,EAAE,cAAc,IAAI,kBAAkB,CAAC;IAElE,OAAO;;;mBAGU,UAAU;mBACV,UAAU;wBACL,cAAc;;;;;;;;;;;;;;mBAcnB,UAAU;mBACV,UAAU;iBACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA8CZ,UAAU;;;;;;;;;;;;;;;;;;;;;;mBAsBV,UAAU;;;;;mCAKM,UAAU;;;;;;;;;;;;;mBAa1B,UAAU;;;6BAGA,UAAU;;;;;;;;;;;;;mBAapB,UAAU;;4BAED,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA2BnB,UAAU;;yCAEY,UAAU,cAAc,cAAc;;;;;;;;;;;;;;mBAc5D,UAAU;mBACV,UAAU;;;;;;;;;;;;;;;;;;;;;sBAqBP,UAAU;;wBAER,UAAU;CACjC,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const entityUpdateWorkflowPrompt: Prompt;
3
+ export declare function getEntityUpdateWorkflowMessage(args?: Record<string, string>): string;
4
+ //# sourceMappingURL=entity-update-workflow.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-update-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/entity-update-workflow.prompt.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,0BAA0B,EAAE,MAsBxC,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAyLpF"}
@@ -0,0 +1,207 @@
1
+ export const entityUpdateWorkflowPrompt = {
2
+ name: "gads_entity_update_workflow",
3
+ description: "Step-by-step guide for safely updating Google Ads entities. Covers the read-then-update pattern with explicit updateMask for campaigns, adGroups, ads, keywords, campaignBudgets, and assets.",
4
+ arguments: [
5
+ {
6
+ name: "customerId",
7
+ description: "Google Ads customer ID (no dashes)",
8
+ required: true,
9
+ },
10
+ {
11
+ name: "entityType",
12
+ description: "Entity type to update: campaign, adGroup, ad, keyword, campaignBudget, or asset",
13
+ required: true,
14
+ },
15
+ {
16
+ name: "entityId",
17
+ description: "Google Ads entity ID to update",
18
+ required: true,
19
+ },
20
+ ],
21
+ };
22
+ export function getEntityUpdateWorkflowMessage(args) {
23
+ const customerId = args?.customerId || "{customerId}";
24
+ const entityType = args?.entityType || "{entityType}";
25
+ const entityId = args?.entityId || "{entityId}";
26
+ return `# Google Ads Entity Update Workflow
27
+
28
+ ## Context
29
+ - Customer ID: \`${customerId}\`
30
+ - Entity Type: \`${entityType}\`
31
+ - Entity ID: \`${entityId}\`
32
+ - Platform: Google Ads API v23
33
+
34
+ ---
35
+
36
+ ## ⚠️ Critical: Always Use updateMask
37
+
38
+ Google Ads uses **partial updates via updateMask**. The \`updateMask\` field is a comma-separated list of field paths to update. Only the listed fields are modified — all other fields are left untouched.
39
+
40
+ **Without updateMask**: The API may reject the request or update unexpected fields.
41
+ **With updateMask**: Only the specified fields are written; all others remain as-is.
42
+
43
+ ---
44
+
45
+ ## Step 1: Read Current State
46
+
47
+ Fetch the entity before modifying it to understand its current configuration.
48
+
49
+ \`\`\`
50
+ Tool: gads_gaql_search
51
+ Input: {
52
+ "customerId": "${customerId}",
53
+ "query": "SELECT ${entityType}.id, ${entityType}.name, ${entityType}.status, ${entityType}.resource_name FROM ${entityType} WHERE ${entityType}.id = ${entityId}"
54
+ }
55
+ \`\`\`
56
+
57
+ **Save the response** — particularly the \`resource_name\`, which is required for the update call.
58
+
59
+ > Resource name format: \`customers/${customerId}/${entityType}s/${entityId}\`
60
+
61
+ ---
62
+
63
+ ## Step 2: Build Your Update Payload
64
+
65
+ Only include the fields you want to change. The \`updateMask\` must list every field path you are setting in \`data\`.
66
+
67
+ ### Campaign — Pause a Campaign
68
+ \`\`\`
69
+ Tool: gads_update_entity
70
+ Input: {
71
+ "entityType": "campaign",
72
+ "customerId": "${customerId}",
73
+ "entityId": "${entityId}",
74
+ "data": {
75
+ "status": "PAUSED"
76
+ },
77
+ "updateMask": "status"
78
+ }
79
+ \`\`\`
80
+
81
+ ### Campaign — Update Name and End Date
82
+ \`\`\`
83
+ Tool: gads_update_entity
84
+ Input: {
85
+ "entityType": "campaign",
86
+ "customerId": "${customerId}",
87
+ "entityId": "${entityId}",
88
+ "data": {
89
+ "name": "Q2 Search Campaign — Revised",
90
+ "endDate": "2025-06-30"
91
+ },
92
+ "updateMask": "name,end_date"
93
+ }
94
+ \`\`\`
95
+
96
+ ### Ad Group — Update Default CPC Bid
97
+ \`\`\`
98
+ Tool: gads_update_entity
99
+ Input: {
100
+ "entityType": "adGroup",
101
+ "customerId": "${customerId}",
102
+ "entityId": "${entityId}",
103
+ "data": {
104
+ "cpcBidMicros": "3500000"
105
+ },
106
+ "updateMask": "cpc_bid_micros"
107
+ }
108
+ \`\`\`
109
+
110
+ ### Campaign Budget — Increase Daily Budget
111
+ \`\`\`
112
+ Tool: gads_update_entity
113
+ Input: {
114
+ "entityType": "campaignBudget",
115
+ "customerId": "${customerId}",
116
+ "entityId": "${entityId}",
117
+ "data": {
118
+ "amountMicros": "75000000"
119
+ },
120
+ "updateMask": "amount_micros"
121
+ }
122
+ \`\`\`
123
+
124
+ ### Keyword — Update Bid and Status
125
+ \`\`\`
126
+ Tool: gads_update_entity
127
+ Input: {
128
+ "entityType": "keyword",
129
+ "customerId": "${customerId}",
130
+ "entityId": "${entityId}",
131
+ "data": {
132
+ "status": "ENABLED",
133
+ "cpcBidMicros": "4000000"
134
+ },
135
+ "updateMask": "status,cpc_bid_micros"
136
+ }
137
+ \`\`\`
138
+
139
+ ---
140
+
141
+ ## Step 3: Execute the Update
142
+
143
+ Call \`gads_update_entity\` with your payload and updateMask. Review the response for field-level errors.
144
+
145
+ ---
146
+
147
+ ## Step 4: Verify the Change
148
+
149
+ Confirm the update was applied:
150
+
151
+ \`\`\`
152
+ Tool: gads_get_entity
153
+ Input: {
154
+ "entityType": "${entityType}",
155
+ "customerId": "${customerId}",
156
+ "entityId": "${entityId}"
157
+ }
158
+ \`\`\`
159
+
160
+ Compare the returned values with what you set in Step 2.
161
+
162
+ ---
163
+
164
+ ## Gotchas
165
+
166
+ - **updateMask field naming**: Use snake_case for updateMask paths (e.g., \`cpc_bid_micros\`, not \`cpcBidMicros\`). The \`data\` payload uses camelCase.
167
+ - **Resource name vs ID**: The API identifies entities by \`resource_name\` internally. Always verify the entity exists before updating.
168
+ - **Budget is shared**: \`campaignBudget.amountMicros\` is the daily budget, shared across all campaigns linked to it. Changing it affects all linked campaigns.
169
+ - **advertisingChannelType**: Cannot be changed after campaign creation.
170
+ - **Ad updates**: Most ad fields are immutable after creation. To change ad copy, create a new ad and pause/remove the old one.
171
+ - **Bulk status changes**: For pausing/enabling multiple entities, prefer \`gads_bulk_update_status\` over individual update calls.
172
+ - **Bid adjustments**: For batch bid changes across multiple ad groups, use \`gads_adjust_bids\` — it handles read-modify-write safely.
173
+
174
+ ---
175
+
176
+ ## Common updateMask Field Paths
177
+
178
+ | Entity | Field | updateMask Path |
179
+ |--------|-------|-----------------|
180
+ | campaign | status | \`status\` |
181
+ | campaign | name | \`name\` |
182
+ | campaign | end date | \`end_date\` |
183
+ | campaign | budget | \`campaign_budget\` |
184
+ | adGroup | status | \`status\` |
185
+ | adGroup | CPC bid | \`cpc_bid_micros\` |
186
+ | adGroup | name | \`name\` |
187
+ | campaignBudget | daily amount | \`amount_micros\` |
188
+ | keyword | status | \`status\` |
189
+ | keyword | CPC bid | \`cpc_bid_micros\` |
190
+
191
+ ---
192
+
193
+ ## Success Checklist
194
+
195
+ - [ ] Current entity state read via \`gads_gaql_search\` or \`gads_get_entity\`
196
+ - [ ] Update payload built with only the fields being changed
197
+ - [ ] \`updateMask\` set to comma-separated snake_case field paths
198
+ - [ ] \`gads_update_entity\` called and returned success
199
+ - [ ] Change verified by re-fetching the entity
200
+
201
+ ## Related Resources
202
+ - \`entity-schema://${entityType}\` — Full field reference for this entity type
203
+ - \`entity-hierarchy://gads\` — Entity relationships and resource name patterns
204
+ - \`gaql-reference://syntax\` — GAQL query syntax for reading current state
205
+ `;
206
+ }
207
+ //# sourceMappingURL=entity-update-workflow.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-update-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/entity-update-workflow.prompt.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,0BAA0B,GAAW;IAChD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,+LAA+L;IACjM,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,iFAAiF;YACnF,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAAC,IAA6B;IAC1E,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,YAAY,CAAC;IAEhD,OAAO;;;mBAGU,UAAU;mBACV,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;;;;;;;;;mBAqBN,UAAU;qBACR,UAAU,QAAQ,UAAU,UAAU,UAAU,YAAY,UAAU,uBAAuB,UAAU,UAAU,UAAU,SAAS,QAAQ;;;;;;sCAM3H,UAAU,IAAI,UAAU,KAAK,QAAQ;;;;;;;;;;;;;mBAaxD,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;mBAaN,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;;mBAcN,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;mBAaN,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;mBAaN,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;mBAwBN,UAAU;mBACV,UAAU;iBACZ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA8CH,UAAU;;;CAG/B,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const gaqlReportingWorkflowPrompt: Prompt;
3
+ export declare function getGaqlReportingWorkflowMessage(args?: Record<string, string>): string;
4
+ //# sourceMappingURL=gaql-reporting-workflow.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaql-reporting-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,2BAA2B,EAAE,MAWzC,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA0KrF"}
@@ -0,0 +1,182 @@
1
+ export const gaqlReportingWorkflowPrompt = {
2
+ name: "gaql_reporting_workflow",
3
+ description: "Step-by-step workflow for querying Google Ads performance data via GAQL, including common query patterns, field selection, and filtering",
4
+ arguments: [
5
+ {
6
+ name: "customerId",
7
+ description: "Google Ads Customer ID (without hyphens, e.g. 1234567890)",
8
+ required: true,
9
+ },
10
+ ],
11
+ };
12
+ export function getGaqlReportingWorkflowMessage(args) {
13
+ const customerId = args?.customerId || "{customerId}";
14
+ return `# GAQL Reporting Workflow
15
+
16
+ ## Context
17
+ - Customer ID: \`${customerId}\`
18
+ - Query Language: GAQL (Google Ads Query Language)
19
+ - Tool: \`gads_gaql_search\`
20
+
21
+ GAQL queries are synchronous — results are returned directly in the response. Use the \`gads_gaql_search\` tool to execute any GAQL query.
22
+
23
+ ---
24
+
25
+ ## Step 1: Choose Your Report Goal
26
+
27
+ Before writing a query, decide what question you're answering:
28
+
29
+ | Goal | Resource | Key Fields |
30
+ |------|----------|------------|
31
+ | Campaign overview | \`campaign\` | \`campaign.name\`, \`campaign.status\`, \`metrics.impressions\`, \`metrics.clicks\`, \`metrics.cost_micros\` |
32
+ | Ad group performance | \`ad_group\` | \`ad_group.name\`, \`ad_group.status\`, \`metrics.impressions\`, \`metrics.ctr\`, \`metrics.average_cpc\` |
33
+ | Keyword analysis | \`keyword_view\` | \`ad_group_criterion.keyword.text\`, \`ad_group_criterion.keyword.match_type\`, \`metrics.impressions\`, \`metrics.conversions\` |
34
+ | Search terms | \`search_term_view\` | \`search_term_view.search_term\`, \`metrics.impressions\`, \`metrics.clicks\`, \`metrics.conversions\` |
35
+ | Device breakdown | \`campaign\` | \`segments.device\`, \`metrics.impressions\`, \`metrics.clicks\`, \`metrics.cost_micros\` |
36
+ | Daily trend | \`campaign\` | \`segments.date\`, \`metrics.impressions\`, \`metrics.cost_micros\` |
37
+ | Conversion tracking | \`campaign\` | \`metrics.conversions\`, \`metrics.conversions_value\`, \`metrics.cost_per_conversion\` |
38
+ | Budget utilization | \`campaign_budget\` | \`campaign_budget.amount_micros\`, \`campaign_budget.total_amount_micros\`, \`metrics.cost_micros\` |
39
+
40
+ ---
41
+
42
+ ## Step 2: Write the GAQL Query
43
+
44
+ ### Query Structure
45
+ \`\`\`sql
46
+ SELECT
47
+ resource.field1,
48
+ resource.field2,
49
+ metrics.metric1,
50
+ segments.segment1
51
+ FROM resource
52
+ WHERE condition1
53
+ AND condition2
54
+ ORDER BY metrics.metric1 DESC
55
+ LIMIT 100
56
+ \`\`\`
57
+
58
+ ### Important GAQL Rules
59
+ - **No \`*\` wildcard** — you must list each field explicitly
60
+ - **Segments create row breakdowns** — adding \`segments.date\` gives one row per day per entity
61
+ - **Metrics are auto-aggregated** — \`metrics.cost_micros\` sums over the date range by default
62
+ - **cost_micros** — all monetary values are in micros (divide by 1,000,000 for actual currency)
63
+ - **Date filtering** — use \`segments.date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'\`
64
+
65
+ ---
66
+
67
+ ## Step 3: Run the Query
68
+
69
+ \`\`\`
70
+ Tool: gads_gaql_search
71
+ Input: {
72
+ "customerId": "${customerId}",
73
+ "query": "SELECT campaign.name, campaign.status, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.ctr FROM campaign WHERE campaign.status = 'ENABLED' AND segments.date DURING LAST_7_DAYS ORDER BY metrics.impressions DESC"
74
+ }
75
+ \`\`\`
76
+
77
+ ---
78
+
79
+ ## Step 4: Interpret Results
80
+
81
+ - \`metrics.cost_micros\` ÷ 1,000,000 = actual cost in account currency
82
+ - \`metrics.ctr\` is already a fraction (0.05 = 5%)
83
+ - \`metrics.average_cpc\` is in micros
84
+ - Empty results may mean the date range has no data or filters are too restrictive
85
+
86
+ ---
87
+
88
+ ## Common Query Patterns
89
+
90
+ ### Campaign Performance Summary
91
+ \`\`\`sql
92
+ SELECT
93
+ campaign.name,
94
+ campaign.status,
95
+ metrics.impressions,
96
+ metrics.clicks,
97
+ metrics.ctr,
98
+ metrics.cost_micros,
99
+ metrics.conversions,
100
+ metrics.cost_per_conversion
101
+ FROM campaign
102
+ WHERE campaign.status = 'ENABLED'
103
+ AND segments.date DURING LAST_30_DAYS
104
+ ORDER BY metrics.cost_micros DESC
105
+ \`\`\`
106
+
107
+ ### Daily Spend Trend (for pacing)
108
+ \`\`\`sql
109
+ SELECT
110
+ segments.date,
111
+ campaign.name,
112
+ metrics.cost_micros,
113
+ metrics.impressions
114
+ FROM campaign
115
+ WHERE campaign.id = {campaignId}
116
+ AND segments.date DURING LAST_14_DAYS
117
+ ORDER BY segments.date DESC
118
+ \`\`\`
119
+ Compare daily \`cost_micros / 1e6\` against \`campaign_budget.amount_micros / 1e6\`.
120
+
121
+ ### Top Keywords by Conversions
122
+ \`\`\`sql
123
+ SELECT
124
+ ad_group_criterion.keyword.text,
125
+ ad_group_criterion.keyword.match_type,
126
+ metrics.impressions,
127
+ metrics.clicks,
128
+ metrics.conversions,
129
+ metrics.cost_per_conversion
130
+ FROM keyword_view
131
+ WHERE campaign.id = {campaignId}
132
+ AND segments.date DURING LAST_30_DAYS
133
+ AND metrics.impressions > 0
134
+ ORDER BY metrics.conversions DESC
135
+ LIMIT 50
136
+ \`\`\`
137
+
138
+ ### Search Terms Report
139
+ \`\`\`sql
140
+ SELECT
141
+ search_term_view.search_term,
142
+ campaign.name,
143
+ metrics.impressions,
144
+ metrics.clicks,
145
+ metrics.conversions,
146
+ metrics.cost_micros
147
+ FROM search_term_view
148
+ WHERE campaign.id = {campaignId}
149
+ AND segments.date DURING LAST_30_DAYS
150
+ ORDER BY metrics.impressions DESC
151
+ LIMIT 100
152
+ \`\`\`
153
+
154
+ ---
155
+
156
+ ## Date Range Shortcuts
157
+
158
+ | GAQL Keyword | Meaning |
159
+ |-------------|---------|
160
+ | \`TODAY\` | Current day |
161
+ | \`YESTERDAY\` | Previous day |
162
+ | \`LAST_7_DAYS\` | Past 7 days (not including today) |
163
+ | \`LAST_14_DAYS\` | Past 14 days |
164
+ | \`LAST_30_DAYS\` | Past 30 days |
165
+ | \`THIS_MONTH\` | Current month to date |
166
+ | \`LAST_MONTH\` | Previous full month |
167
+ | \`LAST_BUSINESS_WEEK\` | Mon–Fri of previous week |
168
+
169
+ For custom ranges: \`segments.date BETWEEN '2025-01-01' AND '2025-01-31'\`
170
+
171
+ ---
172
+
173
+ ## Tips
174
+
175
+ - Start simple — add fields incrementally to avoid field compatibility errors
176
+ - Some segments can't be combined with certain resources — GAQL will return a clear error
177
+ - Use \`gads_list_entities\` to discover entity IDs before querying with GAQL
178
+ - For large accounts, always add \`LIMIT\` to avoid timeouts
179
+ - Combine with write tools: analyze GAQL results, then use \`gads_update_entity\` to act on insights
180
+ `;
181
+ }
182
+ //# sourceMappingURL=gaql-reporting-workflow.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaql-reporting-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,2BAA2B,GAAW;IACjD,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EACT,0IAA0I;IAC5I,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,2DAA2D;YACxE,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,IAA6B;IAC3E,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IAEtD,OAAO;;;mBAGU,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAuDV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G5B,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const targetingDiscoveryWorkflowPrompt: Prompt;
3
+ export declare function getTargetingDiscoveryWorkflowMessage(args?: Record<string, string>): string;
4
+ //# sourceMappingURL=targeting-discovery-workflow.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targeting-discovery-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,gCAAgC,EAAE,MAgB9C,CAAC;AAEF,wBAAgB,oCAAoC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA8M1F"}