import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { apiRequest, formatResponse, textContent } from "../api-client.js";
interface Campaign {
id: number;
name?: string | null;
legacy_id?: number | null;
active?: boolean;
status?: string | null;
country_code?: string | null;
os?: string | null;
client?: { id: number; name: string } | null;
mobile_app?: { id: number; name: string } | null;
created_at?: string;
updated_at?: string;
}
export function registerCampaignTools(server: McpServer) {
// List campaigns
server.tool(
"list_campaigns",
"List campaigns with optional filters. Campaigns represent advertising campaigns for clients.",
{
name_cont: z.string().optional().describe("Filter campaigns whose name contains this substring"),
client_id: z.number().optional().describe("Filter by client ID"),
partner_id: z.number().optional().describe("Filter by partner ID"),
pod_id: z.number().optional().describe("Filter by pod ID (via client)"),
active_status: z.enum(["active", "inactive", "all"]).optional().describe("Filter by active status (default: active)"),
with_spend: z.boolean().optional().describe("Only include campaigns with spend (default: true)"),
},
async ({ name_cont, client_id, partner_id, pod_id, active_status, with_spend }) => {
const response = await apiRequest<Campaign[]>("/campaigns.json", {
name_cont,
client_id,
partner_id,
pod_id,
active_status,
with_spend,
});
if (response.error) {
return textContent(`Error: ${response.error}`);
}
return textContent(formatResponse(response));
}
);
// Get campaign details
server.tool(
"get_campaign",
"Get detailed information about a specific campaign by ID.",
{
id: z.number().describe("The campaign ID"),
},
async ({ id }) => {
const response = await apiRequest<Campaign>(`/campaigns/${id}.json`);
if (response.error) {
return textContent(`Error: ${response.error}`);
}
return textContent(formatResponse(response));
}
);
}