@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,223 @@
|
|
|
1
|
+
export const targetingDiscoveryWorkflowPrompt = {
|
|
2
|
+
name: "gads_targeting_discovery_workflow",
|
|
3
|
+
description: "Step-by-step guide for discovering and analyzing Google Ads targeting segments via GAQL. Covers audience, keyword, geographic, and device targeting, plus performance insights by segment.",
|
|
4
|
+
arguments: [
|
|
5
|
+
{
|
|
6
|
+
name: "customerId",
|
|
7
|
+
description: "Google Ads customer ID (no dashes)",
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "campaignId",
|
|
12
|
+
description: "Campaign ID to scope targeting discovery (optional)",
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export function getTargetingDiscoveryWorkflowMessage(args) {
|
|
18
|
+
const customerId = args?.customerId || "{customerId}";
|
|
19
|
+
const campaignId = args?.campaignId || "{campaignId}";
|
|
20
|
+
return `# Google Ads Targeting Discovery Workflow
|
|
21
|
+
|
|
22
|
+
## Context
|
|
23
|
+
- Customer ID: \`${customerId}\`
|
|
24
|
+
- Campaign ID: \`${campaignId}\`
|
|
25
|
+
- Platform: Google Ads API v23
|
|
26
|
+
- Tool: \`gads_gaql_search\`, \`gads_get_insights\`
|
|
27
|
+
|
|
28
|
+
This workflow helps you explore what targeting is already applied, understand segment performance, and identify targeting opportunities.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 1: Understand Available Targeting Dimensions
|
|
33
|
+
|
|
34
|
+
Google Ads targeting operates across several dimensions:
|
|
35
|
+
|
|
36
|
+
| Dimension | Description | GAQL Resource |
|
|
37
|
+
|-----------|-------------|---------------|
|
|
38
|
+
| Keywords | Search query matching | \`keyword_view\` |
|
|
39
|
+
| Audiences | User interest / demographic segments | \`ad_group_audience_view\` |
|
|
40
|
+
| Geographic | Country, region, city, DMA | \`geographic_view\` |
|
|
41
|
+
| Device | Desktop, mobile, tablet | Segment via \`segments.device\` |
|
|
42
|
+
| Ad Schedule | Day of week, hour of day | Segment via \`segments.hour\`, \`segments.day_of_week\` |
|
|
43
|
+
| Demographics | Age, gender, parental status | \`age_range_view\`, \`gender_view\` |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Step 2: Discover Existing Keyword Targeting
|
|
48
|
+
|
|
49
|
+
List the keywords active in the campaign:
|
|
50
|
+
|
|
51
|
+
\`\`\`
|
|
52
|
+
Tool: gads_gaql_search
|
|
53
|
+
Input: {
|
|
54
|
+
"customerId": "${customerId}",
|
|
55
|
+
"query": "SELECT ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group.name, campaign.name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM keyword_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS AND ad_group_criterion.status != 'REMOVED' ORDER BY metrics.impressions DESC LIMIT 100"
|
|
56
|
+
}
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
**Analyze**: Identify high-impression / low-conversion keywords for bid adjustments or exclusion.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Step 3: Discover Geographic Performance
|
|
64
|
+
|
|
65
|
+
Identify which geographic locations are driving performance:
|
|
66
|
+
|
|
67
|
+
\`\`\`
|
|
68
|
+
Tool: gads_gaql_search
|
|
69
|
+
Input: {
|
|
70
|
+
"customerId": "${customerId}",
|
|
71
|
+
"query": "SELECT geographic_view.country_criterion_id, geographic_view.location_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.cost_per_conversion FROM geographic_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC LIMIT 50"
|
|
72
|
+
}
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
### Top Cities Query
|
|
76
|
+
\`\`\`
|
|
77
|
+
Tool: gads_gaql_search
|
|
78
|
+
Input: {
|
|
79
|
+
"customerId": "${customerId}",
|
|
80
|
+
"query": "SELECT segments.geo_target_city, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM campaign WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS ORDER BY metrics.impressions DESC LIMIT 50"
|
|
81
|
+
}
|
|
82
|
+
\`\`\`
|
|
83
|
+
|
|
84
|
+
**Analyze**: Look for high-cost / low-conversion geographies to exclude or reduce bids.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 4: Analyze Device Performance
|
|
89
|
+
|
|
90
|
+
Understand how performance varies by device type:
|
|
91
|
+
|
|
92
|
+
\`\`\`
|
|
93
|
+
Tool: gads_gaql_search
|
|
94
|
+
Input: {
|
|
95
|
+
"customerId": "${customerId}",
|
|
96
|
+
"query": "SELECT segments.device, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.ctr, metrics.conversions, metrics.cost_per_conversion FROM campaign WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS"
|
|
97
|
+
}
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
Device values: \`DESKTOP\`, \`MOBILE\`, \`TABLET\`, \`CONNECTED_TV\`
|
|
101
|
+
|
|
102
|
+
**Analyze**: If mobile CPAs are significantly higher, consider adding a mobile bid adjustment.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Step 5: Analyze Demographic Targeting
|
|
107
|
+
|
|
108
|
+
Review age and gender breakdowns:
|
|
109
|
+
|
|
110
|
+
### Age Range Performance
|
|
111
|
+
\`\`\`
|
|
112
|
+
Tool: gads_gaql_search
|
|
113
|
+
Input: {
|
|
114
|
+
"customerId": "${customerId}",
|
|
115
|
+
"query": "SELECT ad_group_criterion.age_range.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM age_range_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS ORDER BY metrics.impressions DESC"
|
|
116
|
+
}
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
### Gender Performance
|
|
120
|
+
\`\`\`
|
|
121
|
+
Tool: gads_gaql_search
|
|
122
|
+
Input: {
|
|
123
|
+
"customerId": "${customerId}",
|
|
124
|
+
"query": "SELECT ad_group_criterion.gender.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM gender_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS"
|
|
125
|
+
}
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Step 6: Discover Audience Segment Performance
|
|
131
|
+
|
|
132
|
+
Analyze in-market and affinity audience performance:
|
|
133
|
+
|
|
134
|
+
\`\`\`
|
|
135
|
+
Tool: gads_gaql_search
|
|
136
|
+
Input: {
|
|
137
|
+
"customerId": "${customerId}",
|
|
138
|
+
"query": "SELECT ad_group_audience_view.resource_name, user_list.name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM ad_group_audience_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS ORDER BY metrics.impressions DESC LIMIT 50"
|
|
139
|
+
}
|
|
140
|
+
\`\`\`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Step 7: Use gads_get_insights for Segment Summaries
|
|
145
|
+
|
|
146
|
+
For a higher-level view of performance by entity and segment:
|
|
147
|
+
|
|
148
|
+
\`\`\`
|
|
149
|
+
Tool: gads_get_insights
|
|
150
|
+
Input: {
|
|
151
|
+
"customerId": "${customerId}",
|
|
152
|
+
"entityType": "campaign",
|
|
153
|
+
"dateRange": "LAST_30_DAYS"
|
|
154
|
+
}
|
|
155
|
+
\`\`\`
|
|
156
|
+
|
|
157
|
+
This returns aggregated performance metrics and can surface top/bottom performers quickly.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Step 8: Discover Search Term Opportunities
|
|
162
|
+
|
|
163
|
+
Find new keyword opportunities from actual search queries:
|
|
164
|
+
|
|
165
|
+
\`\`\`
|
|
166
|
+
Tool: gads_gaql_search
|
|
167
|
+
Input: {
|
|
168
|
+
"customerId": "${customerId}",
|
|
169
|
+
"query": "SELECT search_term_view.search_term, search_term_view.status, metrics.impressions, metrics.clicks, metrics.conversions, metrics.cost_micros FROM search_term_view WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS AND metrics.impressions > 10 ORDER BY metrics.conversions DESC LIMIT 100"
|
|
170
|
+
}
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
**Analyze**:
|
|
174
|
+
- High-conversion search terms → add as exact/phrase match keywords
|
|
175
|
+
- Irrelevant terms → add as negative keywords
|
|
176
|
+
- High-spend / zero-conversion terms → investigate match type issues
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Step 9: Ad Schedule Performance
|
|
181
|
+
|
|
182
|
+
Identify the best hours and days to run ads:
|
|
183
|
+
|
|
184
|
+
\`\`\`
|
|
185
|
+
Tool: gads_gaql_search
|
|
186
|
+
Input: {
|
|
187
|
+
"customerId": "${customerId}",
|
|
188
|
+
"query": "SELECT segments.day_of_week, segments.hour, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM campaign WHERE campaign.id = ${campaignId} AND segments.date DURING LAST_30_DAYS ORDER BY metrics.conversions DESC"
|
|
189
|
+
}
|
|
190
|
+
\`\`\`
|
|
191
|
+
|
|
192
|
+
Day values: \`MONDAY\`, \`TUESDAY\`, \`WEDNESDAY\`, \`THURSDAY\`, \`FRIDAY\`, \`SATURDAY\`, \`SUNDAY\`
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Tips
|
|
197
|
+
|
|
198
|
+
- **Combine dimensions carefully**: Some segments cannot be combined in a single GAQL query. If you get an error, split into separate queries.
|
|
199
|
+
- **Micros conversion**: All cost values are in micros. Divide by 1,000,000 for actual currency.
|
|
200
|
+
- **Zero impressions**: Entities with 0 impressions in the date range may simply be new, paused, or have limited targeting.
|
|
201
|
+
- **Statistical significance**: Don't make targeting decisions on fewer than 100 impressions — results may be noise.
|
|
202
|
+
- **Act on insights**: Use \`gads_update_entity\` with \`updateMask\` to apply bid adjustments, or \`gads_create_entity\` to add new keywords/audiences discovered here.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Success Checklist
|
|
207
|
+
|
|
208
|
+
- [ ] Keyword targeting reviewed — high-waste keywords identified
|
|
209
|
+
- [ ] Geographic performance analyzed — low-performing locations noted
|
|
210
|
+
- [ ] Device breakdown reviewed — mobile/desktop bid adjustments considered
|
|
211
|
+
- [ ] Demographic performance reviewed — age/gender outliers identified
|
|
212
|
+
- [ ] Audience segments analyzed — underperforming segments flagged
|
|
213
|
+
- [ ] Search terms explored — new keyword opportunities discovered
|
|
214
|
+
- [ ] Ad schedule analyzed — peak hours/days identified
|
|
215
|
+
- [ ] Action plan created based on segment insights
|
|
216
|
+
|
|
217
|
+
## Related Resources
|
|
218
|
+
- \`gaql-reference://syntax\` — Full GAQL syntax and field reference
|
|
219
|
+
- \`entity-hierarchy://gads\` — Entity relationships and targeting structure
|
|
220
|
+
- \`entity-schema://keyword\` — Keyword entity field reference
|
|
221
|
+
`;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=targeting-discovery-workflow.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targeting-discovery-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,gCAAgC,GAAW;IACtD,IAAI,EAAE,mCAAmC;IACzC,WAAW,EACT,4LAA4L;IAC9L,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,oCAAoC,CAAC,IAA6B;IAChF,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IAEtD,OAAO;;;mBAGU,UAAU;mBACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA8BV,UAAU;0QAC6O,UAAU;;;;;;;;;;;;;;;mBAejQ,UAAU;8OACiN,UAAU;;;;;;;;mBAQrO,UAAU;+JACkI,UAAU;;;;;;;;;;;;;;;mBAetJ,UAAU;gMACmK,UAAU;;;;;;;;;;;;;;;;;;mBAkBvL,UAAU;8KACiJ,UAAU;;;;;;;;mBAQrK,UAAU;wKAC2I,UAAU;;;;;;;;;;;;;mBAa/J,UAAU;yMAC4K,UAAU;;;;;;;;;;;;;mBAahM,UAAU;;;;;;;;;;;;;;;;;mBAiBV,UAAU;oMACuK,UAAU;;;;;;;;;;;;;;;;;;mBAkB3L,UAAU;0KAC6I,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnL,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const toolSchemaExplorationPrompt: Prompt;
|
|
3
|
+
export declare function getToolSchemaExplorationMessage(args?: Record<string, string>): string;
|
|
4
|
+
//# sourceMappingURL=tool-schema-exploration.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schema-exploration.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/tool-schema-exploration.prompt.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,2BAA2B,EAAE,MAYzC,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAiHrF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export const toolSchemaExplorationPrompt = {
|
|
2
|
+
name: "gads_tool_schema_exploration",
|
|
3
|
+
description: "Step-by-step workflow for exploring available Google Ads MCP tools, prompts, and resources with minimal context usage",
|
|
4
|
+
arguments: [
|
|
5
|
+
{
|
|
6
|
+
name: "objective",
|
|
7
|
+
description: "Exploration objective (e.g., entity management, GAQL reporting, troubleshooting)",
|
|
8
|
+
required: false,
|
|
9
|
+
},
|
|
10
|
+
],
|
|
11
|
+
};
|
|
12
|
+
export function getToolSchemaExplorationMessage(args) {
|
|
13
|
+
const objective = args?.objective || "general capability discovery";
|
|
14
|
+
return `# Google Ads Tool and Schema Exploration
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
- Server: gads-mcp (Google Ads)
|
|
18
|
+
- Objective: ${objective}
|
|
19
|
+
|
|
20
|
+
Use this workflow to discover Google Ads MCP capabilities while minimizing token usage.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Step 1: List Capabilities
|
|
25
|
+
|
|
26
|
+
Run these three calls to see what's available:
|
|
27
|
+
1. \`tools/list\` — See all available tools
|
|
28
|
+
2. \`prompts/list\` — See workflow prompts
|
|
29
|
+
3. \`resources/list\` — See on-demand documentation resources
|
|
30
|
+
|
|
31
|
+
Do **not** fetch large resources before narrowing your scope.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 2: Identify Your Task Path
|
|
36
|
+
|
|
37
|
+
Pick one immediate action:
|
|
38
|
+
|
|
39
|
+
| Task | Start Here |
|
|
40
|
+
|------|-----------|
|
|
41
|
+
| Create a campaign structure | Prompt: \`gads_campaign_setup_workflow\` |
|
|
42
|
+
| Debug an entity issue | Prompt: \`gads_troubleshoot_entity\` |
|
|
43
|
+
| Understand entity fields | Resource: \`entity-schema://{entityType}\` |
|
|
44
|
+
| See CRUD examples | Resource: \`entity-examples://{entityType}\` |
|
|
45
|
+
| Learn entity relationships | Resource: \`entity-hierarchy://gads\` |
|
|
46
|
+
| Write GAQL queries | Resource: \`gaql-reference://syntax\` |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Step 3: Fetch Targeted Resources
|
|
51
|
+
|
|
52
|
+
Prefer specific resources over aggregate ones:
|
|
53
|
+
|
|
54
|
+
| Need | Fetch |
|
|
55
|
+
|------|-------|
|
|
56
|
+
| Campaign fields | \`entity-schema://campaign\` (not \`://all\`) |
|
|
57
|
+
| Ad group examples | \`entity-examples://adGroup\` (not \`://all\`) |
|
|
58
|
+
| Keyword examples | \`entity-examples://keyword\` |
|
|
59
|
+
| GAQL syntax | \`gaql-reference://syntax\` |
|
|
60
|
+
| Available metrics & date ranges | \`insights-reference://gads\` |
|
|
61
|
+
|
|
62
|
+
Only use \`://all\` resources when you need a cross-entity view.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Step 4: Execute a Minimal Tool Call
|
|
67
|
+
|
|
68
|
+
Start with the simplest useful call:
|
|
69
|
+
|
|
70
|
+
| Action | Tool | Minimal Input |
|
|
71
|
+
|--------|------|---------------|
|
|
72
|
+
| Check an entity | \`gads_get_entity\` | \`entityType\` + \`customerId\` + \`entityId\` |
|
|
73
|
+
| List entities | \`gads_list_entities\` | \`entityType\` + \`customerId\` |
|
|
74
|
+
| Run a GAQL query | \`gads_gaql_search\` | \`customerId\` + \`query\` |
|
|
75
|
+
| List accounts | \`gads_list_accounts\` | _(no arguments needed)_ |
|
|
76
|
+
|
|
77
|
+
Inspect the output, then iterate with more specific calls.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Available Tools Summary (15 tools)
|
|
82
|
+
|
|
83
|
+
### Read Tools
|
|
84
|
+
| Tool | Purpose | Notes |
|
|
85
|
+
|------|---------|-------|
|
|
86
|
+
| \`gads_gaql_search\` | Execute GAQL queries for ad-hoc reporting | Most flexible read tool |
|
|
87
|
+
| \`gads_list_accounts\` | List accessible customer accounts | No arguments needed |
|
|
88
|
+
| \`gads_get_entity\` | Get a single entity by type/ID | Returns full entity |
|
|
89
|
+
| \`gads_list_entities\` | List entities with optional GAQL filters | Supports pagination |
|
|
90
|
+
| \`gads_get_insights\` | Performance insights with preset params | Convenience wrapper |
|
|
91
|
+
|
|
92
|
+
### Write Tools
|
|
93
|
+
| Tool | Purpose | Notes |
|
|
94
|
+
|------|---------|-------|
|
|
95
|
+
| \`gads_create_entity\` | Create a new entity | Returns resource name |
|
|
96
|
+
| \`gads_update_entity\` | Update an entity | Requires \`updateMask\` |
|
|
97
|
+
| \`gads_remove_entity\` | Remove an entity | Sets status to REMOVED (permanent) |
|
|
98
|
+
| \`gads_bulk_mutate\` | Batch create/update/remove | Up to 5000 operations |
|
|
99
|
+
| \`gads_bulk_create_entities\` | Batch create entities | Max 50, partial failure |
|
|
100
|
+
| \`gads_bulk_update_status\` | Batch enable/pause/remove | Convenience wrapper |
|
|
101
|
+
| \`gads_adjust_bids\` | Batch adjust ad group bids | Safe read-modify-write |
|
|
102
|
+
| \`gads_validate_entity\` | Dry-run validate entity payload | Returns validation errors |
|
|
103
|
+
| \`gads_get_ad_preview\` | Get ad preview HTML/URL | Returns preview for an ad |
|
|
104
|
+
| \`gads_get_pacing_status\` | Real-time pacing calc for a campaign | Reads spend + budget |
|
|
105
|
+
|
|
106
|
+
### Supported Entity Types (6)
|
|
107
|
+
\`campaign\`, \`adGroup\`, \`ad\`, \`keyword\`, \`campaignBudget\`, \`asset\`
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Context-Minimization Rules
|
|
112
|
+
|
|
113
|
+
- Summarize fetched resources in your own words instead of pasting full content
|
|
114
|
+
- Reuse facts from previous tool calls instead of re-fetching
|
|
115
|
+
- Start with one tool call, inspect results, then decide next steps
|
|
116
|
+
- Avoid requesting \`://all\` resources unless you need a complete overview
|
|
117
|
+
|
|
118
|
+
## Suggested Next Steps
|
|
119
|
+
- For campaign setup: invoke \`gads_campaign_setup_workflow\` prompt
|
|
120
|
+
- For debugging: invoke \`gads_troubleshoot_entity\` prompt
|
|
121
|
+
- For ad-hoc reporting: use \`gads_gaql_search\` directly
|
|
122
|
+
- For bulk operations: use \`gads_bulk_mutate\` or \`gads_bulk_update_status\`
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=tool-schema-exploration.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schema-exploration.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/tool-schema-exploration.prompt.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,2BAA2B,GAAW;IACjD,IAAI,EAAE,8BAA8B;IACpC,WAAW,EACT,uHAAuH;IACzH,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,kFAAkF;YACpF,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,IAA6B;IAC3E,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,8BAA8B,CAAC;IAEpE,OAAO;;;;eAIM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGvB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const troubleshootEntityPrompt: Prompt;
|
|
3
|
+
export declare function getTroubleshootEntityMessage(args?: Record<string, string>): string;
|
|
4
|
+
//# sourceMappingURL=troubleshoot-entity.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"troubleshoot-entity.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/troubleshoot-entity.prompt.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,wBAAwB,EAAE,MAiBtC,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAgKlF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
export const troubleshootEntityPrompt = {
|
|
2
|
+
name: "gads_troubleshoot_entity",
|
|
3
|
+
description: "Step-by-step diagnostic workflow for troubleshooting Google Ads entity errors and common issues",
|
|
4
|
+
arguments: [
|
|
5
|
+
{
|
|
6
|
+
name: "entityType",
|
|
7
|
+
description: "Entity type to troubleshoot (campaign, adGroup, ad, keyword, campaignBudget, asset)",
|
|
8
|
+
required: false,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "errorMessage",
|
|
12
|
+
description: "The error message or symptom you are investigating",
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export function getTroubleshootEntityMessage(args) {
|
|
18
|
+
const entityType = args?.entityType || "{entityType}";
|
|
19
|
+
const errorMessage = args?.errorMessage || "(not specified)";
|
|
20
|
+
return `# Google Ads Entity Troubleshooting
|
|
21
|
+
|
|
22
|
+
## Context
|
|
23
|
+
- Entity Type: \`${entityType}\`
|
|
24
|
+
- Reported Error: ${errorMessage}
|
|
25
|
+
- Platform: Google Ads API v23
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Step 1: Verify the Entity Exists
|
|
30
|
+
|
|
31
|
+
\`\`\`
|
|
32
|
+
Tool: gads_get_entity
|
|
33
|
+
Input: { "entityType": "${entityType}", "customerId": "{customerId}", "entityId": "{entityId}" }
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
**Check**: Does the entity exist? What is its current status?
|
|
37
|
+
|
|
38
|
+
If the entity is not found, check:
|
|
39
|
+
- Is the \`customerId\` correct (no dashes, 10 digits)?
|
|
40
|
+
- For composite IDs (\`ad\`, \`keyword\`): is the format \`{adGroupId}~{criterionId}\`?
|
|
41
|
+
- Was the entity already removed?
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Step 2: Check Parent References
|
|
46
|
+
|
|
47
|
+
Google Ads entities form a strict hierarchy. Verify each parent exists:
|
|
48
|
+
|
|
49
|
+
| Entity | Parent | How to Check |
|
|
50
|
+
|--------|--------|-------------|
|
|
51
|
+
| \`campaign\` | \`campaignBudget\` | Budget resource name must exist |
|
|
52
|
+
| \`adGroup\` | \`campaign\` | Campaign resource name must exist |
|
|
53
|
+
| \`ad\` | \`adGroup\` | Ad group resource name must exist |
|
|
54
|
+
| \`keyword\` | \`adGroup\` | Ad group resource name must exist |
|
|
55
|
+
| \`asset\` | _(standalone)_ | No parent required |
|
|
56
|
+
|
|
57
|
+
Use GAQL to verify:
|
|
58
|
+
\`\`\`
|
|
59
|
+
Tool: gads_gaql_search
|
|
60
|
+
Input: {
|
|
61
|
+
"customerId": "{customerId}",
|
|
62
|
+
"query": "SELECT campaign.id, campaign.status FROM campaign WHERE campaign.id = {campaignId}"
|
|
63
|
+
}
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Step 3: Inspect Status Chain
|
|
69
|
+
|
|
70
|
+
An entity can only serve if its **entire hierarchy** is ENABLED:
|
|
71
|
+
|
|
72
|
+
\`\`\`
|
|
73
|
+
campaignBudget (has sufficient amount)
|
|
74
|
+
└── campaign (ENABLED)
|
|
75
|
+
└── adGroup (ENABLED)
|
|
76
|
+
├── ad (ENABLED, approved)
|
|
77
|
+
└── keyword (ENABLED, approved)
|
|
78
|
+
\`\`\`
|
|
79
|
+
|
|
80
|
+
Use GAQL to check the full chain:
|
|
81
|
+
\`\`\`
|
|
82
|
+
Tool: gads_gaql_search
|
|
83
|
+
Input: {
|
|
84
|
+
"customerId": "{customerId}",
|
|
85
|
+
"query": "SELECT campaign.status, ad_group.status, ad_group_ad.status, ad_group_ad.ad.type FROM ad_group_ad WHERE campaign.id = {campaignId} LIMIT 10"
|
|
86
|
+
}
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Step 4: Check Field Values and Constraints
|
|
92
|
+
|
|
93
|
+
### Common Field Issues
|
|
94
|
+
|
|
95
|
+
| Issue | Cause | Fix |
|
|
96
|
+
|-------|-------|-----|
|
|
97
|
+
| \`MUTATE_ERROR_CAMPAIGN_BUDGET_NOT_FOUND\` | Budget resource name doesn't exist | Create the budget first, then reference it |
|
|
98
|
+
| \`FIELD_MASK_ERROR_FIELD_NOT_FOUND\` | Invalid field in \`updateMask\` | Check \`entity-schema://${entityType}\` for valid fields |
|
|
99
|
+
| \`FIELD_ERROR_IMMUTABLE_FIELD\` | Trying to change an immutable field | \`advertisingChannelType\`, \`type\` cannot be changed after creation |
|
|
100
|
+
| \`VALUE_ERROR_MICROS_TOO_SMALL\` | Bid or budget is below minimum | Minimum CPC is usually $0.01 (10000 micros) |
|
|
101
|
+
| \`AD_ERROR_INVALID_HEADLINE\` | Headline too long or contains invalid chars | Max 30 chars, no exclamation marks in headlines |
|
|
102
|
+
| \`KEYWORD_ERROR_DUPLICATE_KEYWORD\` | Same keyword+match type already exists | Check existing keywords with \`gads_list_entities\` |
|
|
103
|
+
| \`RESOURCE_NOT_FOUND\` | Entity was removed or never existed | Check \`entityId\` and \`customerId\` |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Step 5: Validate Resource Names
|
|
108
|
+
|
|
109
|
+
Google Ads uses full resource name paths. Common format errors:
|
|
110
|
+
|
|
111
|
+
| Format | Example | Notes |
|
|
112
|
+
|--------|---------|-------|
|
|
113
|
+
| Campaign | \`customers/1234567890/campaigns/111222333\` | 10-digit customer ID, no dashes |
|
|
114
|
+
| Ad Group | \`customers/1234567890/adGroups/444555666\` | camelCase \`adGroups\` |
|
|
115
|
+
| Budget | \`customers/1234567890/campaignBudgets/777888999\` | camelCase \`campaignBudgets\` |
|
|
116
|
+
| Ad (composite) | \`{adGroupId}~{adId}\` | Tilde separator for get/update |
|
|
117
|
+
| Keyword (composite) | \`{adGroupId}~{criterionId}\` | Tilde separator for get/update |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Step 6: Common Error Resolution Patterns
|
|
122
|
+
|
|
123
|
+
### "Budget not found" when creating campaign
|
|
124
|
+
1. Create budget: \`gads_create_entity\` with \`entityType: "campaignBudget"\`
|
|
125
|
+
2. Note the returned resource name
|
|
126
|
+
3. Use that resource name in the campaign's \`campaignBudget\` field
|
|
127
|
+
|
|
128
|
+
### "Entity cannot be modified" (REMOVED status)
|
|
129
|
+
- Removed entities cannot be updated — create a new one instead
|
|
130
|
+
- REMOVED is permanent in Google Ads
|
|
131
|
+
|
|
132
|
+
### "Field mask required"
|
|
133
|
+
- \`gads_update_entity\` requires \`updateMask\` — a comma-separated list of fields being changed
|
|
134
|
+
- Example: \`"updateMask": "status,name"\`
|
|
135
|
+
|
|
136
|
+
### "Invalid customer ID"
|
|
137
|
+
- Customer ID must be 10 digits with no dashes
|
|
138
|
+
- Use \`gads_list_accounts\` to find correct IDs
|
|
139
|
+
- If using a manager account, set \`loginCustomerId\` in headers
|
|
140
|
+
|
|
141
|
+
### GAQL query errors
|
|
142
|
+
- Use \`gaql-reference://syntax\` resource for syntax reference
|
|
143
|
+
- Common issue: single quotes around string values are required
|
|
144
|
+
- Date format: \`'YYYY-MM-DD'\`
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Quick Diagnostic GAQL Queries
|
|
149
|
+
|
|
150
|
+
### Check campaign status and budget
|
|
151
|
+
\`\`\`sql
|
|
152
|
+
SELECT campaign.name, campaign.status, campaign_budget.amount_micros
|
|
153
|
+
FROM campaign WHERE campaign.id = {campaignId}
|
|
154
|
+
\`\`\`
|
|
155
|
+
|
|
156
|
+
### Find disapproved ads
|
|
157
|
+
\`\`\`sql
|
|
158
|
+
SELECT ad_group_ad.ad.id, ad_group_ad.policy_summary.approval_status
|
|
159
|
+
FROM ad_group_ad WHERE ad_group_ad.policy_summary.approval_status != 'APPROVED'
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
### Check keyword quality scores
|
|
163
|
+
\`\`\`sql
|
|
164
|
+
SELECT ad_group_criterion.keyword.text, ad_group_criterion.quality_info.quality_score
|
|
165
|
+
FROM keyword_view WHERE campaign.id = {campaignId}
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Related Resources
|
|
171
|
+
- \`entity-schema://${entityType}\` — Full field reference
|
|
172
|
+
- \`entity-examples://${entityType}\` — Example payloads
|
|
173
|
+
- \`entity-hierarchy://gads\` — Entity relationships
|
|
174
|
+
- \`gaql-reference://syntax\` — GAQL query syntax
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=troubleshoot-entity.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"troubleshoot-entity.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/troubleshoot-entity.prompt.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,wBAAwB,GAAW;IAC9C,IAAI,EAAE,0BAA0B;IAChC,WAAW,EACT,iGAAiG;IACnG,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,qFAAqF;YACvF,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,IAA6B;IACxE,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,iBAAiB,CAAC;IAE7D,OAAO;;;mBAGU,UAAU;oBACT,YAAY;;;;;;;;;0BASN,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qGAiEiE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAyEzF,UAAU;wBACR,UAAU;;;CAGjC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export interface PromptDefinition {
|
|
3
|
+
prompt: Prompt;
|
|
4
|
+
generateMessage: (args?: Record<string, string>) => string;
|
|
5
|
+
}
|
|
6
|
+
export declare const promptRegistry: Map<string, PromptDefinition>;
|
|
7
|
+
export declare function getAllPrompts(): Prompt[];
|
|
8
|
+
export declare function getPromptDefinition(name: string): PromptDefinition | undefined;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/prompts/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AA8CjE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;CAC5D;AAED,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CA8EvD,CAAC;AAEH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { campaignSetupWorkflowPrompt, getCampaignSetupWorkflowMessage, } from "./definitions/campaign-setup-workflow.prompt.js";
|
|
2
|
+
import { toolSchemaExplorationPrompt, getToolSchemaExplorationMessage, } from "./definitions/tool-schema-exploration.prompt.js";
|
|
3
|
+
import { troubleshootEntityPrompt, getTroubleshootEntityMessage, } from "./definitions/troubleshoot-entity.prompt.js";
|
|
4
|
+
import { gaqlReportingWorkflowPrompt, getGaqlReportingWorkflowMessage, } from "./definitions/gaql-reporting-workflow.prompt.js";
|
|
5
|
+
import { crossPlatformPerformancePrompt, getCrossPlatformPerformanceMessage, } from "./definitions/cross-platform-performance.prompt.js";
|
|
6
|
+
import { bulkOperationsWorkflowPrompt, getBulkOperationsWorkflowMessage, } from "./definitions/bulk-operations-workflow.prompt.js";
|
|
7
|
+
import { crossPlatformCampaignSetupPrompt, getCrossPlatformCampaignSetupMessage, } from "./definitions/cross-platform-campaign-setup.prompt.js";
|
|
8
|
+
import { entityUpdateWorkflowPrompt, getEntityUpdateWorkflowMessage, } from "./definitions/entity-update-workflow.prompt.js";
|
|
9
|
+
import { entityDuplicationWorkflowPrompt, getEntityDuplicationWorkflowMessage, } from "./definitions/entity-duplication-workflow.prompt.js";
|
|
10
|
+
import { targetingDiscoveryWorkflowPrompt, getTargetingDiscoveryWorkflowMessage, } from "./definitions/targeting-discovery-workflow.prompt.js";
|
|
11
|
+
import { gadsCreativeSetupWorkflowPrompt, getGadsCreativeSetupWorkflowMessage, } from "./definitions/creative-setup-workflow.prompt.js";
|
|
12
|
+
export const promptRegistry = new Map([
|
|
13
|
+
[
|
|
14
|
+
campaignSetupWorkflowPrompt.name,
|
|
15
|
+
{
|
|
16
|
+
prompt: campaignSetupWorkflowPrompt,
|
|
17
|
+
generateMessage: getCampaignSetupWorkflowMessage,
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
[
|
|
21
|
+
toolSchemaExplorationPrompt.name,
|
|
22
|
+
{
|
|
23
|
+
prompt: toolSchemaExplorationPrompt,
|
|
24
|
+
generateMessage: getToolSchemaExplorationMessage,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
[
|
|
28
|
+
troubleshootEntityPrompt.name,
|
|
29
|
+
{
|
|
30
|
+
prompt: troubleshootEntityPrompt,
|
|
31
|
+
generateMessage: getTroubleshootEntityMessage,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
[
|
|
35
|
+
gaqlReportingWorkflowPrompt.name,
|
|
36
|
+
{
|
|
37
|
+
prompt: gaqlReportingWorkflowPrompt,
|
|
38
|
+
generateMessage: getGaqlReportingWorkflowMessage,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
crossPlatformPerformancePrompt.name,
|
|
43
|
+
{
|
|
44
|
+
prompt: crossPlatformPerformancePrompt,
|
|
45
|
+
generateMessage: getCrossPlatformPerformanceMessage,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
bulkOperationsWorkflowPrompt.name,
|
|
50
|
+
{
|
|
51
|
+
prompt: bulkOperationsWorkflowPrompt,
|
|
52
|
+
generateMessage: getBulkOperationsWorkflowMessage,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
[
|
|
56
|
+
crossPlatformCampaignSetupPrompt.name,
|
|
57
|
+
{
|
|
58
|
+
prompt: crossPlatformCampaignSetupPrompt,
|
|
59
|
+
generateMessage: getCrossPlatformCampaignSetupMessage,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
entityUpdateWorkflowPrompt.name,
|
|
64
|
+
{
|
|
65
|
+
prompt: entityUpdateWorkflowPrompt,
|
|
66
|
+
generateMessage: getEntityUpdateWorkflowMessage,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
entityDuplicationWorkflowPrompt.name,
|
|
71
|
+
{
|
|
72
|
+
prompt: entityDuplicationWorkflowPrompt,
|
|
73
|
+
generateMessage: getEntityDuplicationWorkflowMessage,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
[
|
|
77
|
+
targetingDiscoveryWorkflowPrompt.name,
|
|
78
|
+
{
|
|
79
|
+
prompt: targetingDiscoveryWorkflowPrompt,
|
|
80
|
+
generateMessage: getTargetingDiscoveryWorkflowMessage,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
gadsCreativeSetupWorkflowPrompt.name,
|
|
85
|
+
{
|
|
86
|
+
prompt: gadsCreativeSetupWorkflowPrompt,
|
|
87
|
+
generateMessage: getGadsCreativeSetupWorkflowMessage,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
]);
|
|
91
|
+
export function getAllPrompts() {
|
|
92
|
+
return Array.from(promptRegistry.values()).map((def) => def.prompt);
|
|
93
|
+
}
|
|
94
|
+
export function getPromptDefinition(name) {
|
|
95
|
+
return promptRegistry.get(name);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp-server/prompts/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,GACpC,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,GACpC,MAAM,iDAAiD,CAAC;AAOzD,MAAM,CAAC,MAAM,cAAc,GAAkC,IAAI,GAAG,CAAC;IACnE;QACE,2BAA2B,CAAC,IAAI;QAChC;YACE,MAAM,EAAE,2BAA2B;YACnC,eAAe,EAAE,+BAA+B;SACjD;KACF;IACD;QACE,2BAA2B,CAAC,IAAI;QAChC;YACE,MAAM,EAAE,2BAA2B;YACnC,eAAe,EAAE,+BAA+B;SACjD;KACF;IACD;QACE,wBAAwB,CAAC,IAAI;QAC7B;YACE,MAAM,EAAE,wBAAwB;YAChC,eAAe,EAAE,4BAA4B;SAC9C;KACF;IACD;QACE,2BAA2B,CAAC,IAAI;QAChC;YACE,MAAM,EAAE,2BAA2B;YACnC,eAAe,EAAE,+BAA+B;SACjD;KACF;IACD;QACE,8BAA8B,CAAC,IAAI;QACnC;YACE,MAAM,EAAE,8BAA8B;YACtC,eAAe,EAAE,kCAAkC;SACpD;KACF;IACD;QACE,4BAA4B,CAAC,IAAI;QACjC;YACE,MAAM,EAAE,4BAA4B;YACpC,eAAe,EAAE,gCAAgC;SAClD;KACF;IACD;QACE,gCAAgC,CAAC,IAAI;QACrC;YACE,MAAM,EAAE,gCAAgC;YACxC,eAAe,EAAE,oCAAoC;SACtD;KACF;IACD;QACE,0BAA0B,CAAC,IAAI;QAC/B;YACE,MAAM,EAAE,0BAA0B;YAClC,eAAe,EAAE,8BAA8B;SAChD;KACF;IACD;QACE,+BAA+B,CAAC,IAAI;QACpC;YACE,MAAM,EAAE,+BAA+B;YACvC,eAAe,EAAE,mCAAmC;SACrD;KACF;IACD;QACE,gCAAgC,CAAC,IAAI;QACrC;YACE,MAAM,EAAE,gCAAgC;YACxC,eAAe,EAAE,oCAAoC;SACtD;KACF;IACD;QACE,+BAA+B,CAAC,IAAI;QACpC;YACE,MAAM,EAAE,+BAA+B;YACvC,eAAe,EAAE,mCAAmC;SACrD;KACF;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
|