@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,151 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveSessionServices } from "../utils/resolve-session.js";
|
|
3
|
+
import { getEntityTypeEnum } from "../utils/entity-mapping.js";
|
|
4
|
+
import { validateEntityResponseFormatter, buildNextAction, } from "@cesteral/shared";
|
|
5
|
+
const TOOL_NAME = "gads_validate_entity";
|
|
6
|
+
const TOOL_TITLE = "Google Ads Entity Validation (Dry Run)";
|
|
7
|
+
const TOOL_DESCRIPTION = `Validate an entity payload without creating or modifying it. Uses Google Ads \`validateOnly\` mode for true server-side validation.
|
|
8
|
+
|
|
9
|
+
**Supported entity types:** ${getEntityTypeEnum().join(", ")}
|
|
10
|
+
|
|
11
|
+
Sends the payload to the Google Ads :mutate endpoint with \`validateOnly: true\`, which performs full server-side validation without any side effects.
|
|
12
|
+
|
|
13
|
+
**Modes:**
|
|
14
|
+
- **create**: Validates a create operation payload
|
|
15
|
+
- **update**: Validates an update operation payload (requires \`entityId\` and \`updateMask\`)
|
|
16
|
+
|
|
17
|
+
**Composite entityId required for:** \`ad\` -> use \`{adGroupId}~{adId}\`, \`keyword\` -> use \`{adGroupId}~{criterionId}\`. Other entity types use simple IDs.`;
|
|
18
|
+
export const ValidateEntityInputSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
entityType: z.enum(getEntityTypeEnum()).describe("Type of entity to validate"),
|
|
21
|
+
customerId: z.string().min(1).describe("Google Ads customer ID (no dashes)"),
|
|
22
|
+
mode: z
|
|
23
|
+
.enum(["create", "update"])
|
|
24
|
+
.describe("Validation mode: 'create' for new entity, 'update' for existing"),
|
|
25
|
+
data: z
|
|
26
|
+
.record(z.any())
|
|
27
|
+
.describe("Entity data payload to validate (fields vary by entity type — see entity-schema resources)"),
|
|
28
|
+
entityId: z.string().optional().describe("Entity ID (required for update mode)"),
|
|
29
|
+
updateMask: z
|
|
30
|
+
.string()
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Comma-separated list of fields to update (required for update mode, e.g., 'name,status')"),
|
|
33
|
+
})
|
|
34
|
+
.superRefine((input, ctx) => {
|
|
35
|
+
if (input.mode === "update") {
|
|
36
|
+
if (!input.entityId) {
|
|
37
|
+
ctx.addIssue({
|
|
38
|
+
code: z.ZodIssueCode.custom,
|
|
39
|
+
message: "entityId is required when mode is 'update'",
|
|
40
|
+
path: ["entityId"],
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (!input.updateMask) {
|
|
44
|
+
ctx.addIssue({
|
|
45
|
+
code: z.ZodIssueCode.custom,
|
|
46
|
+
message: "updateMask is required when mode is 'update'",
|
|
47
|
+
path: ["updateMask"],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
.describe("Parameters for validating a Google Ads entity payload (dry run)");
|
|
53
|
+
const ValidationIssueSchema = z.object({
|
|
54
|
+
field: z.string(),
|
|
55
|
+
code: z.enum(["missing", "wrongType", "invalidValue", "readOnly", "custom"]),
|
|
56
|
+
message: z.string(),
|
|
57
|
+
hint: z.string().optional(),
|
|
58
|
+
suggestedValues: z.array(z.string()).optional(),
|
|
59
|
+
severity: z.enum(["error", "warning"]).optional(),
|
|
60
|
+
});
|
|
61
|
+
export const ValidateEntityOutputSchema = z
|
|
62
|
+
.object({
|
|
63
|
+
valid: z.boolean().describe("Whether the payload passed validation"),
|
|
64
|
+
entityType: z.string(),
|
|
65
|
+
mode: z.string(),
|
|
66
|
+
issues: z.array(ValidationIssueSchema).describe("Structured per-field issues"),
|
|
67
|
+
nextAction: z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("One-line guidance for resolving validation failures."),
|
|
71
|
+
timestamp: z.string().datetime(),
|
|
72
|
+
})
|
|
73
|
+
.describe("Entity validation result");
|
|
74
|
+
export async function validateEntityLogic(input, context, sdkContext) {
|
|
75
|
+
const { gadsService } = resolveSessionServices(sdkContext);
|
|
76
|
+
const result = await gadsService.validateEntity(input.entityType, input.customerId, input.data, input.mode, input.entityId, input.updateMask, context);
|
|
77
|
+
const issues = (result.errors ?? []).map((message) => ({
|
|
78
|
+
field: "",
|
|
79
|
+
code: "custom",
|
|
80
|
+
message,
|
|
81
|
+
severity: "error",
|
|
82
|
+
}));
|
|
83
|
+
let nextAction;
|
|
84
|
+
if (!result.valid) {
|
|
85
|
+
nextAction =
|
|
86
|
+
input.mode === "create" && !input.customerId
|
|
87
|
+
? buildNextAction({
|
|
88
|
+
kind: "discover-account",
|
|
89
|
+
tool: "gads_list_accounts",
|
|
90
|
+
field: "customerId",
|
|
91
|
+
})
|
|
92
|
+
: buildNextAction({
|
|
93
|
+
kind: "list-entity",
|
|
94
|
+
tool: "gads_list_entities",
|
|
95
|
+
entityType: input.entityType,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
valid: result.valid,
|
|
100
|
+
entityType: input.entityType,
|
|
101
|
+
mode: input.mode,
|
|
102
|
+
issues,
|
|
103
|
+
...(nextAction ? { nextAction } : {}),
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export const validateEntityTool = {
|
|
108
|
+
name: TOOL_NAME,
|
|
109
|
+
title: TOOL_TITLE,
|
|
110
|
+
description: TOOL_DESCRIPTION,
|
|
111
|
+
inputSchema: ValidateEntityInputSchema,
|
|
112
|
+
outputSchema: ValidateEntityOutputSchema,
|
|
113
|
+
annotations: {
|
|
114
|
+
readOnlyHint: true,
|
|
115
|
+
idempotentHint: true,
|
|
116
|
+
openWorldHint: false,
|
|
117
|
+
destructiveHint: false,
|
|
118
|
+
},
|
|
119
|
+
inputExamples: [
|
|
120
|
+
{
|
|
121
|
+
label: "Validate a new campaign (create mode)",
|
|
122
|
+
input: {
|
|
123
|
+
entityType: "campaign",
|
|
124
|
+
customerId: "1234567890",
|
|
125
|
+
mode: "create",
|
|
126
|
+
data: {
|
|
127
|
+
name: "Test Campaign",
|
|
128
|
+
advertisingChannelType: "SEARCH",
|
|
129
|
+
status: "PAUSED",
|
|
130
|
+
campaignBudget: "customers/1234567890/campaignBudgets/5678",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
label: "Validate a campaign update",
|
|
136
|
+
input: {
|
|
137
|
+
entityType: "campaign",
|
|
138
|
+
customerId: "1234567890",
|
|
139
|
+
mode: "update",
|
|
140
|
+
entityId: "123456",
|
|
141
|
+
data: {
|
|
142
|
+
name: "Updated Campaign",
|
|
143
|
+
},
|
|
144
|
+
updateMask: "name",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
logic: validateEntityLogic,
|
|
149
|
+
responseFormatter: validateEntityResponseFormatter,
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=validate-entity.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-entity.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/validate-entity.tool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAuB,MAAM,4BAA4B,CAAC;AAGpF,OAAO,EACL,+BAA+B,EAC/B,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,SAAS,GAAG,sBAAsB,CAAC;AACzC,MAAM,UAAU,GAAG,wCAAwC,CAAC;AAC5D,MAAM,gBAAgB,GAAG;;8BAEK,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;gKAQoG,CAAC;AAEjK,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC5E,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC1B,QAAQ,CAAC,iEAAiE,CAAC;IAC9E,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;SACf,QAAQ,CACP,4FAA4F,CAC7F;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAChF,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F,CAC3F;CACJ,CAAC;KACD,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,4CAA4C;gBACrD,IAAI,EAAE,CAAC,UAAU,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,8CAA8C;gBACvD,IAAI,EAAE,CAAC,YAAY,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC;KACD,QAAQ,CAAC,iEAAiE,CAAC,CAAC;AAE/E,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC9E,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,QAAQ,CAAC,0BAA0B,CAAC,CAAC;AAKxC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA0B,EAC1B,OAAuB,EACvB,UAAuB;IAEvB,MAAM,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,cAAc,CAC7C,KAAK,CAAC,UAA4B,EAClC,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,IAA2B,EACjC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,UAAU,EAChB,OAAO,CACR,CAAC;IAEF,MAAM,MAAM,GAAsB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxE,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,OAAO;QACP,QAAQ,EAAE,OAAgB;KAC3B,CAAC,CAAC,CAAC;IAEJ,IAAI,UAA8B,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,UAAU;YACR,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU;gBAC1C,CAAC,CAAC,eAAe,CAAC;oBACd,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,oBAAoB;oBAC1B,KAAK,EAAE,YAAY;iBACpB,CAAC;gBACJ,CAAC,CAAC,eAAe,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,oBAAoB;oBAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B,CAAC,CAAC;IACX,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM;QACN,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,yBAAyB;IACtC,YAAY,EAAE,0BAA0B;IACxC,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,KAAK;KACvB;IACD,aAAa,EAAE;QACb;YACE,KAAK,EAAE,uCAAuC;YAC9C,KAAK,EAAE;gBACL,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,IAAI,EAAE,eAAe;oBACrB,sBAAsB,EAAE,QAAQ;oBAChC,MAAM,EAAE,QAAQ;oBAChB,cAAc,EAAE,2CAA2C;iBAC5D;aACF;SACF;QACD;YACE,KAAK,EAAE,4BAA4B;YACnC,KAAK,EAAE;gBACL,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE;oBACJ,IAAI,EAAE,kBAAkB;iBACzB;gBACD,UAAU,EAAE,MAAM;aACnB;SACF;KACF;IACD,KAAK,EAAE,mBAAmB;IAC1B,iBAAiB,EAAE,+BAA+B;CACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ComputedMetrics {
|
|
2
|
+
cpa: number | null;
|
|
3
|
+
roas: number | null;
|
|
4
|
+
cpm: number | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function computeMetrics(metrics: Record<string, unknown>): ComputedMetrics;
|
|
7
|
+
export declare function addComputedMetrics(row: Record<string, any>): Record<string, any>;
|
|
8
|
+
//# sourceMappingURL=computed-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed-metrics.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/computed-metrics.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAWhF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMhF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function computeMetrics(metrics) {
|
|
2
|
+
const cost = Number(metrics.cost_micros || 0) / 1_000_000;
|
|
3
|
+
const conversions = Number(metrics.conversions || 0);
|
|
4
|
+
const conversionsValue = Number(metrics.conversions_value || 0);
|
|
5
|
+
const impressions = Number(metrics.impressions || 0);
|
|
6
|
+
return {
|
|
7
|
+
cpa: conversions > 0 ? cost / conversions : null,
|
|
8
|
+
roas: cost > 0 ? conversionsValue / cost : null,
|
|
9
|
+
cpm: impressions > 0 ? (cost / impressions) * 1000 : null,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function addComputedMetrics(row) {
|
|
13
|
+
const metrics = row.metrics || {};
|
|
14
|
+
return {
|
|
15
|
+
...row,
|
|
16
|
+
computedMetrics: computeMetrics(metrics),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=computed-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computed-metrics.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/computed-metrics.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,cAAc,CAAC,OAAgC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAErD,OAAO;QACL,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI;QAChD,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI;QAC/C,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAwB;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,OAAO;QACL,GAAG,GAAG;QACN,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type GAdsEntityType = "campaign" | "adGroup" | "ad" | "keyword" | "campaignBudget" | "asset";
|
|
2
|
+
export type ParentIdKey = "customerId" | "campaignId" | "adGroupId";
|
|
3
|
+
export type MutateOp = "create" | "update" | "remove";
|
|
4
|
+
export interface GAdsEntityConfig {
|
|
5
|
+
gaqlResource: string;
|
|
6
|
+
mutateEndpoint: string;
|
|
7
|
+
resourceNamePattern: string;
|
|
8
|
+
parentIds: ParentIdKey[];
|
|
9
|
+
idField: string;
|
|
10
|
+
statusField?: string;
|
|
11
|
+
nameField?: string;
|
|
12
|
+
supportedMutateOps: readonly MutateOp[];
|
|
13
|
+
}
|
|
14
|
+
export declare function assertMutateOpSupported(entityType: GAdsEntityType, op: MutateOp): void;
|
|
15
|
+
export declare function getEntityConfig(entityType: GAdsEntityType): GAdsEntityConfig;
|
|
16
|
+
export declare function getSupportedEntityTypes(): GAdsEntityType[];
|
|
17
|
+
export declare function getEntityTypeEnum(): [string, ...string[]];
|
|
18
|
+
export declare function getStatusCapableEntityTypes(): GAdsEntityType[];
|
|
19
|
+
export declare function getStatusCapableEntityTypeEnum(): [string, ...string[]];
|
|
20
|
+
export declare function buildResourceName(entityType: GAdsEntityType, customerId: string, entityId: string): string;
|
|
21
|
+
export declare function buildMutateUrl(entityType: GAdsEntityType, customerId: string): string;
|
|
22
|
+
//# sourceMappingURL=entity-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-mapping.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/entity-mapping.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAEpG,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAE/B,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE,MAAM,CAAC;IAEvB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,SAAS,EAAE,WAAW,EAAE,CAAC;IAEzB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kBAAkB,EAAE,SAAS,QAAQ,EAAE,CAAC;CACzC;AAmED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAQtF;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,gBAAgB,CAS5E;AAED,wBAAgB,uBAAuB,IAAI,cAAc,EAAE,CAE1D;AAED,wBAAgB,iBAAiB,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAGzD;AAMD,wBAAgB,2BAA2B,IAAI,cAAc,EAAE,CAI9D;AAED,wBAAgB,8BAA8B,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAGtE;AAMD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR;AAMD,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { JsonRpcErrorCode, McpError } from "@cesteral/shared";
|
|
2
|
+
const ALL_MUTATE_OPS = ["create", "update", "remove"];
|
|
3
|
+
const ENTITY_CONFIGS = {
|
|
4
|
+
campaign: {
|
|
5
|
+
gaqlResource: "campaign",
|
|
6
|
+
mutateEndpoint: "campaigns",
|
|
7
|
+
resourceNamePattern: "customers/{customerId}/campaigns/{campaignId}",
|
|
8
|
+
parentIds: ["customerId"],
|
|
9
|
+
idField: "campaign.id",
|
|
10
|
+
statusField: "campaign.status",
|
|
11
|
+
nameField: "campaign.name",
|
|
12
|
+
supportedMutateOps: ALL_MUTATE_OPS,
|
|
13
|
+
},
|
|
14
|
+
adGroup: {
|
|
15
|
+
gaqlResource: "ad_group",
|
|
16
|
+
mutateEndpoint: "adGroups",
|
|
17
|
+
resourceNamePattern: "customers/{customerId}/adGroups/{adGroupId}",
|
|
18
|
+
parentIds: ["customerId"],
|
|
19
|
+
idField: "ad_group.id",
|
|
20
|
+
statusField: "ad_group.status",
|
|
21
|
+
nameField: "ad_group.name",
|
|
22
|
+
supportedMutateOps: ALL_MUTATE_OPS,
|
|
23
|
+
},
|
|
24
|
+
ad: {
|
|
25
|
+
gaqlResource: "ad_group_ad",
|
|
26
|
+
mutateEndpoint: "adGroupAds",
|
|
27
|
+
resourceNamePattern: "customers/{customerId}/adGroupAds/{adGroupId}~{adId}",
|
|
28
|
+
parentIds: ["customerId"],
|
|
29
|
+
idField: "ad_group_ad.ad.id",
|
|
30
|
+
statusField: "ad_group_ad.status",
|
|
31
|
+
nameField: "ad_group_ad.ad.name",
|
|
32
|
+
supportedMutateOps: ALL_MUTATE_OPS,
|
|
33
|
+
},
|
|
34
|
+
keyword: {
|
|
35
|
+
gaqlResource: "ad_group_criterion",
|
|
36
|
+
mutateEndpoint: "adGroupCriteria",
|
|
37
|
+
resourceNamePattern: "customers/{customerId}/adGroupCriteria/{adGroupId}~{criterionId}",
|
|
38
|
+
parentIds: ["customerId"],
|
|
39
|
+
idField: "ad_group_criterion.criterion_id",
|
|
40
|
+
statusField: "ad_group_criterion.status",
|
|
41
|
+
supportedMutateOps: ALL_MUTATE_OPS,
|
|
42
|
+
},
|
|
43
|
+
campaignBudget: {
|
|
44
|
+
gaqlResource: "campaign_budget",
|
|
45
|
+
mutateEndpoint: "campaignBudgets",
|
|
46
|
+
resourceNamePattern: "customers/{customerId}/campaignBudgets/{budgetId}",
|
|
47
|
+
parentIds: ["customerId"],
|
|
48
|
+
idField: "campaign_budget.id",
|
|
49
|
+
nameField: "campaign_budget.name",
|
|
50
|
+
supportedMutateOps: ALL_MUTATE_OPS,
|
|
51
|
+
},
|
|
52
|
+
asset: {
|
|
53
|
+
gaqlResource: "asset",
|
|
54
|
+
mutateEndpoint: "assets",
|
|
55
|
+
resourceNamePattern: "customers/{customerId}/assets/{assetId}",
|
|
56
|
+
parentIds: ["customerId"],
|
|
57
|
+
idField: "asset.id",
|
|
58
|
+
nameField: "asset.name",
|
|
59
|
+
supportedMutateOps: ["create"],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export function assertMutateOpSupported(entityType, op) {
|
|
63
|
+
const config = ENTITY_CONFIGS[entityType];
|
|
64
|
+
if (!config.supportedMutateOps.includes(op)) {
|
|
65
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, `Google Ads API does not support ${op} on ${entityType} entities (supported: ${config.supportedMutateOps.join(", ")})`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function getEntityConfig(entityType) {
|
|
69
|
+
const config = ENTITY_CONFIGS[entityType];
|
|
70
|
+
if (!config) {
|
|
71
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, `Unknown Google Ads entity type: ${entityType}`);
|
|
72
|
+
}
|
|
73
|
+
return config;
|
|
74
|
+
}
|
|
75
|
+
export function getSupportedEntityTypes() {
|
|
76
|
+
return Object.keys(ENTITY_CONFIGS);
|
|
77
|
+
}
|
|
78
|
+
export function getEntityTypeEnum() {
|
|
79
|
+
const types = getSupportedEntityTypes();
|
|
80
|
+
return types;
|
|
81
|
+
}
|
|
82
|
+
export function getStatusCapableEntityTypes() {
|
|
83
|
+
return Object.entries(ENTITY_CONFIGS)
|
|
84
|
+
.filter(([, config]) => !!config.statusField)
|
|
85
|
+
.map(([type]) => type);
|
|
86
|
+
}
|
|
87
|
+
export function getStatusCapableEntityTypeEnum() {
|
|
88
|
+
const types = getStatusCapableEntityTypes();
|
|
89
|
+
return types;
|
|
90
|
+
}
|
|
91
|
+
export function buildResourceName(entityType, customerId, entityId) {
|
|
92
|
+
const config = getEntityConfig(entityType);
|
|
93
|
+
return `customers/${customerId}/${config.mutateEndpoint}/${entityId}`;
|
|
94
|
+
}
|
|
95
|
+
export function buildMutateUrl(entityType, customerId) {
|
|
96
|
+
const config = getEntityConfig(entityType);
|
|
97
|
+
return `/customers/${customerId}/${config.mutateEndpoint}:mutate`;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=entity-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-mapping.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/entity-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type GAdsEntityType } from "./entity-mapping.js";
|
|
2
|
+
export declare function buildListQuery(entityType: GAdsEntityType, filters?: Record<string, string>, orderBy?: string): string;
|
|
3
|
+
export declare function buildGetByIdQuery(entityType: GAdsEntityType, entityId: string): string;
|
|
4
|
+
//# sourceMappingURL=gaql-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaql-helpers.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/gaql-helpers.ts"],"names":[],"mappings":"AAUA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA0D3E,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAoCR;AAKD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { getEntityConfig } from "./entity-mapping.js";
|
|
2
|
+
const DEFAULT_SELECT_FIELDS = {
|
|
3
|
+
campaign: [
|
|
4
|
+
"campaign.id",
|
|
5
|
+
"campaign.name",
|
|
6
|
+
"campaign.status",
|
|
7
|
+
"campaign.advertising_channel_type",
|
|
8
|
+
"campaign.start_date",
|
|
9
|
+
"campaign.end_date",
|
|
10
|
+
"campaign.campaign_budget",
|
|
11
|
+
"campaign.resource_name",
|
|
12
|
+
],
|
|
13
|
+
adGroup: [
|
|
14
|
+
"ad_group.id",
|
|
15
|
+
"ad_group.name",
|
|
16
|
+
"ad_group.status",
|
|
17
|
+
"ad_group.type",
|
|
18
|
+
"ad_group.campaign",
|
|
19
|
+
"ad_group.cpc_bid_micros",
|
|
20
|
+
"ad_group.cpm_bid_micros",
|
|
21
|
+
"ad_group.resource_name",
|
|
22
|
+
],
|
|
23
|
+
ad: [
|
|
24
|
+
"ad_group_ad.ad.id",
|
|
25
|
+
"ad_group_ad.ad.name",
|
|
26
|
+
"ad_group_ad.ad.type",
|
|
27
|
+
"ad_group_ad.status",
|
|
28
|
+
"ad_group_ad.ad_group",
|
|
29
|
+
"ad_group_ad.ad.final_urls",
|
|
30
|
+
"ad_group_ad.resource_name",
|
|
31
|
+
],
|
|
32
|
+
keyword: [
|
|
33
|
+
"ad_group_criterion.criterion_id",
|
|
34
|
+
"ad_group_criterion.keyword.text",
|
|
35
|
+
"ad_group_criterion.keyword.match_type",
|
|
36
|
+
"ad_group_criterion.status",
|
|
37
|
+
"ad_group_criterion.ad_group",
|
|
38
|
+
"ad_group_criterion.resource_name",
|
|
39
|
+
],
|
|
40
|
+
campaignBudget: [
|
|
41
|
+
"campaign_budget.id",
|
|
42
|
+
"campaign_budget.name",
|
|
43
|
+
"campaign_budget.amount_micros",
|
|
44
|
+
"campaign_budget.delivery_method",
|
|
45
|
+
"campaign_budget.status",
|
|
46
|
+
"campaign_budget.resource_name",
|
|
47
|
+
],
|
|
48
|
+
asset: ["asset.id", "asset.name", "asset.type", "asset.resource_name"],
|
|
49
|
+
};
|
|
50
|
+
export function buildListQuery(entityType, filters, orderBy) {
|
|
51
|
+
const config = getEntityConfig(entityType);
|
|
52
|
+
const fields = DEFAULT_SELECT_FIELDS[entityType] || [config.idField];
|
|
53
|
+
let query = `SELECT ${fields.join(", ")} FROM ${config.gaqlResource}`;
|
|
54
|
+
const conditions = [];
|
|
55
|
+
if (filters) {
|
|
56
|
+
for (const [field, value] of Object.entries(filters)) {
|
|
57
|
+
if (value.match(/^(=|!=|>=|<=|>|<|(?:IN|LIKE|CONTAINS|NOT|BETWEEN|DURING|IS)\b)\s/)) {
|
|
58
|
+
conditions.push(`${field} ${value}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
conditions.push(`${field} = '${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (conditions.length > 0) {
|
|
66
|
+
query += ` WHERE ${conditions.join(" AND ")}`;
|
|
67
|
+
}
|
|
68
|
+
if (orderBy) {
|
|
69
|
+
query += ` ORDER BY ${orderBy}`;
|
|
70
|
+
}
|
|
71
|
+
query += " PARAMETERS omit_unselected_resource_names=true";
|
|
72
|
+
return query;
|
|
73
|
+
}
|
|
74
|
+
export function buildGetByIdQuery(entityType, entityId) {
|
|
75
|
+
if (!/^\d+$/.test(entityId)) {
|
|
76
|
+
throw new Error(`Invalid entity ID: "${entityId}". Entity IDs must be numeric.`);
|
|
77
|
+
}
|
|
78
|
+
const config = getEntityConfig(entityType);
|
|
79
|
+
const fields = DEFAULT_SELECT_FIELDS[entityType] || [config.idField];
|
|
80
|
+
return `SELECT ${fields.join(", ")} FROM ${config.gaqlResource} WHERE ${config.idField} = ${entityId} LIMIT 1 PARAMETERS omit_unselected_resource_names=true`;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=gaql-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaql-helpers.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/gaql-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type ParentIdKey, type GAdsEntityType } from "./entity-mapping.js";
|
|
3
|
+
export declare function getRequiredParentIds(entityType: GAdsEntityType): ParentIdKey[];
|
|
4
|
+
export declare function getMissingParentIds(entityType: GAdsEntityType, input: Record<string, unknown>): ParentIdKey[];
|
|
5
|
+
export declare function buildMissingParentIdsMessage(entityType: GAdsEntityType, missing: ParentIdKey[]): string;
|
|
6
|
+
export interface ParentValidationOptions {
|
|
7
|
+
validateCompositeIds?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function addParentValidationIssue(ctx: z.RefinementCtx, entityType: GAdsEntityType, input: Record<string, unknown>, path?: Array<string | number>, options?: ParentValidationOptions): void;
|
|
10
|
+
//# sourceMappingURL=parent-id-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parent-id-validation.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/parent-id-validation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsB7F,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,WAAW,EAAE,CAE9E;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAMf;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,EAAE,GACrB,MAAM,CAKR;AAED,MAAM,WAAW,uBAAuB;IAEtC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,CAAC,CAAC,aAAa,EACpB,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,GAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAM,EACjC,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAuCN"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getEntityConfig } from "./entity-mapping.js";
|
|
3
|
+
const COMPOSITE_ID_ENTITIES = {
|
|
4
|
+
ad: "{adGroupId}~{adId}",
|
|
5
|
+
keyword: "{adGroupId}~{criterionId}",
|
|
6
|
+
};
|
|
7
|
+
const COMPOSITE_ID_PATTERN = /^\d+~\d+$/;
|
|
8
|
+
export function getRequiredParentIds(entityType) {
|
|
9
|
+
return [...getEntityConfig(entityType).parentIds];
|
|
10
|
+
}
|
|
11
|
+
export function getMissingParentIds(entityType, input) {
|
|
12
|
+
const required = getRequiredParentIds(entityType);
|
|
13
|
+
return required.filter((parentId) => {
|
|
14
|
+
const value = input[parentId];
|
|
15
|
+
return !value || (typeof value === "string" && value.trim().length === 0);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function buildMissingParentIdsMessage(entityType, missing) {
|
|
19
|
+
const requiredFields = getRequiredParentIds(entityType).map((key) => `\`${key}\``);
|
|
20
|
+
const missingFields = missing.map((key) => `\`${key}\``);
|
|
21
|
+
return `Missing required parent identifier(s) for entity type "${entityType}": ${missingFields.join(", ")}. Required parent identifiers: ${requiredFields.join(", ")}.`;
|
|
22
|
+
}
|
|
23
|
+
export function addParentValidationIssue(ctx, entityType, input, path = [], options) {
|
|
24
|
+
const missing = getMissingParentIds(entityType, input);
|
|
25
|
+
if (missing.length > 0) {
|
|
26
|
+
ctx.addIssue({
|
|
27
|
+
code: z.ZodIssueCode.custom,
|
|
28
|
+
path,
|
|
29
|
+
message: buildMissingParentIdsMessage(entityType, missing),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (options?.validateCompositeIds) {
|
|
33
|
+
const compositeFormat = COMPOSITE_ID_ENTITIES[entityType];
|
|
34
|
+
if (compositeFormat) {
|
|
35
|
+
const entityId = input.entityId;
|
|
36
|
+
if (entityId && !COMPOSITE_ID_PATTERN.test(entityId)) {
|
|
37
|
+
ctx.addIssue({
|
|
38
|
+
code: z.ZodIssueCode.custom,
|
|
39
|
+
path: [...path, "entityId"],
|
|
40
|
+
message: `Entity type "${entityType}" requires a composite entityId in the format ${compositeFormat} (two numeric IDs separated by ~), but got "${entityId}".`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const entityIds = input.entityIds;
|
|
44
|
+
if (Array.isArray(entityIds)) {
|
|
45
|
+
for (let i = 0; i < entityIds.length; i++) {
|
|
46
|
+
if (!COMPOSITE_ID_PATTERN.test(entityIds[i])) {
|
|
47
|
+
ctx.addIssue({
|
|
48
|
+
code: z.ZodIssueCode.custom,
|
|
49
|
+
path: [...path, "entityIds", i],
|
|
50
|
+
message: `Entity type "${entityType}" requires composite IDs in the format ${compositeFormat} (two numeric IDs separated by ~), but entityIds[${i}] = "${entityIds[i]}".`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=parent-id-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parent-id-validation.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/parent-id-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-session.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/resolve-session.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,sBAAsB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,eAAe,CAE/E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { resolveSessionServicesFromStore } from "@cesteral/shared";
|
|
2
|
+
import { sessionServiceStore } from "../../../services/session-services.js";
|
|
3
|
+
export function resolveSessionServices(sdkContext) {
|
|
4
|
+
return resolveSessionServicesFromStore(sessionServiceStore, sdkContext);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=resolve-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-session.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/resolve-session.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,uCAAuC,CAAC;AAOlG,MAAM,UAAU,sBAAsB,CAAC,UAAuB;IAC5D,OAAO,+BAA+B,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
export declare const createMcpHttpServer: (config: {
|
|
3
|
+
serviceName: string;
|
|
4
|
+
port: number;
|
|
5
|
+
otelServiceName: string;
|
|
6
|
+
mcpAuthMode: "gads-headers" | "jwt" | "none";
|
|
7
|
+
gadsApiBaseUrl: string;
|
|
8
|
+
gadsRateLimitPerMinute: number;
|
|
9
|
+
host: string;
|
|
10
|
+
nodeEnv: "development" | "production" | "test";
|
|
11
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
12
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
13
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
14
|
+
otelEnabled: boolean;
|
|
15
|
+
gadsDeveloperToken?: string | undefined;
|
|
16
|
+
gadsClientId?: string | undefined;
|
|
17
|
+
gadsClientSecret?: string | undefined;
|
|
18
|
+
gadsRefreshToken?: string | undefined;
|
|
19
|
+
gadsLoginCustomerId?: string | undefined;
|
|
20
|
+
mcpAuthSecretKey?: string | undefined;
|
|
21
|
+
mcpAllowedOrigins?: string | undefined;
|
|
22
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
23
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
24
|
+
gcsBucketName?: string | undefined;
|
|
25
|
+
}, logger: Logger) => ReturnType<typeof import("@cesteral/shared").createMcpHttpTransport>, startHttpServer: (config: {
|
|
26
|
+
serviceName: string;
|
|
27
|
+
port: number;
|
|
28
|
+
otelServiceName: string;
|
|
29
|
+
mcpAuthMode: "gads-headers" | "jwt" | "none";
|
|
30
|
+
gadsApiBaseUrl: string;
|
|
31
|
+
gadsRateLimitPerMinute: number;
|
|
32
|
+
host: string;
|
|
33
|
+
nodeEnv: "development" | "production" | "test";
|
|
34
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
35
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
36
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
37
|
+
otelEnabled: boolean;
|
|
38
|
+
gadsDeveloperToken?: string | undefined;
|
|
39
|
+
gadsClientId?: string | undefined;
|
|
40
|
+
gadsClientSecret?: string | undefined;
|
|
41
|
+
gadsRefreshToken?: string | undefined;
|
|
42
|
+
gadsLoginCustomerId?: string | undefined;
|
|
43
|
+
mcpAuthSecretKey?: string | undefined;
|
|
44
|
+
mcpAllowedOrigins?: string | undefined;
|
|
45
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
46
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
47
|
+
gcsBucketName?: string | undefined;
|
|
48
|
+
}, logger: Logger) => Promise<import("@cesteral/shared").McpHttpServer>;
|
|
49
|
+
//# sourceMappingURL=streamable-http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAkHnC,eAAO,MAAQ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;4FAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;uEACS,CAAC"}
|