import { z } from "zod";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { PulseApiClient } from "../client.js";
import { formatResult } from "../format.js";
export function registerBillingTools(server: McpServer, client: PulseApiClient) {
server.tool(
"list_invoices",
"List invoices for a product, optionally filtered by status",
{
productId: z.string().describe("The product ID"),
status: z.string().optional().describe("Filter by invoice status (e.g. 'draft', 'sent', 'paid')"),
},
async ({ productId, status }) => {
const result = await client.get(
`/api/v1/billing/products/${productId}/invoices`,
{ status }
);
return { content: [{ type: "text", text: formatResult(result) }] };
}
);
server.tool(
"generate_invoice",
"Generate an invoice for a customer's usage in a given period",
{
productId: z.string().describe("The product ID"),
customerId: z.string().describe("The customer's external ID"),
periodStart: z.string().describe("Billing period start (ISO 8601 date)"),
periodEnd: z.string().describe("Billing period end (ISO 8601 date)"),
},
async ({ productId, ...body }) => {
const result = await client.post(
`/api/v1/billing/products/${productId}/invoices`,
body
);
return { content: [{ type: "text", text: formatResult(result) }] };
}
);
server.tool(
"get_invoice",
"Get detailed information about a specific invoice",
{
productId: z.string().describe("The product ID"),
invoiceId: z.string().describe("The invoice ID"),
},
async ({ productId, invoiceId }) => {
const result = await client.get(
`/api/v1/billing/products/${productId}/invoices/${invoiceId}`
);
return { content: [{ type: "text", text: formatResult(result) }] };
}
);
server.tool(
"send_invoice",
"Send (or re-send) an invoice via email to the customer",
{
productId: z.string().describe("The product ID"),
invoiceId: z.string().describe("The invoice ID"),
},
async ({ productId, invoiceId }) => {
const result = await client.post(
`/api/v1/billing/products/${productId}/invoices/${invoiceId}/send`
);
return { content: [{ type: "text", text: formatResult(result) }] };
}
);
}