114 lines
4.1 KiB
TypeScript
114 lines
4.1 KiB
TypeScript
import { z } from 'zod';
|
|
import { BrevoApiClient } from '../types/api-client.js';
|
|
import { SMSCampaign } from '../types/index.js';
|
|
|
|
export function createSmsTools(client: BrevoApiClient) {
|
|
return [
|
|
{
|
|
name: 'brevo_list_sms_campaigns',
|
|
description: 'List all SMS campaigns',
|
|
inputSchema: z.object({
|
|
status: z.enum(['draft', 'sent', 'queued', 'suspended', 'inProcess']).optional().describe('Filter by status'),
|
|
limit: z.number().optional().describe('Number of campaigns (default: 50)'),
|
|
offset: z.number().optional().describe('Pagination offset'),
|
|
sort: z.enum(['asc', 'desc']).optional().describe('Sort by creation date'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
const params: any = {
|
|
limit: args.limit || 50,
|
|
offset: args.offset || 0,
|
|
};
|
|
if (args.status) params.status = args.status;
|
|
if (args.sort) params.sort = args.sort;
|
|
|
|
const result = await client.getPaginated<SMSCampaign>('/smsCampaigns', params);
|
|
return {
|
|
campaigns: result.items,
|
|
total: result.total,
|
|
count: result.items.length,
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'brevo_get_sms_campaign',
|
|
description: 'Get details of a specific SMS campaign',
|
|
inputSchema: z.object({
|
|
campaignId: z.number().describe('SMS campaign ID'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
return await client.get<SMSCampaign>(`/smsCampaigns/${args.campaignId}`);
|
|
},
|
|
},
|
|
{
|
|
name: 'brevo_create_sms_campaign',
|
|
description: 'Create a new SMS campaign',
|
|
inputSchema: z.object({
|
|
name: z.string().describe('Campaign name'),
|
|
sender: z.string().describe('Sender name or phone number'),
|
|
content: z.string().describe('SMS content'),
|
|
recipients: z.object({
|
|
listIds: z.array(z.number()).optional(),
|
|
exclusionListIds: z.array(z.number()).optional(),
|
|
}).optional().describe('Recipients configuration'),
|
|
scheduledAt: z.string().optional().describe('Schedule date-time (ISO 8601)'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
const data: any = {
|
|
name: args.name,
|
|
sender: args.sender,
|
|
content: args.content,
|
|
};
|
|
if (args.recipients) data.recipients = args.recipients;
|
|
if (args.scheduledAt) data.scheduledAt = args.scheduledAt;
|
|
|
|
return await client.post('/smsCampaigns', data);
|
|
},
|
|
},
|
|
{
|
|
name: 'brevo_update_sms_campaign',
|
|
description: 'Update an SMS campaign',
|
|
inputSchema: z.object({
|
|
campaignId: z.number().describe('Campaign ID'),
|
|
name: z.string().optional().describe('Campaign name'),
|
|
sender: z.string().optional().describe('Sender'),
|
|
content: z.string().optional().describe('SMS content'),
|
|
recipients: z.object({
|
|
listIds: z.array(z.number()).optional(),
|
|
exclusionListIds: z.array(z.number()).optional(),
|
|
}).optional().describe('Recipients'),
|
|
scheduledAt: z.string().optional().describe('Schedule date-time'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
const data: any = {};
|
|
if (args.name) data.name = args.name;
|
|
if (args.sender) data.sender = args.sender;
|
|
if (args.content) data.content = args.content;
|
|
if (args.recipients) data.recipients = args.recipients;
|
|
if (args.scheduledAt) data.scheduledAt = args.scheduledAt;
|
|
|
|
return await client.put(`/smsCampaigns/${args.campaignId}`, data);
|
|
},
|
|
},
|
|
{
|
|
name: 'brevo_send_sms_campaign',
|
|
description: 'Send an SMS campaign immediately',
|
|
inputSchema: z.object({
|
|
campaignId: z.number().describe('Campaign ID'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
return await client.post(`/smsCampaigns/${args.campaignId}/sendNow`);
|
|
},
|
|
},
|
|
{
|
|
name: 'brevo_get_sms_campaign_report',
|
|
description: 'Get report for an SMS campaign',
|
|
inputSchema: z.object({
|
|
campaignId: z.number().describe('Campaign ID'),
|
|
}),
|
|
execute: async (args: any) => {
|
|
return await client.get(`/smsCampaigns/${args.campaignId}/report`);
|
|
},
|
|
},
|
|
];
|
|
}
|