@cesteral/amazon-dsp-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +59 -0
  3. package/dist/auth/amazon-dsp-auth-adapter.d.ts +42 -0
  4. package/dist/auth/amazon-dsp-auth-adapter.d.ts.map +1 -0
  5. package/dist/auth/amazon-dsp-auth-adapter.js +126 -0
  6. package/dist/auth/amazon-dsp-auth-adapter.js.map +1 -0
  7. package/dist/auth/amazon-dsp-auth-strategy.d.ts +14 -0
  8. package/dist/auth/amazon-dsp-auth-strategy.d.ts.map +1 -0
  9. package/dist/auth/amazon-dsp-auth-strategy.js +58 -0
  10. package/dist/auth/amazon-dsp-auth-strategy.js.map +1 -0
  11. package/dist/auth/index.d.ts +3 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +3 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/config/index.d.ts +116 -0
  16. package/dist/config/index.d.ts.map +1 -0
  17. package/dist/config/index.js +49 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +65 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts +4 -0
  24. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts.map +1 -0
  25. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js +127 -0
  26. package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js.map +1 -0
  27. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts +4 -0
  28. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts.map +1 -0
  29. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js +120 -0
  30. package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js.map +1 -0
  31. package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.d.ts +4 -0
  32. package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.d.ts.map +1 -0
  33. package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.js +116 -0
  34. package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.js.map +1 -0
  35. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts +4 -0
  36. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts.map +1 -0
  37. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js +299 -0
  38. package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js.map +1 -0
  39. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts +4 -0
  40. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts.map +1 -0
  41. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js +170 -0
  42. package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js.map +1 -0
  43. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts +4 -0
  44. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts.map +1 -0
  45. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js +200 -0
  46. package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js.map +1 -0
  47. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts +4 -0
  48. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts.map +1 -0
  49. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js +183 -0
  50. package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js.map +1 -0
  51. package/dist/mcp-server/prompts/definitions/reporting-workflow.prompt.d.ts +4 -0
  52. package/dist/mcp-server/prompts/definitions/reporting-workflow.prompt.d.ts.map +1 -0
  53. package/dist/mcp-server/prompts/definitions/reporting-workflow.prompt.js +126 -0
  54. package/dist/mcp-server/prompts/definitions/reporting-workflow.prompt.js.map +1 -0
  55. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts +4 -0
  56. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts.map +1 -0
  57. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js +198 -0
  58. package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js.map +1 -0
  59. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts +4 -0
  60. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts.map +1 -0
  61. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js +96 -0
  62. package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js.map +1 -0
  63. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts +4 -0
  64. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts.map +1 -0
  65. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js +111 -0
  66. package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js.map +1 -0
  67. package/dist/mcp-server/prompts/index.d.ts +9 -0
  68. package/dist/mcp-server/prompts/index.d.ts.map +1 -0
  69. package/dist/mcp-server/prompts/index.js +97 -0
  70. package/dist/mcp-server/prompts/index.js.map +1 -0
  71. package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts +4 -0
  72. package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts.map +1 -0
  73. package/dist/mcp-server/resources/definitions/entity-examples.resource.js +121 -0
  74. package/dist/mcp-server/resources/definitions/entity-examples.resource.js.map +1 -0
  75. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts +3 -0
  76. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts.map +1 -0
  77. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js +58 -0
  78. package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js.map +1 -0
  79. package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts +4 -0
  80. package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts.map +1 -0
  81. package/dist/mcp-server/resources/definitions/entity-schemas.resource.js +51 -0
  82. package/dist/mcp-server/resources/definitions/entity-schemas.resource.js.map +1 -0
  83. package/dist/mcp-server/resources/definitions/index.d.ts +7 -0
  84. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  85. package/dist/mcp-server/resources/definitions/index.js +53 -0
  86. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  87. package/dist/mcp-server/resources/definitions/reporting-reference.resource.d.ts +3 -0
  88. package/dist/mcp-server/resources/definitions/reporting-reference.resource.d.ts.map +1 -0
  89. package/dist/mcp-server/resources/definitions/reporting-reference.resource.js +50 -0
  90. package/dist/mcp-server/resources/definitions/reporting-reference.resource.js.map +1 -0
  91. package/dist/mcp-server/resources/index.d.ts +3 -0
  92. package/dist/mcp-server/resources/index.d.ts.map +1 -0
  93. package/dist/mcp-server/resources/index.js +2 -0
  94. package/dist/mcp-server/resources/index.js.map +1 -0
  95. package/dist/mcp-server/resources/types.d.ts +8 -0
  96. package/dist/mcp-server/resources/types.d.ts.map +1 -0
  97. package/dist/mcp-server/resources/types.js +2 -0
  98. package/dist/mcp-server/resources/types.js.map +1 -0
  99. package/dist/mcp-server/server.d.ts +5 -0
  100. package/dist/mcp-server/server.d.ts.map +1 -0
  101. package/dist/mcp-server/server.js +137 -0
  102. package/dist/mcp-server/server.js.map +1 -0
  103. package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts +215 -0
  104. package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts.map +1 -0
  105. package/dist/mcp-server/tools/definitions/adjust-bids.tool.js +147 -0
  106. package/dist/mcp-server/tools/definitions/adjust-bids.tool.js.map +1 -0
  107. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts +152 -0
  108. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts.map +1 -0
  109. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js +111 -0
  110. package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js.map +1 -0
  111. package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.d.ts +193 -0
  112. package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.d.ts.map +1 -0
  113. package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.js +127 -0
  114. package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.js.map +1 -0
  115. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts +153 -0
  116. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts.map +1 -0
  117. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js +136 -0
  118. package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js.map +1 -0
  119. package/dist/mcp-server/tools/definitions/check-report-status.tool.d.ts +112 -0
  120. package/dist/mcp-server/tools/definitions/check-report-status.tool.d.ts.map +1 -0
  121. package/dist/mcp-server/tools/definitions/check-report-status.tool.js +87 -0
  122. package/dist/mcp-server/tools/definitions/check-report-status.tool.js.map +1 -0
  123. package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts +111 -0
  124. package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts.map +1 -0
  125. package/dist/mcp-server/tools/definitions/create-entity.tool.js +96 -0
  126. package/dist/mcp-server/tools/definitions/create-entity.tool.js.map +1 -0
  127. package/dist/mcp-server/tools/definitions/delete-entity.tool.d.ts +152 -0
  128. package/dist/mcp-server/tools/definitions/delete-entity.tool.d.ts.map +1 -0
  129. package/dist/mcp-server/tools/definitions/delete-entity.tool.js +142 -0
  130. package/dist/mcp-server/tools/definitions/delete-entity.tool.js.map +1 -0
  131. package/dist/mcp-server/tools/definitions/download-report.tool.d.ts +297 -0
  132. package/dist/mcp-server/tools/definitions/download-report.tool.d.ts.map +1 -0
  133. package/dist/mcp-server/tools/definitions/download-report.tool.js +107 -0
  134. package/dist/mcp-server/tools/definitions/download-report.tool.js.map +1 -0
  135. package/dist/mcp-server/tools/definitions/duplicate-entity.tool.d.ts +105 -0
  136. package/dist/mcp-server/tools/definitions/duplicate-entity.tool.d.ts.map +1 -0
  137. package/dist/mcp-server/tools/definitions/duplicate-entity.tool.js +85 -0
  138. package/dist/mcp-server/tools/definitions/duplicate-entity.tool.js.map +1 -0
  139. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts +75 -0
  140. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts.map +1 -0
  141. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js +63 -0
  142. package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js.map +1 -0
  143. package/dist/mcp-server/tools/definitions/get-audience-estimate.tool.d.ts +85 -0
  144. package/dist/mcp-server/tools/definitions/get-audience-estimate.tool.d.ts.map +1 -0
  145. package/dist/mcp-server/tools/definitions/get-audience-estimate.tool.js +91 -0
  146. package/dist/mcp-server/tools/definitions/get-audience-estimate.tool.js.map +1 -0
  147. package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts +76 -0
  148. package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts.map +1 -0
  149. package/dist/mcp-server/tools/definitions/get-entity.tool.js +71 -0
  150. package/dist/mcp-server/tools/definitions/get-entity.tool.js.map +1 -0
  151. package/dist/mcp-server/tools/definitions/get-report-breakdowns.tool.d.ts +289 -0
  152. package/dist/mcp-server/tools/definitions/get-report-breakdowns.tool.d.ts.map +1 -0
  153. package/dist/mcp-server/tools/definitions/get-report-breakdowns.tool.js +181 -0
  154. package/dist/mcp-server/tools/definitions/get-report-breakdowns.tool.js.map +1 -0
  155. package/dist/mcp-server/tools/definitions/get-report.tool.d.ts +271 -0
  156. package/dist/mcp-server/tools/definitions/get-report.tool.d.ts.map +1 -0
  157. package/dist/mcp-server/tools/definitions/get-report.tool.js +174 -0
  158. package/dist/mcp-server/tools/definitions/get-report.tool.js.map +1 -0
  159. package/dist/mcp-server/tools/definitions/get-targeting-options.tool.d.ts +75 -0
  160. package/dist/mcp-server/tools/definitions/get-targeting-options.tool.d.ts.map +1 -0
  161. package/dist/mcp-server/tools/definitions/get-targeting-options.tool.js +75 -0
  162. package/dist/mcp-server/tools/definitions/get-targeting-options.tool.js.map +1 -0
  163. package/dist/mcp-server/tools/definitions/index.d.ts +21 -0
  164. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  165. package/dist/mcp-server/tools/definitions/index.js +63 -0
  166. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  167. package/dist/mcp-server/tools/definitions/list-advertisers.tool.d.ts +54 -0
  168. package/dist/mcp-server/tools/definitions/list-advertisers.tool.d.ts.map +1 -0
  169. package/dist/mcp-server/tools/definitions/list-advertisers.tool.js +58 -0
  170. package/dist/mcp-server/tools/definitions/list-advertisers.tool.js.map +1 -0
  171. package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts +171 -0
  172. package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts.map +1 -0
  173. package/dist/mcp-server/tools/definitions/list-entities.tool.js +112 -0
  174. package/dist/mcp-server/tools/definitions/list-entities.tool.js.map +1 -0
  175. package/dist/mcp-server/tools/definitions/search-targeting.tool.d.ts +89 -0
  176. package/dist/mcp-server/tools/definitions/search-targeting.tool.d.ts.map +1 -0
  177. package/dist/mcp-server/tools/definitions/search-targeting.tool.js +93 -0
  178. package/dist/mcp-server/tools/definitions/search-targeting.tool.js.map +1 -0
  179. package/dist/mcp-server/tools/definitions/submit-report.tool.d.ts +134 -0
  180. package/dist/mcp-server/tools/definitions/submit-report.tool.d.ts.map +1 -0
  181. package/dist/mcp-server/tools/definitions/submit-report.tool.js +119 -0
  182. package/dist/mcp-server/tools/definitions/submit-report.tool.js.map +1 -0
  183. package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts +114 -0
  184. package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts.map +1 -0
  185. package/dist/mcp-server/tools/definitions/update-entity.tool.js +89 -0
  186. package/dist/mcp-server/tools/definitions/update-entity.tool.js.map +1 -0
  187. package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts +169 -0
  188. package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts.map +1 -0
  189. package/dist/mcp-server/tools/definitions/validate-entity.tool.js +104 -0
  190. package/dist/mcp-server/tools/definitions/validate-entity.tool.js.map +1 -0
  191. package/dist/mcp-server/tools/index.d.ts +2 -0
  192. package/dist/mcp-server/tools/index.d.ts.map +1 -0
  193. package/dist/mcp-server/tools/index.js +2 -0
  194. package/dist/mcp-server/tools/index.js.map +1 -0
  195. package/dist/mcp-server/tools/utils/entity-mapping.d.ts +24 -0
  196. package/dist/mcp-server/tools/utils/entity-mapping.d.ts.map +1 -0
  197. package/dist/mcp-server/tools/utils/entity-mapping.js +42 -0
  198. package/dist/mcp-server/tools/utils/entity-mapping.js.map +1 -0
  199. package/dist/mcp-server/tools/utils/resolve-session.d.ts +4 -0
  200. package/dist/mcp-server/tools/utils/resolve-session.d.ts.map +1 -0
  201. package/dist/mcp-server/tools/utils/resolve-session.js +6 -0
  202. package/dist/mcp-server/tools/utils/resolve-session.js.map +1 -0
  203. package/dist/mcp-server/transports/streamable-http-transport.d.ts +57 -0
  204. package/dist/mcp-server/transports/streamable-http-transport.d.ts.map +1 -0
  205. package/dist/mcp-server/transports/streamable-http-transport.js +105 -0
  206. package/dist/mcp-server/transports/streamable-http-transport.js.map +1 -0
  207. package/dist/services/amazon-dsp/amazon-dsp-api-contract.d.ts +43 -0
  208. package/dist/services/amazon-dsp/amazon-dsp-api-contract.d.ts.map +1 -0
  209. package/dist/services/amazon-dsp/amazon-dsp-api-contract.js +193 -0
  210. package/dist/services/amazon-dsp/amazon-dsp-api-contract.js.map +1 -0
  211. package/dist/services/amazon-dsp/amazon-dsp-http-client.d.ts +15 -0
  212. package/dist/services/amazon-dsp/amazon-dsp-http-client.d.ts.map +1 -0
  213. package/dist/services/amazon-dsp/amazon-dsp-http-client.js +138 -0
  214. package/dist/services/amazon-dsp/amazon-dsp-http-client.js.map +1 -0
  215. package/dist/services/amazon-dsp/amazon-dsp-reporting-service.d.ts +63 -0
  216. package/dist/services/amazon-dsp/amazon-dsp-reporting-service.d.ts.map +1 -0
  217. package/dist/services/amazon-dsp/amazon-dsp-reporting-service.js +134 -0
  218. package/dist/services/amazon-dsp/amazon-dsp-reporting-service.js.map +1 -0
  219. package/dist/services/amazon-dsp/amazon-dsp-service.d.ts +85 -0
  220. package/dist/services/amazon-dsp/amazon-dsp-service.d.ts.map +1 -0
  221. package/dist/services/amazon-dsp/amazon-dsp-service.js +182 -0
  222. package/dist/services/amazon-dsp/amazon-dsp-service.js.map +1 -0
  223. package/dist/services/amazon-dsp/types.d.ts +142 -0
  224. package/dist/services/amazon-dsp/types.d.ts.map +1 -0
  225. package/dist/services/amazon-dsp/types.js +24 -0
  226. package/dist/services/amazon-dsp/types.js.map +1 -0
  227. package/dist/services/session-services.d.ts +20 -0
  228. package/dist/services/session-services.d.ts.map +1 -0
  229. package/dist/services/session-services.js +23 -0
  230. package/dist/services/session-services.js.map +1 -0
  231. package/dist/types-global/mcp.d.ts +2 -0
  232. package/dist/types-global/mcp.d.ts.map +1 -0
  233. package/dist/types-global/mcp.js +2 -0
  234. package/dist/types-global/mcp.js.map +1 -0
  235. package/dist/utils/errors/index.d.ts +2 -0
  236. package/dist/utils/errors/index.d.ts.map +1 -0
  237. package/dist/utils/errors/index.js +2 -0
  238. package/dist/utils/errors/index.js.map +1 -0
  239. package/dist/utils/platform.d.ts +3 -0
  240. package/dist/utils/platform.d.ts.map +1 -0
  241. package/dist/utils/platform.js +5 -0
  242. package/dist/utils/platform.js.map +1 -0
  243. package/dist/utils/security/rate-limiter.d.ts +3 -0
  244. package/dist/utils/security/rate-limiter.d.ts.map +1 -0
  245. package/dist/utils/security/rate-limiter.js +5 -0
  246. package/dist/utils/security/rate-limiter.js.map +1 -0
  247. package/dist/utils/telemetry/index.d.ts +2 -0
  248. package/dist/utils/telemetry/index.d.ts.map +1 -0
  249. package/dist/utils/telemetry/index.js +2 -0
  250. package/dist/utils/telemetry/index.js.map +1 -0
  251. package/dist/utils/telemetry/tracing.d.ts +3 -0
  252. package/dist/utils/telemetry/tracing.d.ts.map +1 -0
  253. package/dist/utils/telemetry/tracing.js +4 -0
  254. package/dist/utils/telemetry/tracing.js.map +1 -0
  255. package/package.json +55 -0
@@ -0,0 +1,116 @@
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<["amazon-dsp-bearer", "jwt", "none"]>>;
19
+ amazonDspApiBaseUrl: z.ZodDefault<z.ZodString>;
20
+ amazonDspApiVersion: z.ZodDefault<z.ZodString>;
21
+ amazonDspRateLimitPerMinute: z.ZodDefault<z.ZodNumber>;
22
+ amazonDspAccessToken: z.ZodOptional<z.ZodString>;
23
+ amazonDspProfileId: z.ZodOptional<z.ZodString>;
24
+ amazonDspClientId: z.ZodOptional<z.ZodString>;
25
+ amazonDspAppId: z.ZodOptional<z.ZodString>;
26
+ amazonDspAppSecret: z.ZodOptional<z.ZodString>;
27
+ amazonDspRefreshToken: z.ZodOptional<z.ZodString>;
28
+ amazonDspReportPollIntervalMs: z.ZodDefault<z.ZodNumber>;
29
+ amazonDspReportMaxPollAttempts: z.ZodDefault<z.ZodNumber>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ serviceName: string;
32
+ port: number;
33
+ otelServiceName: string;
34
+ mcpAuthMode: "amazon-dsp-bearer" | "jwt" | "none";
35
+ amazonDspApiBaseUrl: string;
36
+ amazonDspApiVersion: string;
37
+ amazonDspRateLimitPerMinute: number;
38
+ amazonDspReportPollIntervalMs: number;
39
+ amazonDspReportMaxPollAttempts: number;
40
+ host: string;
41
+ nodeEnv: "development" | "production" | "test";
42
+ mcpStatefulSessionTimeoutMs: number;
43
+ logLevel: "debug" | "info" | "notice" | "warning" | "error";
44
+ mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
45
+ otelEnabled: boolean;
46
+ amazonDspAccessToken?: string | undefined;
47
+ amazonDspProfileId?: string | undefined;
48
+ amazonDspClientId?: string | undefined;
49
+ amazonDspAppId?: string | undefined;
50
+ amazonDspAppSecret?: string | undefined;
51
+ amazonDspRefreshToken?: string | undefined;
52
+ mcpAuthSecretKey?: string | undefined;
53
+ mcpAllowedOrigins?: string | undefined;
54
+ otelExporterOtlpTracesEndpoint?: string | undefined;
55
+ otelExporterOtlpMetricsEndpoint?: string | undefined;
56
+ gcsBucketName?: string | undefined;
57
+ }, {
58
+ serviceName?: string | undefined;
59
+ port?: number | undefined;
60
+ otelServiceName?: string | undefined;
61
+ mcpAuthMode?: "amazon-dsp-bearer" | "jwt" | "none" | undefined;
62
+ amazonDspApiBaseUrl?: string | undefined;
63
+ amazonDspApiVersion?: string | undefined;
64
+ amazonDspRateLimitPerMinute?: number | undefined;
65
+ amazonDspAccessToken?: string | undefined;
66
+ amazonDspProfileId?: string | undefined;
67
+ amazonDspClientId?: string | undefined;
68
+ amazonDspAppId?: string | undefined;
69
+ amazonDspAppSecret?: string | undefined;
70
+ amazonDspRefreshToken?: string | undefined;
71
+ amazonDspReportPollIntervalMs?: number | undefined;
72
+ amazonDspReportMaxPollAttempts?: number | undefined;
73
+ host?: string | undefined;
74
+ nodeEnv?: "development" | "production" | "test" | undefined;
75
+ mcpStatefulSessionTimeoutMs?: number | undefined;
76
+ mcpAuthSecretKey?: string | undefined;
77
+ mcpAllowedOrigins?: string | undefined;
78
+ logLevel?: "debug" | "info" | "notice" | "warning" | "error" | undefined;
79
+ mcpLogLevel?: "debug" | "info" | "notice" | "warning" | "error" | undefined;
80
+ otelEnabled?: boolean | undefined;
81
+ otelExporterOtlpTracesEndpoint?: string | undefined;
82
+ otelExporterOtlpMetricsEndpoint?: string | undefined;
83
+ gcsBucketName?: string | undefined;
84
+ }>;
85
+ export type AppConfig = z.infer<typeof ConfigSchema>;
86
+ export declare function parseConfig(): AppConfig;
87
+ export declare const mcpConfig: {
88
+ serviceName: string;
89
+ port: number;
90
+ otelServiceName: string;
91
+ mcpAuthMode: "amazon-dsp-bearer" | "jwt" | "none";
92
+ amazonDspApiBaseUrl: string;
93
+ amazonDspApiVersion: string;
94
+ amazonDspRateLimitPerMinute: number;
95
+ amazonDspReportPollIntervalMs: number;
96
+ amazonDspReportMaxPollAttempts: number;
97
+ host: string;
98
+ nodeEnv: "development" | "production" | "test";
99
+ mcpStatefulSessionTimeoutMs: number;
100
+ logLevel: "debug" | "info" | "notice" | "warning" | "error";
101
+ mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
102
+ otelEnabled: boolean;
103
+ amazonDspAccessToken?: string | undefined;
104
+ amazonDspProfileId?: string | undefined;
105
+ amazonDspClientId?: string | undefined;
106
+ amazonDspAppId?: string | undefined;
107
+ amazonDspAppSecret?: string | undefined;
108
+ amazonDspRefreshToken?: string | undefined;
109
+ mcpAuthSecretKey?: string | undefined;
110
+ mcpAllowedOrigins?: string | undefined;
111
+ otelExporterOtlpTracesEndpoint?: string | undefined;
112
+ otelExporterOtlpMetricsEndpoint?: string | undefined;
113
+ gcsBucketName?: string | undefined;
114
+ };
115
+ export {};
116
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,WAAW,IAAI,SAAS,CAsCvC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgB,CAAC"}
@@ -0,0 +1,49 @@
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("amazon-dsp-mcp"),
6
+ port: z.number().int().min(1).max(65535).default(3012),
7
+ otelServiceName: z.string().default("amazon-dsp-mcp"),
8
+ mcpAuthMode: z.enum(["amazon-dsp-bearer", "jwt", "none"]).default("amazon-dsp-bearer"),
9
+ amazonDspApiBaseUrl: z.string().url().default("https://advertising-api.amazon.com"),
10
+ amazonDspApiVersion: z.string().default("dsp"),
11
+ amazonDspRateLimitPerMinute: z.number().default(10),
12
+ amazonDspAccessToken: z.string().optional(),
13
+ amazonDspProfileId: z.string().optional(),
14
+ amazonDspClientId: z.string().optional(),
15
+ amazonDspAppId: z.string().optional(),
16
+ amazonDspAppSecret: z.string().optional(),
17
+ amazonDspRefreshToken: z.string().optional(),
18
+ amazonDspReportPollIntervalMs: z.number().default(2_000),
19
+ amazonDspReportMaxPollAttempts: z.number().default(30),
20
+ });
21
+ export function parseConfig() {
22
+ const defaultHost = getDefaultHost();
23
+ const rawConfig = {
24
+ ...getBaseEnvConfig(defaultHost),
25
+ serviceName: process.env.SERVICE_NAME,
26
+ ...(process.env.AMAZON_DSP_MCP_PORT ? { port: Number(process.env.AMAZON_DSP_MCP_PORT) } : {}),
27
+ host: process.env.AMAZON_DSP_MCP_HOST || defaultHost,
28
+ amazonDspApiBaseUrl: process.env.AMAZON_DSP_API_BASE_URL,
29
+ amazonDspApiVersion: process.env.AMAZON_DSP_API_VERSION,
30
+ amazonDspRateLimitPerMinute: process.env.AMAZON_DSP_RATE_LIMIT_PER_MINUTE
31
+ ? Number(process.env.AMAZON_DSP_RATE_LIMIT_PER_MINUTE)
32
+ : undefined,
33
+ amazonDspAccessToken: process.env.AMAZON_DSP_ACCESS_TOKEN,
34
+ amazonDspProfileId: process.env.AMAZON_DSP_PROFILE_ID,
35
+ amazonDspClientId: process.env.AMAZON_DSP_CLIENT_ID,
36
+ amazonDspAppId: process.env.AMAZON_DSP_APP_ID,
37
+ amazonDspAppSecret: process.env.AMAZON_DSP_APP_SECRET,
38
+ amazonDspRefreshToken: process.env.AMAZON_DSP_REFRESH_TOKEN,
39
+ amazonDspReportPollIntervalMs: process.env.AMAZON_DSP_REPORT_POLL_INTERVAL_MS
40
+ ? Number(process.env.AMAZON_DSP_REPORT_POLL_INTERVAL_MS)
41
+ : undefined,
42
+ amazonDspReportMaxPollAttempts: process.env.AMAZON_DSP_REPORT_MAX_POLL_ATTEMPTS
43
+ ? Number(process.env.AMAZON_DSP_REPORT_MAX_POLL_ATTEMPTS)
44
+ : undefined,
45
+ };
46
+ return parseConfigWithSchema(ConfigSchema, rawConfig);
47
+ }
48
+ export const mcpConfig = parseConfig();
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,65 @@
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 { AmazonDspAccessTokenAdapter, AmazonDspRefreshTokenAdapter, } from "./auth/amazon-dsp-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("amazon-dsp-mcp", transportMode, otelLogMixin());
12
+ async function setupStdioCredentials(sessionId) {
13
+ const profileId = mcpConfig.amazonDspProfileId;
14
+ if (!profileId) {
15
+ logger.warn("No AmazonDsp credentials found in env vars. " +
16
+ "Set AMAZON_DSP_PROFILE_ID plus either (AMAZON_DSP_APP_ID + AMAZON_DSP_APP_SECRET + " +
17
+ "AMAZON_DSP_REFRESH_TOKEN) for the refresh-token flow, or AMAZON_DSP_ACCESS_TOKEN " +
18
+ "for a short-lived static token.");
19
+ return false;
20
+ }
21
+ let authAdapter;
22
+ if (mcpConfig.amazonDspAppId && mcpConfig.amazonDspAppSecret && mcpConfig.amazonDspRefreshToken) {
23
+ authAdapter = new AmazonDspRefreshTokenAdapter({
24
+ appId: mcpConfig.amazonDspAppId,
25
+ appSecret: mcpConfig.amazonDspAppSecret,
26
+ refreshToken: mcpConfig.amazonDspRefreshToken,
27
+ }, profileId, mcpConfig.amazonDspApiBaseUrl);
28
+ logger.info("Using LwA refresh-token flow (auto-refreshing access tokens)");
29
+ }
30
+ else if (mcpConfig.amazonDspAccessToken) {
31
+ authAdapter = new AmazonDspAccessTokenAdapter(mcpConfig.amazonDspAccessToken, profileId, mcpConfig.amazonDspApiBaseUrl, mcpConfig.amazonDspClientId);
32
+ logger.warn("Using static access-token flow — token expires after 60 minutes. " +
33
+ "For long-running sessions, configure AMAZON_DSP_APP_ID + AMAZON_DSP_APP_SECRET + AMAZON_DSP_REFRESH_TOKEN instead.");
34
+ }
35
+ else {
36
+ logger.warn("No AmazonDsp credentials found. Set AMAZON_DSP_APP_ID + AMAZON_DSP_APP_SECRET + " +
37
+ "AMAZON_DSP_REFRESH_TOKEN (recommended) or AMAZON_DSP_ACCESS_TOKEN.");
38
+ return false;
39
+ }
40
+ await authAdapter.validate();
41
+ const services = createSessionServices(authAdapter, {
42
+ baseUrl: mcpConfig.amazonDspApiBaseUrl,
43
+ reportPollIntervalMs: mcpConfig.amazonDspReportPollIntervalMs,
44
+ reportMaxPollAttempts: mcpConfig.amazonDspReportMaxPollAttempts,
45
+ }, logger, rateLimiter);
46
+ sessionServiceStore.set(sessionId, services);
47
+ logger.info("Stdio session services created successfully");
48
+ return true;
49
+ }
50
+ bootstrapMcpServer({
51
+ serviceName: "amazon-dsp-mcp",
52
+ config: mcpConfig,
53
+ logger,
54
+ transportMode,
55
+ initOtel: initializeOpenTelemetry,
56
+ setupStdioSession: setupStdioCredentials,
57
+ createMcpServer,
58
+ runStdio: runStdioServer,
59
+ startHttp: startHttpServer,
60
+ onShutdown: () => rateLimiter.destroy(),
61
+ }).catch((err) => {
62
+ logger.fatal({ err }, "Failed to start amazon-dsp-mcp");
63
+ process.exit(1);
64
+ });
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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;AAEjE,eAAO,MAAM,4BAA4B,EAAE,MAgB1C,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA8GtF"}
@@ -0,0 +1,127 @@
1
+ export const bulkOperationsWorkflowPrompt = {
2
+ name: "amazon_dsp_bulk_operations_workflow",
3
+ description: "Guide for performing bulk create, update, and status operations on AmazonDsp Ads entities",
4
+ arguments: [
5
+ {
6
+ name: "profileId",
7
+ description: "AmazonDsp Advertiser ID",
8
+ required: true,
9
+ },
10
+ {
11
+ name: "entityType",
12
+ description: "Entity type to operate on (campaign, adGroup, ad)",
13
+ required: false,
14
+ },
15
+ ],
16
+ };
17
+ export function getBulkOperationsWorkflowMessage(args) {
18
+ const profileId = args?.profileId || "{profileId}";
19
+ const entityType = args?.entityType || "campaign";
20
+ return `# AmazonDsp Bulk Operations Workflow
21
+
22
+ ## Advertiser ID: \`${profileId}\`
23
+ ## Entity Type: \`${entityType}\`
24
+
25
+ ---
26
+
27
+ ## Option 1: Bulk Status Update (most common)
28
+
29
+ Pause, enable, or delete multiple entities in one call:
30
+
31
+ \`\`\`json
32
+ amazon_dsp_bulk_update_status({
33
+ "entityType": "${entityType}",
34
+ "profileId": "${profileId}",
35
+ "entityIds": ["ID_1", "ID_2", "ID_3"],
36
+ "operationStatus": "PAUSED"
37
+ })
38
+ \`\`\`
39
+
40
+ **Operation status values:**
41
+ - \`ENABLED\` — Activate entities
42
+ - \`PAUSED\` — Pause entities
43
+ - \`ARCHIVED\` — Soft delete (Amazon DSP has no hard delete)
44
+
45
+ ---
46
+
47
+ ## Option 2: Bulk Create Entities (up to 50)
48
+
49
+ Create multiple entities of the same type in one call:
50
+
51
+ \`\`\`json
52
+ amazon_dsp_bulk_create_entities({
53
+ "entityType": "${entityType}",
54
+ "profileId": "${profileId}",
55
+ "items": [
56
+ {
57
+ "campaign_name": "Campaign A",
58
+ "objective_type": "TRAFFIC",
59
+ "budget_mode": "BUDGET_MODE_DAY",
60
+ "budget": 100
61
+ },
62
+ {
63
+ "campaign_name": "Campaign B",
64
+ "objective_type": "CONVERSIONS",
65
+ "budget_mode": "BUDGET_MODE_DAY",
66
+ "budget": 200
67
+ }
68
+ ]
69
+ })
70
+ \`\`\`
71
+
72
+ ---
73
+
74
+ ## Option 3: Bulk Update Entities (up to 50)
75
+
76
+ Update specific fields on multiple entities:
77
+
78
+ \`\`\`json
79
+ amazon_dsp_bulk_update_entities({
80
+ "entityType": "${entityType}",
81
+ "profileId": "${profileId}",
82
+ "items": [
83
+ { "entityId": "ID_1", "data": { "budget": 150 } },
84
+ { "entityId": "ID_2", "data": { "budget": 250 } }
85
+ ]
86
+ })
87
+ \`\`\`
88
+
89
+ ---
90
+
91
+ ## Option 4: Bulk Bid Adjustment (ad groups only)
92
+
93
+ Safe read-modify-write bid adjustment:
94
+
95
+ \`\`\`json
96
+ amazon_dsp_adjust_bids({
97
+ "profileId": "${profileId}",
98
+ "adjustments": [
99
+ { "adGroupId": "ADGROUP_ID_1", "bidPrice": 1.5 },
100
+ { "adGroupId": "ADGROUP_ID_2", "bidPrice": 2.0 }
101
+ ],
102
+ "reason": "Increase bids to improve delivery"
103
+ })
104
+ \`\`\`
105
+
106
+ ---
107
+
108
+ ## Tips for Bulk Operations
109
+
110
+ 1. **List first**: Use \`amazon_dsp_list_entities\` to get entity IDs before bulk operations
111
+ 2. **Validate first**: Use \`amazon_dsp_validate_entity\` to check payloads before bulk create
112
+ 3. **Status update is batched**: AmazonDsp accepts IDs array in one API call
113
+ 4. **Create/Update is sequential**: Processed concurrently (5 at a time) by the MCP tool
114
+ 5. **Max 50 items**: Per bulk create/update call (more = multiple calls)
115
+ 6. **Error handling**: Partial failures are reported — some may succeed while others fail
116
+
117
+ ## Workflow: Pause all campaigns → Adjust → Re-enable
118
+
119
+ \`\`\`
120
+ 1. amazon_dsp_list_entities (get campaign IDs)
121
+ 2. amazon_dsp_bulk_update_status (DISABLE all)
122
+ 3. amazon_dsp_bulk_update_entities (adjust budgets/settings)
123
+ 4. amazon_dsp_bulk_update_status (ENABLE selected)
124
+ \`\`\`
125
+ `;
126
+ }
127
+ //# 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":"AAKA,MAAM,CAAC,MAAM,4BAA4B,GAAW;IAClD,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EACT,2FAA2F;IAC7F,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,yBAAyB;YACtC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,gCAAgC,CAAC,IAA6B;IAC5E,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,aAAa,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,UAAU,CAAC;IAElD,OAAO;;sBAEa,SAAS;oBACX,UAAU;;;;;;;;;;mBAUX,UAAU;kBACX,SAAS;;;;;;;;;;;;;;;;;;;mBAmBR,UAAU;kBACX,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0BR,UAAU;kBACX,SAAS;;;;;;;;;;;;;;;;kBAgBT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B1B,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":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,2BAA2B,EAAE,MAiBzC,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAuGrF"}
@@ -0,0 +1,120 @@
1
+ export const campaignSetupWorkflowPrompt = {
2
+ name: "amazon_dsp_campaign_setup_workflow",
3
+ description: "Step-by-step guide for creating a complete Amazon DSP campaign structure (Order > Line Item > Creative)",
4
+ arguments: [
5
+ {
6
+ name: "profileId",
7
+ description: "Amazon DSP Entity ID / Profile ID (from Amazon-Advertising-API-Scope header)",
8
+ required: true,
9
+ },
10
+ {
11
+ name: "objective",
12
+ description: "Campaign goal (e.g., REACH, REMARKETING, BEHAVIORAL_RETARGETING, CONTEXTUAL_TARGETING)",
13
+ required: false,
14
+ },
15
+ ],
16
+ };
17
+ export function getCampaignSetupWorkflowMessage(args) {
18
+ const profileId = args?.profileId || "{profileId}";
19
+ const objective = args?.objective || "REACH";
20
+ return `# Amazon DSP Campaign Setup Workflow
21
+
22
+ ## Prerequisites
23
+ - DSP Entity ID (Profile ID): \`${profileId}\`
24
+ - Ensure \`Amazon-Advertising-API-Scope\` header is set to your DSP entity ID
25
+ - Verify advertiser access: \`amazon_dsp_list_advertisers\`
26
+
27
+ ⚠️ **GOTCHA: Amazon-Advertising-API-Scope header must contain your DSP entity ID (profile ID).**
28
+ ⚠️ **GOTCHA: Budget amounts are numeric values, not micro-currency. Keep them aligned with the advertiser account currency returned by Amazon.**
29
+ ⚠️ **GOTCHA: Amazon DSP has no DELETE endpoint. Use state: "ARCHIVED" to remove entities.**
30
+
31
+ ## Step 1: Create Order (Campaign)
32
+
33
+ Orders are the top-level campaign entity in Amazon DSP.
34
+
35
+ \`\`\`json
36
+ amazon_dsp_create_entity({
37
+ "entityType": "order",
38
+ "profileId": "${profileId}",
39
+ "data": {
40
+ "name": "Q1 Brand Awareness Campaign",
41
+ "advertiserId": "ADVERTISER_ID",
42
+ "budget": 50000.00,
43
+ "startDateTime": "2026-01-01T00:00:00Z",
44
+ "endDateTime": "2026-03-31T23:59:59Z",
45
+ "state": "ENABLED"
46
+ }
47
+ })
48
+ \`\`\`
49
+
50
+ **Campaign Goals / Objectives:** REACH, REMARKETING, BEHAVIORAL_RETARGETING, CONTEXTUAL_TARGETING
51
+
52
+ ## Step 2: Create Line Item (Ad Group)
53
+
54
+ Line Items define targeting, bidding, and budget allocation within an Order.
55
+
56
+ \`\`\`json
57
+ amazon_dsp_create_entity({
58
+ "entityType": "lineItem",
59
+ "profileId": "${profileId}",
60
+ "data": {
61
+ "name": "Prospecting - Desktop Display",
62
+ "orderId": "ORDER_ID_FROM_STEP_1",
63
+ "budget": { "budgetType": "DAILY", "budget": 10000.00 },
64
+ "state": "ENABLED",
65
+ "bidding": {
66
+ "bidOptimization": "${objective === "REACH" ? "AUTO" : "MANUAL"}",
67
+ "bidAmount": 2.50
68
+ },
69
+ "targetingCriteria": {
70
+ "audience": {
71
+ "include": [{ "type": "BEHAVIORAL", "value": ["in-market-auto"] }]
72
+ }
73
+ }
74
+ }
75
+ })
76
+ \`\`\`
77
+
78
+ ## Step 3: Create Creative
79
+
80
+ Creatives define the ad format and click-through destination.
81
+
82
+ \`\`\`json
83
+ amazon_dsp_create_entity({
84
+ "entityType": "creative",
85
+ "profileId": "${profileId}",
86
+ "data": {
87
+ "name": "300x250 Banner - Brand",
88
+ "advertiserId": "ADVERTISER_ID",
89
+ "clickThroughUrl": "https://example.com/landing",
90
+ "creativeType": "STANDARD_DISPLAY",
91
+ "state": "ENABLED"
92
+ }
93
+ })
94
+ \`\`\`
95
+
96
+ **Creative Types:** STANDARD_DISPLAY, VIDEO, RICH_MEDIA
97
+
98
+ ## Step 4: Verify & Activate
99
+
100
+ 1. Review entities: \`amazon_dsp_get_entity\` for each created entity
101
+ 2. Activate if paused: \`amazon_dsp_bulk_update_status\` with operationStatus: "ENABLED"
102
+
103
+ ## Common Errors
104
+
105
+ | Error | Cause | Fix |
106
+ |-------|-------|-----|
107
+ | 401 Unauthorized | Missing or invalid access token | Check Authorization: Bearer header |
108
+ | 403 Forbidden | Missing API scope header | Set Amazon-Advertising-API-Scope to your DSP entity ID |
109
+ | 400 Bad Request | Invalid date format | Use ISO 8601: YYYY-MM-DDTHH:mm:ssZ |
110
+ | 400 Bad Request | Budget too low | Amazon DSP requires minimum budget thresholds |
111
+
112
+ ## Success Criteria
113
+
114
+ - [ ] Order created with correct budget and date range
115
+ - [ ] Line Item linked to Order via orderId
116
+ - [ ] Creative linked to correct advertiserId
117
+ - [ ] All entities in ENABLED state
118
+ `;
119
+ }
120
+ //# sourceMappingURL=campaign-setup-workflow.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign-setup-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,2BAA2B,GAAW;IACjD,IAAI,EAAE,oCAAoC;IAC1C,WAAW,EACT,yGAAyG;IAC3G,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,8EAA8E;YAC3F,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,wFAAwF;YAC1F,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,IAA6B;IAC3E,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,aAAa,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC;IAE7C,OAAO;;;kCAGyB,SAAS;;;;;;;;;;;;;;;kBAezB,SAAS;;;;;;;;;;;;;;;;;;;;;kBAqBT,SAAS;;;;;;;4BAOC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;kBAmBnD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC1B,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const amazonDspCreativeUploadWorkflowPrompt: Prompt;
3
+ export declare function getAmazonDspCreativeUploadWorkflowMessage(args?: Record<string, string>): string;
4
+ //# sourceMappingURL=creative-upload-workflow.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creative-upload-workflow.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/creative-upload-workflow.prompt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,qCAAqC,EAAE,MAgBnD,CAAC;AAEF,wBAAgB,yCAAyC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAqG/F"}
@@ -0,0 +1,116 @@
1
+ export const amazonDspCreativeUploadWorkflowPrompt = {
2
+ name: "amazon_dsp_creative_upload_workflow",
3
+ description: "Step-by-step guide for uploading creative assets and creating AmazonDsp Ads creatives",
4
+ arguments: [
5
+ {
6
+ name: "profileId",
7
+ description: "AmazonDsp Advertiser ID",
8
+ required: true,
9
+ },
10
+ {
11
+ name: "creativeType",
12
+ description: "Type of creative: image or video",
13
+ required: false,
14
+ },
15
+ ],
16
+ };
17
+ export function getAmazonDspCreativeUploadWorkflowMessage(args) {
18
+ const profileId = args?.profileId || "{profileId}";
19
+ const creativeType = args?.creativeType || "video";
20
+ return `# AmazonDsp Ads Creative Upload Workflow
21
+
22
+ ## Prerequisites
23
+ - Advertiser ID: \`${profileId}\`
24
+ - A publicly accessible URL for your media file
25
+
26
+ ## Overview
27
+ AmazonDsp creative workflow: Upload media → Create Ad Group → Create Ad with creative
28
+
29
+ ---
30
+
31
+ ## Step 1: Upload ${creativeType === "image" ? "Image" : "Video"}
32
+
33
+ ${creativeType === "image"
34
+ ? `
35
+ \`\`\`json
36
+ amazon_dsp_upload_image({
37
+ "profileId": "${profileId}",
38
+ "mediaUrl": "https://example.com/your-image.jpg"
39
+ })
40
+ \`\`\`
41
+
42
+ **Returns:** \`imageId\`
43
+
44
+ **Image requirements:**
45
+ - Formats: JPEG, PNG
46
+ - Max 100KB for feed ads
47
+ - Recommended: 1200x628px, 1080x1080px, 720x1280px
48
+ `
49
+ : `
50
+ \`\`\`json
51
+ amazon_dsp_upload_video({
52
+ "profileId": "${profileId}",
53
+ "mediaUrl": "https://example.com/your-video.mp4",
54
+ "videoName": "Campaign Video"
55
+ })
56
+ \`\`\`
57
+
58
+ **Returns:** \`videoId\`
59
+
60
+ ⚠️ **GOTCHA**: Video processing takes 20-120 seconds. The tool polls automatically (20s intervals, up to 10 min).
61
+ When \`video_status == "bind_success"\`, the video is ready.
62
+
63
+ **Video requirements:**
64
+ - Formats: MP4, MOV, AVI
65
+ - Max 500MB
66
+ - Min resolution: 540x960 (9:16), 960x540 (16:9), or 640x640 (1:1)
67
+ - Duration: 5-60 seconds for In-Feed ads
68
+ `}
69
+
70
+ ## Step 2: Create Creative
71
+
72
+ \`\`\`json
73
+ amazon_dsp_create_entity({
74
+ "entityType": "creative",
75
+ "advertiserId": "${profileId}",
76
+ "data": {
77
+ "name": "Your Creative Name",
78
+ "advertiserId": "${profileId}",
79
+ "creativeType": "${creativeType === "image" ? "IMAGE" : "VIDEO"}",
80
+ ${creativeType === "image" ? `"imageId": "{imageId_from_step_1}",` : `"videoId": "{videoId_from_step_1}",`}
81
+ "clickUrl": "https://yoursite.com",
82
+ "state": "paused"
83
+ }
84
+ })
85
+ \`\`\`
86
+
87
+ ⚠️ **GOTCHA**: Amazon DSP creatives go through a review process. Initial state should be \`paused\` until ready to launch.
88
+
89
+ ## Step 3: Preview Creative
90
+
91
+ \`\`\`json
92
+ amazon_dsp_get_ad_preview({
93
+ "advertiserId": "${profileId}",
94
+ "adId": "{creative_id_from_step_2}",
95
+ "adFormat": "DISPLAY"
96
+ })
97
+ \`\`\`
98
+
99
+ ## Common Errors
100
+
101
+ | Error | Cause | Fix |
102
+ |-------|-------|-----|
103
+ | "Video processing failed" | Unsupported codec | Re-encode to H.264 MP4 |
104
+ | "Image size exceeded" | File too large | Compress to < 100KB |
105
+ | "Ad review rejected" | Policy violation | Review AmazonDsp ad policies |
106
+ | "bind_success timeout" | Slow processing | Check video_status manually |
107
+
108
+ ## Success Criteria
109
+ - [ ] Media uploaded (imageId or videoId obtained)
110
+ - [ ] Creative created with paused state
111
+ - [ ] Preview reviewed
112
+ - [ ] State changed to delivering when ready to launch
113
+
114
+ `;
115
+ }
116
+ //# sourceMappingURL=creative-upload-workflow.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creative-upload-workflow.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/creative-upload-workflow.prompt.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,qCAAqC,GAAW;IAC3D,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EACT,uFAAuF;IACzF,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,yBAAyB;YACtC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,yCAAyC,CAAC,IAA6B;IACrF,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,aAAa,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,OAAO,CAAC;IAEnD,OAAO;;;qBAGY,SAAS;;;;;;;;oBAQV,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;;EAG9D,YAAY,KAAK,OAAO;QACtB,CAAC,CAAC;;;kBAGY,SAAS;;;;;;;;;;;CAW1B;QACG,CAAC,CAAC;;;kBAGY,SAAS;;;;;;;;;;;;;;;;CAiB3B;;;;;;;qBAOqB,SAAS;;;uBAGP,SAAS;uBACT,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;MAC7D,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,qCAAqC;;;;;;;;;;;;;qBAazF,SAAS;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC;AACF,CAAC"}