list_invoice_items
Retrieve all line items for a specific invoice. Use this read-only function to view invoice item details.
Instructions
List items in an invoice (READ-ONLY)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | Invoice ID |
Implementation Reference
- src/tools/invoices.ts:185-208 (handler)The async handler function that executes the 'list_invoice_items' tool logic. Calls client.listInvoiceItems(invoice_id), maps items to display text, and returns the result.
}, async ({ invoice_id }: { invoice_id: number }) => { try { const result = await client.listInvoiceItems(invoice_id); const items = result.invoice_items || []; return { content: [{ type: 'text', text: `Invoice #${invoice_id} has ${items.length} items:\n\n` + items.map((item: any) => `- ${item.description}: $${item.unit_price} x ${item.quantity} = $${item.total}` ).join('\n') }], data: result }; } catch (error) { return { content: [{ type: 'text', text: `Error fetching invoice items: ${error instanceof Error ? error.message : String(error)}` }] }; } }); - src/tools/invoices.ts:176-208 (registration)Registration of the 'list_invoice_items' tool via server.tool() with input schema requiring invoice_id (number). Defined inside registerInvoiceTools() function.
server.tool('list_invoice_items', { description: 'List items in an invoice (READ-ONLY)', inputSchema: { type: 'object', properties: { invoice_id: { type: 'number', description: 'Invoice ID' } }, required: ['invoice_id'] }, }, async ({ invoice_id }: { invoice_id: number }) => { try { const result = await client.listInvoiceItems(invoice_id); const items = result.invoice_items || []; return { content: [{ type: 'text', text: `Invoice #${invoice_id} has ${items.length} items:\n\n` + items.map((item: any) => `- ${item.description}: $${item.unit_price} x ${item.quantity} = $${item.total}` ).join('\n') }], data: result }; } catch (error) { return { content: [{ type: 'text', text: `Error fetching invoice items: ${error instanceof Error ? error.message : String(error)}` }] }; } }); - src/tools/invoices.ts:178-184 (schema)Input schema for the tool: object type with required invoice_id number property.
inputSchema: { type: 'object', properties: { invoice_id: { type: 'number', description: 'Invoice ID' } }, required: ['invoice_id'] }, - src/cliniko-client.ts:246-248 (helper)Client method listInvoiceItems that makes the actual HTTP GET request to /invoices/{invoiceId}/invoice_items.
async listInvoiceItems(invoiceId: number): Promise<ClinikoListResponse<InvoiceItem>> { return this.request<ClinikoListResponse<InvoiceItem>>(`/invoices/${invoiceId}/invoice_items`); } - src/types.ts:184-210 (schema)TypeScript InvoiceItem interface defining the shape of invoice item objects returned by the API.
export interface InvoiceItem { id: number; invoice_id: number; description: string; unit_price: number; quantity: number; discount_percentage: number; discount_amount: number; tax_amount: number; net_amount: number; total_amount: number; product?: { id: number; name: string; }; tax?: { id: number; name: string; rate: number; }; created_at: string; updated_at: string; links?: { self: string; invoice: string; }; }