@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,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const ConfigSchema: z.ZodObject<{
|
|
3
|
+
host: z.ZodDefault<z.ZodString>;
|
|
4
|
+
nodeEnv: z.ZodDefault<z.ZodEnum<["development", "production", "test"]>>;
|
|
5
|
+
mcpStatefulSessionTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
mcpAuthSecretKey: z.ZodOptional<z.ZodString>;
|
|
7
|
+
mcpAllowedOrigins: z.ZodOptional<z.ZodString>;
|
|
8
|
+
logLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "notice", "warning", "error"]>>;
|
|
9
|
+
mcpLogLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "notice", "warning", "error"]>>;
|
|
10
|
+
otelEnabled: z.ZodDefault<z.ZodBoolean>;
|
|
11
|
+
otelExporterOtlpTracesEndpoint: z.ZodOptional<z.ZodString>;
|
|
12
|
+
otelExporterOtlpMetricsEndpoint: z.ZodOptional<z.ZodString>;
|
|
13
|
+
gcsBucketName: z.ZodOptional<z.ZodString>;
|
|
14
|
+
} & {
|
|
15
|
+
serviceName: z.ZodDefault<z.ZodString>;
|
|
16
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
otelServiceName: z.ZodDefault<z.ZodString>;
|
|
18
|
+
mcpAuthMode: z.ZodDefault<z.ZodEnum<["gads-headers", "jwt", "none"]>>;
|
|
19
|
+
gadsApiBaseUrl: z.ZodDefault<z.ZodString>;
|
|
20
|
+
gadsRateLimitPerMinute: z.ZodDefault<z.ZodNumber>;
|
|
21
|
+
gadsDeveloperToken: z.ZodOptional<z.ZodString>;
|
|
22
|
+
gadsClientId: z.ZodOptional<z.ZodString>;
|
|
23
|
+
gadsClientSecret: z.ZodOptional<z.ZodString>;
|
|
24
|
+
gadsRefreshToken: z.ZodOptional<z.ZodString>;
|
|
25
|
+
gadsLoginCustomerId: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
serviceName: string;
|
|
28
|
+
port: number;
|
|
29
|
+
otelServiceName: string;
|
|
30
|
+
mcpAuthMode: "gads-headers" | "jwt" | "none";
|
|
31
|
+
gadsApiBaseUrl: string;
|
|
32
|
+
gadsRateLimitPerMinute: number;
|
|
33
|
+
host: string;
|
|
34
|
+
nodeEnv: "development" | "production" | "test";
|
|
35
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
36
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
37
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
38
|
+
otelEnabled: boolean;
|
|
39
|
+
gadsDeveloperToken?: string | undefined;
|
|
40
|
+
gadsClientId?: string | undefined;
|
|
41
|
+
gadsClientSecret?: string | undefined;
|
|
42
|
+
gadsRefreshToken?: string | undefined;
|
|
43
|
+
gadsLoginCustomerId?: string | undefined;
|
|
44
|
+
mcpAuthSecretKey?: string | undefined;
|
|
45
|
+
mcpAllowedOrigins?: string | undefined;
|
|
46
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
47
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
48
|
+
gcsBucketName?: string | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
serviceName?: string | undefined;
|
|
51
|
+
port?: number | undefined;
|
|
52
|
+
otelServiceName?: string | undefined;
|
|
53
|
+
mcpAuthMode?: "gads-headers" | "jwt" | "none" | undefined;
|
|
54
|
+
gadsApiBaseUrl?: string | undefined;
|
|
55
|
+
gadsRateLimitPerMinute?: number | undefined;
|
|
56
|
+
gadsDeveloperToken?: string | undefined;
|
|
57
|
+
gadsClientId?: string | undefined;
|
|
58
|
+
gadsClientSecret?: string | undefined;
|
|
59
|
+
gadsRefreshToken?: string | undefined;
|
|
60
|
+
gadsLoginCustomerId?: string | undefined;
|
|
61
|
+
host?: string | undefined;
|
|
62
|
+
nodeEnv?: "development" | "production" | "test" | undefined;
|
|
63
|
+
mcpStatefulSessionTimeoutMs?: number | undefined;
|
|
64
|
+
mcpAuthSecretKey?: string | undefined;
|
|
65
|
+
mcpAllowedOrigins?: string | undefined;
|
|
66
|
+
logLevel?: "debug" | "info" | "notice" | "warning" | "error" | undefined;
|
|
67
|
+
mcpLogLevel?: "debug" | "info" | "notice" | "warning" | "error" | undefined;
|
|
68
|
+
otelEnabled?: boolean | undefined;
|
|
69
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
70
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
71
|
+
gcsBucketName?: string | undefined;
|
|
72
|
+
}>;
|
|
73
|
+
export type AppConfig = z.infer<typeof ConfigSchema>;
|
|
74
|
+
export declare function parseConfig(): AppConfig;
|
|
75
|
+
export declare const mcpConfig: {
|
|
76
|
+
serviceName: string;
|
|
77
|
+
port: number;
|
|
78
|
+
otelServiceName: string;
|
|
79
|
+
mcpAuthMode: "gads-headers" | "jwt" | "none";
|
|
80
|
+
gadsApiBaseUrl: string;
|
|
81
|
+
gadsRateLimitPerMinute: number;
|
|
82
|
+
host: string;
|
|
83
|
+
nodeEnv: "development" | "production" | "test";
|
|
84
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
85
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
86
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
87
|
+
otelEnabled: boolean;
|
|
88
|
+
gadsDeveloperToken?: string | undefined;
|
|
89
|
+
gadsClientId?: string | undefined;
|
|
90
|
+
gadsClientSecret?: string | undefined;
|
|
91
|
+
gadsRefreshToken?: string | undefined;
|
|
92
|
+
gadsLoginCustomerId?: string | undefined;
|
|
93
|
+
mcpAuthSecretKey?: string | undefined;
|
|
94
|
+
mcpAllowedOrigins?: string | undefined;
|
|
95
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
96
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
97
|
+
gcsBucketName?: string | undefined;
|
|
98
|
+
};
|
|
99
|
+
export {};
|
|
100
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,WAAW,IAAI,SAAS,CA0BvC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;CAAgB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadDotEnv, BaseConfigSchema, getBaseEnvConfig, parseConfigWithSchema, getDefaultHost, } from "@cesteral/shared";
|
|
3
|
+
loadDotEnv();
|
|
4
|
+
const ConfigSchema = BaseConfigSchema.extend({
|
|
5
|
+
serviceName: z.string().default("gads-mcp"),
|
|
6
|
+
port: z.number().int().min(1).max(65535).default(3004),
|
|
7
|
+
otelServiceName: z.string().default("gads-mcp"),
|
|
8
|
+
mcpAuthMode: z.enum(["gads-headers", "jwt", "none"]).default("gads-headers"),
|
|
9
|
+
gadsApiBaseUrl: z.string().url().default("https://googleads.googleapis.com/v23"),
|
|
10
|
+
gadsRateLimitPerMinute: z.number().default(10),
|
|
11
|
+
gadsDeveloperToken: z.string().optional(),
|
|
12
|
+
gadsClientId: z.string().optional(),
|
|
13
|
+
gadsClientSecret: z.string().optional(),
|
|
14
|
+
gadsRefreshToken: z.string().optional(),
|
|
15
|
+
gadsLoginCustomerId: z.string().optional(),
|
|
16
|
+
});
|
|
17
|
+
export function parseConfig() {
|
|
18
|
+
const defaultHost = getDefaultHost();
|
|
19
|
+
const rawConfig = {
|
|
20
|
+
...getBaseEnvConfig(defaultHost),
|
|
21
|
+
serviceName: process.env.SERVICE_NAME,
|
|
22
|
+
...(process.env.GADS_MCP_PORT ? { port: Number(process.env.GADS_MCP_PORT) } : {}),
|
|
23
|
+
host: process.env.GADS_MCP_HOST || defaultHost,
|
|
24
|
+
gadsApiBaseUrl: process.env.GADS_API_BASE_URL,
|
|
25
|
+
gadsRateLimitPerMinute: process.env.GADS_RATE_LIMIT_PER_MINUTE
|
|
26
|
+
? Number(process.env.GADS_RATE_LIMIT_PER_MINUTE)
|
|
27
|
+
: undefined,
|
|
28
|
+
gadsDeveloperToken: process.env.GADS_DEVELOPER_TOKEN,
|
|
29
|
+
gadsClientId: process.env.GADS_CLIENT_ID,
|
|
30
|
+
gadsClientSecret: process.env.GADS_CLIENT_SECRET,
|
|
31
|
+
gadsRefreshToken: process.env.GADS_REFRESH_TOKEN,
|
|
32
|
+
gadsLoginCustomerId: process.env.GADS_LOGIN_CUSTOMER_ID,
|
|
33
|
+
};
|
|
34
|
+
return parseConfigWithSchema(ConfigSchema, rawConfig);
|
|
35
|
+
}
|
|
36
|
+
export const mcpConfig = parseConfig();
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,UAAU,EAAE,CAAC;AAEb,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAE3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACtD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IAG/C,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAG5E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC;IAIhF,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAG9C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAIH,MAAM,UAAU,WAAW;IACzB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,SAAS,GAA4B;QACzC,GAAG,gBAAgB,CAAC,WAAW,CAAC;QAGhC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW;QAG9C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7C,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;YAC5D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAChD,CAAC,CAAC,SAAS;QAGb,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QACpD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACxC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAChD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAChD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;KACxD,CAAC;IAEF,OAAO,qBAAqB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/container/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAStD;AAED,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { registerCoreServices } from "./registrations/core.js";
|
|
3
|
+
import { registerMcpServices } from "./registrations/mcp.js";
|
|
4
|
+
let isContainerComposed = false;
|
|
5
|
+
export function composeContainer(logger) {
|
|
6
|
+
if (isContainerComposed) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
registerCoreServices(logger);
|
|
10
|
+
registerMcpServices();
|
|
11
|
+
isContainerComposed = true;
|
|
12
|
+
}
|
|
13
|
+
export * as Tokens from "./tokens.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/container/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,mBAAmB,EAAE,CAAC;IAEtB,mBAAmB,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/container/registrations/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAS1D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { container } from "tsyringe";
|
|
2
|
+
import { createLogger } from "@cesteral/shared";
|
|
3
|
+
import { appConfig } from "../../config/index.js";
|
|
4
|
+
import * as Tokens from "../tokens.js";
|
|
5
|
+
import { rateLimiter } from "../../utils/security/rate-limiter.js";
|
|
6
|
+
import { requestContextService } from "@cesteral/shared";
|
|
7
|
+
export function registerCoreServices(logger) {
|
|
8
|
+
container.register(Tokens.AppConfig, { useValue: appConfig });
|
|
9
|
+
const loggerInstance = logger || createLogger("gads-mcp");
|
|
10
|
+
container.register(Tokens.Logger, { useValue: loggerInstance });
|
|
11
|
+
container.register(Tokens.RequestContextService, { useValue: requestContextService });
|
|
12
|
+
container.register(Tokens.RateLimiterService, { useValue: rateLimiter });
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/container/registrations/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAEhE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAEtF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/container/registrations/mcp.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/container/registrations/mcp.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,mBAAmB;AAInC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const AppConfig: unique symbol;
|
|
2
|
+
export declare const Logger: unique symbol;
|
|
3
|
+
export declare const RateLimiterService: unique symbol;
|
|
4
|
+
export declare const RequestContextService: unique symbol;
|
|
5
|
+
export declare const ResourceRegistry: unique symbol;
|
|
6
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/container/tokens.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,eAAsB,CAAC;AAC7C,eAAO,MAAM,MAAM,eAAmB,CAAC;AAGvC,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAGrE,eAAO,MAAM,gBAAgB,eAA6B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const AppConfig = Symbol("AppConfig");
|
|
2
|
+
export const Logger = Symbol("Logger");
|
|
3
|
+
export const RateLimiterService = Symbol("RateLimiterService");
|
|
4
|
+
export const RequestContextService = Symbol("RequestContextService");
|
|
5
|
+
export const ResourceRegistry = Symbol("ResourceRegistry");
|
|
6
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/container/tokens.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAGvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAGrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mcpConfig } from "./config/index.js";
|
|
3
|
+
import { createMcpServer, runStdioServer } from "./mcp-server/server.js";
|
|
4
|
+
import { startHttpServer } from "./mcp-server/transports/streamable-http-transport.js";
|
|
5
|
+
import { initializeOpenTelemetry, otelLogMixin } from "@cesteral/shared";
|
|
6
|
+
import { GAdsRefreshTokenAuthAdapter } from "./auth/gads-auth-adapter.js";
|
|
7
|
+
import { detectTransportMode, createServerLogger, bootstrapMcpServer } from "@cesteral/shared";
|
|
8
|
+
import { createSessionServices, sessionServiceStore } from "./services/session-services.js";
|
|
9
|
+
import { rateLimiter } from "./utils/platform.js";
|
|
10
|
+
const transportMode = detectTransportMode();
|
|
11
|
+
const logger = createServerLogger("gads-mcp", transportMode, otelLogMixin());
|
|
12
|
+
async function setupStdioCredentials(sessionId) {
|
|
13
|
+
const developerToken = mcpConfig.gadsDeveloperToken;
|
|
14
|
+
const clientId = mcpConfig.gadsClientId;
|
|
15
|
+
const clientSecret = mcpConfig.gadsClientSecret;
|
|
16
|
+
const refreshToken = mcpConfig.gadsRefreshToken;
|
|
17
|
+
if (!developerToken || !clientId || !clientSecret || !refreshToken) {
|
|
18
|
+
logger.warn("No Google Ads credentials found in env vars. " +
|
|
19
|
+
"Set GADS_DEVELOPER_TOKEN, GADS_CLIENT_ID, GADS_CLIENT_SECRET, and GADS_REFRESH_TOKEN for stdio mode.");
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const authAdapter = new GAdsRefreshTokenAuthAdapter({
|
|
23
|
+
developerToken,
|
|
24
|
+
clientId,
|
|
25
|
+
clientSecret,
|
|
26
|
+
refreshToken,
|
|
27
|
+
loginCustomerId: mcpConfig.gadsLoginCustomerId,
|
|
28
|
+
});
|
|
29
|
+
await authAdapter.validate();
|
|
30
|
+
const services = createSessionServices(authAdapter, { baseUrl: mcpConfig.gadsApiBaseUrl }, logger, rateLimiter);
|
|
31
|
+
sessionServiceStore.set(sessionId, services);
|
|
32
|
+
logger.info("Stdio session services created successfully");
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
bootstrapMcpServer({
|
|
36
|
+
serviceName: "gads-mcp",
|
|
37
|
+
config: mcpConfig,
|
|
38
|
+
logger,
|
|
39
|
+
transportMode,
|
|
40
|
+
initOtel: initializeOpenTelemetry,
|
|
41
|
+
setupStdioSession: setupStdioCredentials,
|
|
42
|
+
createMcpServer,
|
|
43
|
+
runStdio: runStdioServer,
|
|
44
|
+
startHttp: startHttpServer,
|
|
45
|
+
onShutdown: () => rateLimiter.destroy(),
|
|
46
|
+
}).catch((err) => {
|
|
47
|
+
logger.fatal({ err }, "Failed to start gads-mcp");
|
|
48
|
+
process.exit(1);
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AACvF,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;AAM7E,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IACpD,MAAM,cAAc,GAAG,SAAS,CAAC,kBAAkB,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;IACxC,MAAM,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC;IAChD,MAAM,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC;IAEhD,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,CACT,+CAA+C;YAC7C,sGAAsG,CACzG,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,2BAA2B,CAAC;QAClD,cAAc;QACd,QAAQ;QACR,YAAY;QACZ,YAAY;QACZ,eAAe,EAAE,SAAS,CAAC,mBAAmB;KAC/C,CAAC,CAAC;IAGH,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,qBAAqB,CACpC,WAAW,EACX,EAAE,OAAO,EAAE,SAAS,CAAC,cAAc,EAAE,EACrC,MAAM,EACN,WAAW,CACZ,CAAC;IAEF,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kBAAkB,CAAC;IACjB,WAAW,EAAE,UAAU;IACvB,MAAM,EAAE,SAAS;IACjB,MAAM;IACN,aAAa;IACb,QAAQ,EAAE,uBAAuB;IACjC,iBAAiB,EAAE,qBAAqB;IACxC,eAAe;IACf,QAAQ,EAAE,cAAc;IACxB,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;CACxC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const bulkOperationsWorkflowPrompt: Prompt;
|
|
3
|
+
export declare function getBulkOperationsWorkflowMessage(args?: Record<string, string>): string;
|
|
4
|
+
//# sourceMappingURL=bulk-operations-workflow.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAQjE,eAAO,MAAM,4BAA4B,EAAE,MAgB1C,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAqNtF"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export const bulkOperationsWorkflowPrompt = {
|
|
2
|
+
name: "gads_bulk_operations_workflow",
|
|
3
|
+
description: "Step-by-step guide for Google Ads bulk operations: batch mutate (create+update+remove), batch status changes, batch bid adjustments, and entity removal. Covers atomic vs partial failure, micros conversion, and verification.",
|
|
4
|
+
arguments: [
|
|
5
|
+
{
|
|
6
|
+
name: "customerId",
|
|
7
|
+
description: "Google Ads customer ID (no dashes)",
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "operation",
|
|
12
|
+
description: "Operation type: 'mutate', 'status', 'bids', or 'remove' (default: status)",
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export function getBulkOperationsWorkflowMessage(args) {
|
|
18
|
+
const customerId = args?.customerId || "{customerId}";
|
|
19
|
+
const operation = args?.operation || "status";
|
|
20
|
+
return `# Google Ads Bulk Operations Workflow
|
|
21
|
+
|
|
22
|
+
Customer ID: \`${customerId}\`
|
|
23
|
+
Operation: \`${operation}\`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Overview
|
|
28
|
+
|
|
29
|
+
Google Ads supports these bulk operation tools:
|
|
30
|
+
|
|
31
|
+
| Tool | Purpose | Max Items | Default Behavior |
|
|
32
|
+
|------|---------|-----------|-----------------|
|
|
33
|
+
| \`gads_bulk_mutate\` | Multi-operation mutate (create+update+remove) | 5,000 | Atomic (all-or-nothing) |
|
|
34
|
+
| \`gads_bulk_update_status\` | Batch enable/pause/remove entities | 100 | Partial success |
|
|
35
|
+
| \`gads_adjust_bids\` | Batch adjust ad group CPC/CPM bids | 50 | Per-item results |
|
|
36
|
+
| \`gads_remove_entity\` | Remove a single entity | 1 | N/A |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Bulk Status Updates
|
|
41
|
+
|
|
42
|
+
The simplest bulk operation. Use to enable, pause, or remove multiple entities.
|
|
43
|
+
|
|
44
|
+
### Step 1: Identify Entities
|
|
45
|
+
|
|
46
|
+
\`\`\`json
|
|
47
|
+
{
|
|
48
|
+
"tool": "gads_list_entities",
|
|
49
|
+
"params": {
|
|
50
|
+
"entityType": "adGroup",
|
|
51
|
+
"customerId": "${customerId}",
|
|
52
|
+
"filters": "campaign.id = {campaignId}"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
\`\`\`
|
|
56
|
+
|
|
57
|
+
### Step 2: Execute Status Change
|
|
58
|
+
|
|
59
|
+
\`\`\`json
|
|
60
|
+
{
|
|
61
|
+
"tool": "gads_bulk_update_status",
|
|
62
|
+
"params": {
|
|
63
|
+
"entityType": "adGroup",
|
|
64
|
+
"customerId": "${customerId}",
|
|
65
|
+
"entityIds": ["{adGroupId1}", "{adGroupId2}", "{adGroupId3}"],
|
|
66
|
+
"status": "PAUSED"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
\`\`\`
|
|
70
|
+
|
|
71
|
+
Valid statuses:
|
|
72
|
+
- \`ENABLED\` — active and eligible for delivery
|
|
73
|
+
- \`PAUSED\` — temporarily stopped, can be re-enabled
|
|
74
|
+
- \`REMOVED\` — permanently removed, **cannot be un-removed**
|
|
75
|
+
|
|
76
|
+
⚠️ **GOTCHA**: \`REMOVED\` is permanent and irreversible. Always prefer \`PAUSED\` unless you truly want to delete. Entity data is retained but the entity becomes permanently inactive.
|
|
77
|
+
|
|
78
|
+
### Step 3: Review Results
|
|
79
|
+
|
|
80
|
+
Check \`results\` array for per-entity success/failure, \`totalSucceeded\` / \`totalFailed\` counts.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Bulk Mutate (Create + Update + Remove)
|
|
85
|
+
|
|
86
|
+
The most powerful bulk tool — execute mixed operations in a single call.
|
|
87
|
+
|
|
88
|
+
### Step 1: Fetch Schemas
|
|
89
|
+
|
|
90
|
+
**Resource:** \`entity-schema://{entityType}\` and \`entity-examples://{entityType}\`
|
|
91
|
+
|
|
92
|
+
### Step 2: Build Operations
|
|
93
|
+
|
|
94
|
+
Each operation must be exactly ONE of: \`create\`, \`update\`, or \`remove\`.
|
|
95
|
+
|
|
96
|
+
\`\`\`json
|
|
97
|
+
{
|
|
98
|
+
"tool": "gads_bulk_mutate",
|
|
99
|
+
"params": {
|
|
100
|
+
"entityType": "adGroup",
|
|
101
|
+
"customerId": "${customerId}",
|
|
102
|
+
"operations": [
|
|
103
|
+
{
|
|
104
|
+
"create": {
|
|
105
|
+
"name": "New Ad Group - US",
|
|
106
|
+
"campaign": "customers/${customerId}/campaigns/{campaignId}",
|
|
107
|
+
"status": "PAUSED",
|
|
108
|
+
"type": "SEARCH_STANDARD",
|
|
109
|
+
"cpcBidMicros": "2000000"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"update": {
|
|
114
|
+
"resourceName": "customers/${customerId}/adGroups/{adGroupId}",
|
|
115
|
+
"cpcBidMicros": "2500000"
|
|
116
|
+
},
|
|
117
|
+
"updateMask": "cpcBidMicros"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"remove": "customers/${customerId}/adGroups/{oldAdGroupId}"
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
"partialFailure": true
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
### Atomic vs Partial Failure
|
|
129
|
+
|
|
130
|
+
- **\`partialFailure: false\`** (default): All operations succeed or all fail. Use when operations are interdependent.
|
|
131
|
+
- **\`partialFailure: true\`**: Each operation succeeds or fails independently. Use for batch processing where individual failures are acceptable.
|
|
132
|
+
|
|
133
|
+
⚠️ **GOTCHA**: The \`updateMask\` must exactly match the fields in the \`update\` object. Missing fields in the mask = fields not updated.
|
|
134
|
+
|
|
135
|
+
⚠️ **GOTCHA**: \`resourceName\` format is \`customers/{customerId}/{entityType}/{entityId}\`. Entity type in resource name is plural (e.g., \`adGroups\`, \`campaigns\`, \`ads\`).
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Batch Bid Adjustments
|
|
140
|
+
|
|
141
|
+
### Step 1: Review Current Bids
|
|
142
|
+
|
|
143
|
+
\`\`\`json
|
|
144
|
+
{
|
|
145
|
+
"tool": "gads_list_entities",
|
|
146
|
+
"params": {
|
|
147
|
+
"entityType": "adGroup",
|
|
148
|
+
"customerId": "${customerId}",
|
|
149
|
+
"filters": "campaign.id = {campaignId}"
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
\`\`\`
|
|
153
|
+
|
|
154
|
+
### Step 2: Calculate New Bids
|
|
155
|
+
|
|
156
|
+
All Google Ads bid amounts are in **micros**: 1,000,000 micros = $1.00 USD.
|
|
157
|
+
|
|
158
|
+
| Current Bid | Micros | +20% | New Micros |
|
|
159
|
+
|---|---|---|---|
|
|
160
|
+
| $2.00 CPC | 2,000,000 | $2.40 | 2,400,000 |
|
|
161
|
+
| $5.00 CPM | 5,000,000 | $6.00 | 6,000,000 |
|
|
162
|
+
|
|
163
|
+
### Step 3: Execute
|
|
164
|
+
|
|
165
|
+
\`\`\`json
|
|
166
|
+
{
|
|
167
|
+
"tool": "gads_adjust_bids",
|
|
168
|
+
"params": {
|
|
169
|
+
"customerId": "${customerId}",
|
|
170
|
+
"adjustments": [
|
|
171
|
+
{
|
|
172
|
+
"adGroupId": "{adGroupId1}",
|
|
173
|
+
"cpcBidMicros": "2400000"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"adGroupId": "{adGroupId2}",
|
|
177
|
+
"cpcBidMicros": "3000000",
|
|
178
|
+
"cpmBidMicros": "6000000"
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
"reason": "Increasing bids on top-performing ad groups by 20%"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
\`\`\`
|
|
185
|
+
|
|
186
|
+
### Step 4: Verify
|
|
187
|
+
|
|
188
|
+
Each successful adjustment shows \`previousCpcBidMicros\` / \`previousCpmBidMicros\` and new values.
|
|
189
|
+
|
|
190
|
+
⚠️ **GOTCHA**: Bid values must be strings (e.g., \`"2400000"\`), not numbers. The Google Ads API uses string representation for micros.
|
|
191
|
+
|
|
192
|
+
⚠️ **GOTCHA**: At least one of \`cpcBidMicros\` or \`cpmBidMicros\` must be provided per adjustment.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Entity Removal
|
|
197
|
+
|
|
198
|
+
For removing a single entity:
|
|
199
|
+
|
|
200
|
+
\`\`\`json
|
|
201
|
+
{
|
|
202
|
+
"tool": "gads_remove_entity",
|
|
203
|
+
"params": {
|
|
204
|
+
"entityType": "keyword",
|
|
205
|
+
"customerId": "${customerId}",
|
|
206
|
+
"entityId": "{keywordId}"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
\`\`\`
|
|
210
|
+
|
|
211
|
+
For bulk removal, use \`gads_bulk_mutate\` with \`remove\` operations, or \`gads_bulk_update_status\` with status \`REMOVED\`.
|
|
212
|
+
|
|
213
|
+
⚠️ **GOTCHA**: Removal is permanent. For campaigns and ad groups, prefer \`PAUSED\` status instead of removing.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Safety Checklist
|
|
218
|
+
|
|
219
|
+
- [ ] Correct \`customerId\` (no dashes)
|
|
220
|
+
- [ ] Entity IDs verified by listing first
|
|
221
|
+
- [ ] Bid amounts in micros (not dollars) — multiply by 1,000,000
|
|
222
|
+
- [ ] Bid values as strings, not numbers
|
|
223
|
+
- [ ] For updates: \`updateMask\` matches fields exactly
|
|
224
|
+
- [ ] For removes: confirmed permanence with user
|
|
225
|
+
- [ ] \`partialFailure\` flag set appropriately (atomic vs independent)
|
|
226
|
+
- [ ] Resource names use correct plural entity type format
|
|
227
|
+
- [ ] For \`gads_bulk_mutate\`: keep operation count under 100 for best performance (API supports 5,000 but latency degrades significantly above 100)
|
|
228
|
+
`;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=bulk-operations-workflow.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,4BAA4B,GAAW;IAClD,IAAI,EAAE,+BAA+B;IACrC,WAAW,EACT,iOAAiO;IACnO,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,2EAA2E;YACxF,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,gCAAgC,CAAC,IAA6B;IAC5E,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,cAAc,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,QAAQ,CAAC;IAE9C,OAAO;;iBAEQ,UAAU;eACZ,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA4BH,UAAU;;;;;;;;;;;;;qBAaV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCV,UAAU;;;;;mCAKI,UAAU;;;;;;;;uCAQN,UAAU;;;;;;+BAMlB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA4BpB,UAAU;;;;;;;;;;;;;;;;;;;;;qBAqBV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCV,UAAU;;;;;;;;;;;;;;;;;;;;;;;CAuB9B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare const campaignSetupWorkflowPrompt: Prompt;
|
|
3
|
+
export declare function getCampaignSetupWorkflowMessage(args?: Record<string, string>): string;
|
|
4
|
+
//# sourceMappingURL=campaign-setup-workflow.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-setup-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.ts"],"names":[],"mappings":"AASA,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,CAiOrF"}
|