create-quote
Generate and customize quotes in Xero by specifying contact details, line items, and invoice terms using the Xero MCP Server.
Instructions
Create a quote in Xero.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | ||
| lineItems | Yes | ||
| quoteNumber | No | ||
| reference | No | ||
| summary | No | ||
| terms | No | ||
| title | No |
Implementation Reference
- The tool handler function that calls createXeroQuote, handles the result, generates a deep link to the quote, and returns formatted content blocks.async ({ contactId, lineItems, reference, quoteNumber, terms, title, summary, }) => { const result = await createXeroQuote( contactId, lineItems, reference, quoteNumber, terms, title, summary, ); if (result.isError) { return { content: [ { type: "text" as const, text: `Error creating quote: ${result.error}`, }, ], }; } const quote = result.result; const deepLink = quote.quoteID ? await getDeepLink(DeepLinkType.QUOTE, quote.quoteID) : null; return { content: [ { type: "text" as const, text: [ "Quote created successfully:", `ID: ${quote?.quoteID}`, `Contact: ${quote?.contact?.name}`, `Total: ${quote?.total}`, `Status: ${quote?.status}`, deepLink ? `Link to view: ${deepLink}` : null, ] .filter(Boolean) .join("\n"), }, ], }; },
- Zod schema for input validation: lineItemSchema and parameters for create-quote tool.const lineItemSchema = z.object({ description: z.string(), quantity: z.number(), unitAmount: z.number(), accountCode: z.string(), taxType: z.string(), }); const CreateQuoteTool = CreateXeroTool( "create-quote", "Create a quote in Xero.\ When a quote is created, a deep link to the quote in Xero is returned. \ This deep link can be used to view the quote in Xero directly. \ This link should be displayed to the user.", { contactId: z.string(), lineItems: z.array(lineItemSchema), reference: z.string().optional(), quoteNumber: z.string().optional(), terms: z.string().optional(), title: z.string().optional(), summary: z.string().optional(), },
- Core helper function that performs the actual Xero API call to create a quote, handles errors, and returns structured response.export async function createXeroQuote( contactId: string, lineItems: QuoteLineItem[], reference?: string, quoteNumber?: string, terms?: string, title?: string, summary?: string, ): Promise<XeroClientResponse<Quote>> { try { const createdQuote = await createQuote( quoteNumber, reference, terms, contactId, lineItems, title, summary, ); if (!createdQuote) { throw new Error("Quote creation failed."); } return { result: createdQuote, isError: false, error: null, }; } catch (error) { return { result: null, isError: true, error: formatError(error), }; } }
- src/tools/tool-factory.ts:17-19 (registration)Batch registration of all CreateTools (including create-quote) with the MCP server using server.tool().CreateTools.map((tool) => tool()).forEach((tool) => server.tool(tool.name, tool.description, tool.schema, tool.handler), );
- src/tools/create/index.ts:13-24 (registration)CreateQuoteTool is collected into the CreateTools array for subsequent registration in tool-factory.export const CreateTools = [ CreateContactTool, CreateCreditNoteTool, CreateManualJournalTool, CreateInvoiceTool, CreateQuoteTool, CreatePaymentTool, CreateItemTool, CreateBankTransactionTool, CreatePayrollTimesheetTool, CreateTrackingCategoryTool, CreateTrackingOptionsTool