openai-ads-mcp 0.1.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.
@@ -0,0 +1,245 @@
1
+ import { existsSync } from "node:fs";
2
+ import { z } from "zod";
3
+ import { badRequest, getClientOrError, handleApiError, ok, optionalParams, validateIntRange, validateNonEmpty, validateOption, } from "../core.js";
4
+ const AD_STATES = new Set(["activate", "pause", "archive"]);
5
+ const AD_STATUSES = new Set(["active", "paused", "archived"]);
6
+ const CREATIVE_TYPES = new Set(["chat_card", "product_ad_template"]);
7
+ export function buildCreative(input) {
8
+ const hasAny = ["creative_type", "title", "body", "target_url", "file_id", "price"].some((key) => input[key] !== undefined);
9
+ if (!hasAny)
10
+ return input.create ? [null, badRequest("creative_type, title, and body are required.")] : [null, null];
11
+ const creativeType = String(input.creative_type);
12
+ if (!CREATIVE_TYPES.has(creativeType))
13
+ return [null, badRequest("creative_type must be chat_card or product_ad_template.")];
14
+ const titleError = validateNonEmpty("title", input.title, 3, 50);
15
+ if (titleError)
16
+ return [null, titleError];
17
+ if (typeof input.body !== "string")
18
+ return [null, badRequest("body is required.")];
19
+ if (input.body.length > 100)
20
+ return [null, badRequest("body must be at most 100 characters.")];
21
+ const creative = { type: creativeType, title: input.title, body: input.body };
22
+ if (creativeType === "chat_card") {
23
+ const targetError = validateNonEmpty("target_url", input.target_url, 1, 2048);
24
+ if (targetError)
25
+ return [null, targetError];
26
+ const fileError = validateNonEmpty("file_id", input.file_id);
27
+ if (fileError)
28
+ return [null, fileError];
29
+ creative.target_url = input.target_url;
30
+ creative.file_id = input.file_id;
31
+ }
32
+ if (input.price !== undefined && input.price !== null) {
33
+ if (String(input.price).length > 100)
34
+ return [null, badRequest("price must be at most 100 characters.")];
35
+ creative.price = input.price;
36
+ }
37
+ return [creative, null];
38
+ }
39
+ export function buildAdBody(input) {
40
+ const payload = {};
41
+ const create = input.create === true;
42
+ if (create) {
43
+ const adGroupError = validateNonEmpty("ad_group_id", input.ad_group_id);
44
+ if (adGroupError)
45
+ return [null, adGroupError];
46
+ payload.ad_group_id = input.ad_group_id;
47
+ }
48
+ if (input.name !== undefined && input.name !== null) {
49
+ const nameError = validateNonEmpty("name", input.name, 3, 1000);
50
+ if (nameError)
51
+ return [null, nameError];
52
+ payload.name = String(input.name).trim();
53
+ }
54
+ else if (create) {
55
+ return [null, badRequest("name is required.")];
56
+ }
57
+ const [creative, creativeError] = buildCreative(input);
58
+ if (creativeError)
59
+ return [null, creativeError];
60
+ if (creative)
61
+ payload.creative = creative;
62
+ const status = input.status ?? (create ? "paused" : undefined);
63
+ if (status !== undefined) {
64
+ if (!AD_STATUSES.has(status))
65
+ return [null, badRequest("status must be active, paused, or archived.")];
66
+ if (create && status !== "paused")
67
+ return [null, badRequest("Create tools only create paused ads. Use set_ad_state after review.")];
68
+ payload.status = status;
69
+ }
70
+ if (!Object.keys(payload).length)
71
+ return [null, badRequest("Provide at least one field to update.")];
72
+ return [payload, null];
73
+ }
74
+ async function listAds(args) {
75
+ const adGroupError = validateNonEmpty("ad_group_id", args.ad_group_id);
76
+ if (adGroupError)
77
+ return adGroupError;
78
+ const limit = Number(args.limit ?? 20);
79
+ const limitError = validateIntRange("limit", limit, 1, 500);
80
+ if (limitError)
81
+ return limitError;
82
+ const { client, error } = getClientOrError();
83
+ if (error)
84
+ return error;
85
+ try {
86
+ return ok(await client.get("/ads", optionalParams({ ad_group_id: args.ad_group_id, limit, after: args.after, before: args.before, order: args.order ?? "desc" })));
87
+ }
88
+ catch (apiError) {
89
+ return handleApiError(apiError);
90
+ }
91
+ }
92
+ async function getAd(args) {
93
+ const adError = validateNonEmpty("ad_id", args.ad_id);
94
+ if (adError)
95
+ return adError;
96
+ const { client, error } = getClientOrError();
97
+ if (error)
98
+ return error;
99
+ try {
100
+ return ok(await client.get(`/ads/${args.ad_id}`));
101
+ }
102
+ catch (apiError) {
103
+ return handleApiError(apiError);
104
+ }
105
+ }
106
+ async function uploadCreative(args) {
107
+ if (Boolean(args.image_url) === Boolean(args.file_path))
108
+ return badRequest("Provide exactly one of image_url or file_path.");
109
+ const { client, error } = getClientOrError();
110
+ if (error)
111
+ return error;
112
+ try {
113
+ if (args.image_url)
114
+ return ok(await client.post("/upload", { image_url: args.image_url }));
115
+ const filePath = String(args.file_path);
116
+ if (!existsSync(filePath))
117
+ return badRequest("file_path must point to an existing file.");
118
+ return ok(await client.uploadFile("/upload", filePath));
119
+ }
120
+ catch (apiError) {
121
+ return handleApiError(apiError);
122
+ }
123
+ }
124
+ async function createAd(args) {
125
+ const [payload, payloadError] = buildAdBody({ ...args, status: String(args.status ?? "paused"), create: true });
126
+ if (payloadError)
127
+ return payloadError;
128
+ const { client, error } = getClientOrError();
129
+ if (error)
130
+ return error;
131
+ try {
132
+ return ok(await client.post("/ads", payload));
133
+ }
134
+ catch (apiError) {
135
+ return handleApiError(apiError);
136
+ }
137
+ }
138
+ async function updateAd(args) {
139
+ const adError = validateNonEmpty("ad_id", args.ad_id);
140
+ if (adError)
141
+ return adError;
142
+ const [payload, payloadError] = buildAdBody(args);
143
+ if (payloadError)
144
+ return payloadError;
145
+ const { client, error } = getClientOrError();
146
+ if (error)
147
+ return error;
148
+ try {
149
+ return ok(await client.post(`/ads/${args.ad_id}`, payload));
150
+ }
151
+ catch (apiError) {
152
+ return handleApiError(apiError);
153
+ }
154
+ }
155
+ async function setAdState(args) {
156
+ const adError = validateNonEmpty("ad_id", args.ad_id);
157
+ if (adError)
158
+ return adError;
159
+ const state = String(args.state);
160
+ const stateError = validateOption("state", state, AD_STATES);
161
+ if (stateError)
162
+ return stateError;
163
+ const { client, error } = getClientOrError();
164
+ if (error)
165
+ return error;
166
+ try {
167
+ return ok(await client.post(`/ads/${args.ad_id}/${state}`));
168
+ }
169
+ catch (apiError) {
170
+ return handleApiError(apiError);
171
+ }
172
+ }
173
+ const orderSchema = z.enum(["asc", "desc"]).default("desc");
174
+ const creativeTypeSchema = z.enum(["chat_card", "product_ad_template"]);
175
+ export const adTools = [
176
+ {
177
+ name: "list_ads",
178
+ description: "List ads in an ad group.",
179
+ inputSchema: { ad_group_id: z.string(), limit: z.number().int().default(20), after: z.string().optional(), before: z.string().optional(), order: orderSchema },
180
+ argNames: ["ad_group_id", "limit", "after", "before", "order"],
181
+ handler: listAds,
182
+ },
183
+ {
184
+ name: "get_ad",
185
+ description: "Get one ad by id, including review_status and creative metadata.",
186
+ inputSchema: { ad_id: z.string() },
187
+ argNames: ["ad_id"],
188
+ handler: getAd,
189
+ },
190
+ {
191
+ name: "upload_creative",
192
+ description: "Upload a creative image by image_url or local file_path and receive a file_id.",
193
+ inputSchema: { image_url: z.string().optional(), file_path: z.string().optional() },
194
+ argNames: ["image_url", "file_path"],
195
+ writes: true,
196
+ handler: uploadCreative,
197
+ },
198
+ {
199
+ name: "create_ad",
200
+ description: "Create a paused ad. chat_card creatives require target_url and file_id.",
201
+ inputSchema: {
202
+ ad_group_id: z.string(),
203
+ name: z.string(),
204
+ creative_type: creativeTypeSchema,
205
+ title: z.string(),
206
+ body: z.string(),
207
+ target_url: z.string().optional(),
208
+ file_id: z.string().optional(),
209
+ price: z.string().optional(),
210
+ status: z.enum(["paused", "active"]).default("paused"),
211
+ },
212
+ argNames: ["ad_group_id", "name", "creative_type", "title", "body", "target_url", "file_id", "price", "status"],
213
+ writes: true,
214
+ handler: createAd,
215
+ },
216
+ {
217
+ name: "update_ad",
218
+ description: "Update ad name, creative, or status.",
219
+ inputSchema: {
220
+ ad_id: z.string(),
221
+ name: z.string().optional(),
222
+ creative_type: creativeTypeSchema.optional(),
223
+ title: z.string().optional(),
224
+ body: z.string().optional(),
225
+ target_url: z.string().optional(),
226
+ file_id: z.string().optional(),
227
+ price: z.string().optional(),
228
+ status: z.enum(["active", "paused", "archived"]).optional(),
229
+ },
230
+ argNames: ["ad_id", "name", "creative_type", "title", "body", "target_url", "file_id", "price", "status"],
231
+ writes: true,
232
+ handler: updateAd,
233
+ },
234
+ {
235
+ name: "set_ad_state",
236
+ description: "Activate, pause, or archive an ad. Activation can start real delivery once parent layers are active.",
237
+ inputSchema: { ad_id: z.string(), state: z.enum(["activate", "pause", "archive"]) },
238
+ argNames: ["ad_id", "state"],
239
+ writes: true,
240
+ destructive: true,
241
+ openWorld: true,
242
+ handler: setAdState,
243
+ },
244
+ ];
245
+ //# sourceMappingURL=ads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ads.js","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type AdsToolDefinition } from "../core.js";
2
+ export declare const audienceTools: AdsToolDefinition[];
@@ -0,0 +1,163 @@
1
+ import { z } from "zod";
2
+ import { badRequest, coerceList, getClientOrError, handleApiError, isRecord, ok, optionalParams, validateIntRange, validateNonEmpty, } from "../core.js";
3
+ async function listAudiences(args) {
4
+ const limit = Number(args.limit ?? 20);
5
+ const limitError = validateIntRange("limit", limit, 1, 500);
6
+ if (limitError)
7
+ return limitError;
8
+ const { client, error } = getClientOrError();
9
+ if (error)
10
+ return error;
11
+ try {
12
+ return ok(await client.get("/custom_audiences", optionalParams({ limit, after: args.after, before: args.before, order: args.order ?? "desc" })));
13
+ }
14
+ catch (apiError) {
15
+ return handleApiError(apiError);
16
+ }
17
+ }
18
+ async function getAudience(args) {
19
+ const audienceError = validateNonEmpty("audience_id", args.audience_id);
20
+ if (audienceError)
21
+ return audienceError;
22
+ const { client, error } = getClientOrError();
23
+ if (error)
24
+ return error;
25
+ try {
26
+ return ok(await client.get(`/custom_audiences/${args.audience_id}`));
27
+ }
28
+ catch (apiError) {
29
+ return handleApiError(apiError);
30
+ }
31
+ }
32
+ async function searchGeo(args) {
33
+ const queryError = validateNonEmpty("query", args.query, 1, 200);
34
+ if (queryError)
35
+ return queryError;
36
+ const { client, error } = getClientOrError();
37
+ if (error)
38
+ return error;
39
+ try {
40
+ return ok(await client.get("/geo_lookup/search", { q: args.query, limit: 20 }));
41
+ }
42
+ catch (apiError) {
43
+ return handleApiError(apiError);
44
+ }
45
+ }
46
+ function membersPayload(members) {
47
+ const [memberList, error] = coerceList(members, "members");
48
+ if (error)
49
+ return [null, error];
50
+ if (!memberList?.length)
51
+ return [null, badRequest("members is required for action='create'.")];
52
+ const out = [];
53
+ for (const member of memberList) {
54
+ if (!isRecord(member))
55
+ return [null, badRequest("Each audience member must be an object.")];
56
+ if (!["email", "phone", "email_sha256", "phone_number_sha256"].includes(String(member.identifier_type))) {
57
+ return [null, badRequest("member identifier_type must be email, phone, email_sha256, or phone_number_sha256.")];
58
+ }
59
+ if (typeof member.value !== "string" || !member.value)
60
+ return [null, badRequest("Each audience member must include a non-empty value.")];
61
+ out.push({ identifier_type: member.identifier_type, value: member.value });
62
+ }
63
+ return [out, null];
64
+ }
65
+ async function manageAudience(args) {
66
+ const { client, error } = getClientOrError();
67
+ if (error)
68
+ return error;
69
+ try {
70
+ if (args.action === "create") {
71
+ const nameError = validateNonEmpty("name", args.name, 3, 1000);
72
+ if (nameError)
73
+ return nameError;
74
+ const [members, membersError] = membersPayload(args.members);
75
+ if (membersError)
76
+ return membersError;
77
+ const body = { name: args.name, members };
78
+ if (args.description)
79
+ body.description = args.description;
80
+ return ok(await client.post("/custom_audiences", body));
81
+ }
82
+ if (args.action === "upload") {
83
+ const nameError = validateNonEmpty("name", args.name, 3, 1000);
84
+ if (nameError)
85
+ return nameError;
86
+ for (const fieldName of ["file_id", "filename", "mimetype"]) {
87
+ const fieldError = validateNonEmpty(fieldName, args[fieldName]);
88
+ if (fieldError)
89
+ return fieldError;
90
+ }
91
+ const fileSize = Number(args.file_size);
92
+ if (!fileSize || fileSize < 1)
93
+ return badRequest("file_size must be at least 1.");
94
+ const body = {
95
+ name: args.name,
96
+ file_id: args.file_id,
97
+ filename: args.filename,
98
+ mimetype: args.mimetype,
99
+ file_size: fileSize,
100
+ };
101
+ if (args.description)
102
+ body.description = args.description;
103
+ if (args.identifier_type)
104
+ body.identifier_type = args.identifier_type;
105
+ return ok(await client.post("/custom_audiences/upload", body));
106
+ }
107
+ if (args.action === "archive") {
108
+ const audienceError = validateNonEmpty("audience_id", args.audience_id);
109
+ if (audienceError)
110
+ return audienceError;
111
+ return ok(await client.post(`/custom_audiences/${args.audience_id}/archive`));
112
+ }
113
+ return badRequest(`Unknown action: ${String(args.action)}`);
114
+ }
115
+ catch (apiError) {
116
+ return handleApiError(apiError);
117
+ }
118
+ }
119
+ const orderSchema = z.enum(["asc", "desc"]).default("desc");
120
+ export const audienceTools = [
121
+ {
122
+ name: "list_audiences",
123
+ description: "List custom audiences for the authenticated ad account.",
124
+ inputSchema: { limit: z.number().int().default(20), after: z.string().optional(), before: z.string().optional(), order: orderSchema },
125
+ argNames: ["limit", "after", "before", "order"],
126
+ handler: listAudiences,
127
+ },
128
+ {
129
+ name: "get_audience",
130
+ description: "Get one custom audience by id.",
131
+ inputSchema: { audience_id: z.string() },
132
+ argNames: ["audience_id"],
133
+ handler: getAudience,
134
+ },
135
+ {
136
+ name: "search_geo",
137
+ description: "Search geo targets for targeting.locations.include and return ids usable in campaign targeting.",
138
+ inputSchema: { query: z.string() },
139
+ argNames: ["query"],
140
+ handler: searchGeo,
141
+ },
142
+ {
143
+ name: "manage_audience",
144
+ description: "Create, upload, or archive a custom audience.",
145
+ inputSchema: {
146
+ action: z.enum(["create", "upload", "archive"]),
147
+ name: z.string().optional(),
148
+ description: z.string().optional(),
149
+ members: z.any().optional(),
150
+ audience_id: z.string().optional(),
151
+ file_id: z.string().optional(),
152
+ identifier_type: z.enum(["email", "phone", "email_sha256", "phone_number_sha256"]).optional(),
153
+ filename: z.string().optional(),
154
+ mimetype: z.string().optional(),
155
+ file_size: z.number().int().optional(),
156
+ },
157
+ argNames: ["action", "name", "description", "members", "audience_id", "file_id", "identifier_type", "filename", "mimetype", "file_size"],
158
+ writes: true,
159
+ destructive: true,
160
+ handler: manageAudience,
161
+ },
162
+ ];
163
+ //# sourceMappingURL=audiences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audiences.js","sourceRoot":"","sources":["../../src/tools/audiences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type AdsToolDefinition, type JsonRecord } from "../core.js";
2
+ export declare function locationsPayload(locations: unknown): [JsonRecord | null, string | null];
3
+ export declare function buildCampaignBody(input: {
4
+ name?: unknown;
5
+ budget_usd?: unknown;
6
+ status?: string;
7
+ description?: unknown;
8
+ start_time?: unknown;
9
+ end_time?: unknown;
10
+ mode?: string;
11
+ locations?: unknown;
12
+ confirm_budget?: unknown;
13
+ create?: boolean;
14
+ }): [JsonRecord | null, string | null];
15
+ export declare const campaignTools: AdsToolDefinition[];