@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.
- package/LICENSE.md +201 -0
- package/README.md +262 -0
- package/dist/auth/gads-auth-adapter.d.ts +31 -0
- package/dist/auth/gads-auth-adapter.d.ts.map +1 -0
- package/dist/auth/gads-auth-adapter.js +70 -0
- package/dist/auth/gads-auth-adapter.js.map +1 -0
- package/dist/auth/gads-auth-strategy.d.ts +9 -0
- package/dist/auth/gads-auth-strategy.d.ts.map +1 -0
- package/dist/auth/gads-auth-strategy.js +27 -0
- package/dist/auth/gads-auth-strategy.js.map +1 -0
- package/dist/config/index.d.ts +100 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +37 -0
- package/dist/config/index.js.map +1 -0
- package/dist/container/index.d.ts +5 -0
- package/dist/container/index.d.ts.map +1 -0
- package/dist/container/index.js +14 -0
- package/dist/container/index.js.map +1 -0
- package/dist/container/registrations/core.d.ts +3 -0
- package/dist/container/registrations/core.d.ts.map +1 -0
- package/dist/container/registrations/core.js +14 -0
- package/dist/container/registrations/core.js.map +1 -0
- package/dist/container/registrations/mcp.d.ts +2 -0
- package/dist/container/registrations/mcp.d.ts.map +1 -0
- package/dist/container/registrations/mcp.js +3 -0
- package/dist/container/registrations/mcp.js.map +1 -0
- package/dist/container/tokens.d.ts +6 -0
- package/dist/container/tokens.d.ts.map +1 -0
- package/dist/container/tokens.js +6 -0
- package/dist/container/tokens.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js +230 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js +237 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.js +154 -0
- package/dist/mcp-server/prompts/definitions/creative-setup-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js +299 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js +170 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js +221 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js +207 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.js +182 -0
- package/dist/mcp-server/prompts/definitions/gaql-reporting-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js +223 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js +125 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js +177 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/index.d.ts +9 -0
- package/dist/mcp-server/prompts/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/index.js +97 -0
- package/dist/mcp-server/prompts/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts +4 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.js +574 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js +124 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts +4 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.js +264 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/gaql-reference.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/gaql-reference.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/gaql-reference.resource.js +157 -0
- package/dist/mcp-server/resources/definitions/gaql-reference.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +8 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +42 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/insights-reference.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/insights-reference.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/insights-reference.resource.js +78 -0
- package/dist/mcp-server/resources/definitions/insights-reference.resource.js.map +1 -0
- package/dist/mcp-server/resources/index.d.ts +3 -0
- package/dist/mcp-server/resources/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/index.js +2 -0
- package/dist/mcp-server/resources/index.js.map +1 -0
- package/dist/mcp-server/resources/types.d.ts +8 -0
- package/dist/mcp-server/resources/types.d.ts.map +1 -0
- package/dist/mcp-server/resources/types.js +2 -0
- package/dist/mcp-server/resources/types.js.map +1 -0
- package/dist/mcp-server/server.d.ts +5 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +124 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts +270 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.js +189 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts +148 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js +141 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-mutate.tool.d.ts +136 -0
- package/dist/mcp-server/tools/definitions/bulk-mutate.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-mutate.tool.js +127 -0
- package/dist/mcp-server/tools/definitions/bulk-mutate.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts +185 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js +149 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts +123 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.js +98 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/gaql-search.tool.d.ts +197 -0
- package/dist/mcp-server/tools/definitions/gaql-search.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/gaql-search.tool.js +110 -0
- package/dist/mcp-server/tools/definitions/gaql-search.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts +87 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js +91 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts +92 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.js +87 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-insights.tool.d.ts +382 -0
- package/dist/mcp-server/tools/definitions/get-insights.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-insights.tool.js +246 -0
- package/dist/mcp-server/tools/definitions/get-insights.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-pacing-status.tool.d.ts +141 -0
- package/dist/mcp-server/tools/definitions/get-pacing-status.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-pacing-status.tool.js +163 -0
- package/dist/mcp-server/tools/definitions/get-pacing-status.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +18 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +53 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-accounts.tool.d.ts +54 -0
- package/dist/mcp-server/tools/definitions/list-accounts.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-accounts.tool.js +61 -0
- package/dist/mcp-server/tools/definitions/list-accounts.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts +220 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.js +112 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/remove-entity.tool.d.ts +116 -0
- package/dist/mcp-server/tools/definitions/remove-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/remove-entity.tool.js +120 -0
- package/dist/mcp-server/tools/definitions/remove-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts +129 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.js +91 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts +239 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.js +151 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +2 -0
- package/dist/mcp-server/tools/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/index.js +2 -0
- package/dist/mcp-server/tools/index.js.map +1 -0
- package/dist/mcp-server/tools/utils/computed-metrics.d.ts +8 -0
- package/dist/mcp-server/tools/utils/computed-metrics.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/computed-metrics.js +19 -0
- package/dist/mcp-server/tools/utils/computed-metrics.js.map +1 -0
- package/dist/mcp-server/tools/utils/entity-mapping.d.ts +22 -0
- package/dist/mcp-server/tools/utils/entity-mapping.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/entity-mapping.js +99 -0
- package/dist/mcp-server/tools/utils/entity-mapping.js.map +1 -0
- package/dist/mcp-server/tools/utils/gaql-helpers.d.ts +4 -0
- package/dist/mcp-server/tools/utils/gaql-helpers.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/gaql-helpers.js +82 -0
- package/dist/mcp-server/tools/utils/gaql-helpers.js.map +1 -0
- package/dist/mcp-server/tools/utils/parent-id-validation.d.ts +10 -0
- package/dist/mcp-server/tools/utils/parent-id-validation.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/parent-id-validation.js +58 -0
- package/dist/mcp-server/tools/utils/parent-id-validation.js.map +1 -0
- package/dist/mcp-server/tools/utils/resolve-session.d.ts +4 -0
- package/dist/mcp-server/tools/utils/resolve-session.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/resolve-session.js +6 -0
- package/dist/mcp-server/tools/utils/resolve-session.js.map +1 -0
- package/dist/mcp-server/transports/streamable-http-transport.d.ts +49 -0
- package/dist/mcp-server/transports/streamable-http-transport.d.ts.map +1 -0
- package/dist/mcp-server/transports/streamable-http-transport.js +84 -0
- package/dist/mcp-server/transports/streamable-http-transport.js.map +1 -0
- package/dist/services/gads/gads-http-client.d.ts +13 -0
- package/dist/services/gads/gads-http-client.d.ts.map +1 -0
- package/dist/services/gads/gads-http-client.js +113 -0
- package/dist/services/gads/gads-http-client.js.map +1 -0
- package/dist/services/gads/gads-service.d.ts +60 -0
- package/dist/services/gads/gads-service.d.ts.map +1 -0
- package/dist/services/gads/gads-service.js +363 -0
- package/dist/services/gads/gads-service.js.map +1 -0
- package/dist/services/gads/types.d.ts +211 -0
- package/dist/services/gads/types.d.ts.map +1 -0
- package/dist/services/gads/types.js +16 -0
- package/dist/services/gads/types.js.map +1 -0
- package/dist/services/session-services.d.ts +17 -0
- package/dist/services/session-services.d.ts.map +1 -0
- package/dist/services/session-services.js +14 -0
- package/dist/services/session-services.js.map +1 -0
- package/dist/types-global/mcp.d.ts +2 -0
- package/dist/types-global/mcp.d.ts.map +1 -0
- package/dist/types-global/mcp.js +2 -0
- package/dist/types-global/mcp.js.map +1 -0
- package/dist/utils/errors/index.d.ts +2 -0
- package/dist/utils/errors/index.d.ts.map +1 -0
- package/dist/utils/errors/index.js +2 -0
- package/dist/utils/errors/index.js.map +1 -0
- package/dist/utils/platform.d.ts +3 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +5 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/security/rate-limiter.d.ts +3 -0
- package/dist/utils/security/rate-limiter.d.ts.map +1 -0
- package/dist/utils/security/rate-limiter.js +5 -0
- package/dist/utils/security/rate-limiter.js.map +1 -0
- package/dist/utils/telemetry/index.d.ts +2 -0
- package/dist/utils/telemetry/index.d.ts.map +1 -0
- package/dist/utils/telemetry/index.js +2 -0
- package/dist/utils/telemetry/index.js.map +1 -0
- package/dist/utils/telemetry/tracing.d.ts +3 -0
- package/dist/utils/telemetry/tracing.d.ts.map +1 -0
- package/dist/utils/telemetry/tracing.js +4 -0
- package/dist/utils/telemetry/tracing.js.map +1 -0
- 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"}
|