list_invoices
Retrieve and filter payment invoices from Visa Acceptance with pagination controls to manage transaction records efficiently.
Instructions
This tool will list invoices from Visa Acceptance.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| offset | Yes | Pagination offset (required) | |
| limit | Yes | Pagination limit (required) | |
| status | No | Filter by status (optional) |
Implementation Reference
- The core handler function `listInvoices` that implements the list_invoices tool logic, calling Cybersource InvoicesApi.getAllInvoices and applying customer info masking.export const listInvoices = async ( visaClient: any, context: VisaContext, params: z.infer<ReturnType<typeof listInvoicesParameters>> ) => { try { const invoiceApiInstance = new cybersourceRestApi.InvoicesApi(visaClient.configuration, visaClient.visaApiClient); const opts: { status?: string } = {}; if (params.status != null && params.status !== '') { opts.status = params.status; } console.log('Sending request with params:', JSON.stringify({ offset: params.offset, limit: params.limit, opts })); const result = await new Promise((resolve, reject) => { invoiceApiInstance.getAllInvoices( params.offset, params.limit, opts, (error: any, data: any, response: any) => { if (error) { console.error('Error in listInvoices:', JSON.stringify(error)); reject(error); } else { console.log('Response from getAllInvoices:', JSON.stringify(response)); resolve(data); } } ); }); const typedResult = result as any; let maskedResult = maskInvoicesCustomerInfo(typedResult); return maskedResult; } catch (error) { console.error('Failed to list invoices:', error); return 'Failed to list invoices'; } };
- Zod input schema for the list_invoices tool parameters: offset (number, required), limit (number, required), status (string, optional).export const listInvoicesParameters = ( context: VisaContext = {} as VisaContext ) => { return z.object({ offset: z.number().describe('Pagination offset (required)'), limit: z.number().describe('Pagination limit (required)'), status: z.string().optional().describe('Filter by status (optional)') }); };
- typescript/src/shared/invoices/listInvoices.ts:71-84 (registration)Tool registration object defining method 'list_invoices', name, description, parameters schema, actions, and execute handler reference.const tool = (context: VisaContext): Tool => ({ method: 'list_invoices', name: 'List Invoices', description: listInvoicesPrompt(context), parameters: listInvoicesParameters(context), actions: { invoices: { read: true, }, }, execute: listInvoices, }); export default tool;
- typescript/src/shared/tools.ts:40-53 (registration)Aggregates and exports list of tools including listInvoicesToolModule in createTools function, used by API and toolkits.export function createTools(context: VisaContext): Tool[] { return [ createInvoiceToolModule(context), updateInvoiceToolModule(context), getInvoiceToolModule(context), listInvoicesToolModule(context), sendInvoiceToolModule(context), cancelInvoiceToolModule(context), createPaymentLinkToolModule(context), updatePaymentLinkToolModule(context), getPaymentLinkToolModule(context), listPaymentLinkToolModule(context) ]; }
- Toolkit-specific helper code that applies additional PII masking to customer names and emails in list_invoices results before returning.if (tool.method === 'list_invoices' && parsedResult.invoices && Array.isArray(parsedResult.invoices)) { console.error('Applying masking to invoices in toolkit...'); // Apply masking to each invoice's customer information parsedResult.invoices.forEach((invoice: any) => { if (invoice.customerInformation && invoice.customerInformation.name) { const originalName = invoice.customerInformation.name; invoice.customerInformation.name = maskPII(originalName, 'end'); console.error(`Masked name: "${originalName}" -> "${invoice.customerInformation.name}"`); } if (invoice.customerInformation && invoice.customerInformation.email) { const originalEmail = invoice.customerInformation.email; const emailParts = originalEmail.split('@'); if (emailParts.length === 2) { const maskedLocalPart = maskPII(emailParts[0], 'end'); invoice.customerInformation.email = `${maskedLocalPart}@${emailParts[1]}`; } else { invoice.customerInformation.email = maskPII(originalEmail, 'end'); } console.error(`Masked email: "${originalEmail}" -> "${invoice.customerInformation.email}"`); } }); }