# Wave MCP connector

The Wave connector lets Claude, ChatGPT, Cursor, or any MCP client create and update customers, estimates, and chart of accounts entries in Wave, with every action running under the signed-in person's own Wave access and recorded in an audit log.

Source: https://elaichi.ai/connectors/wave/

## Facts

| | |
| --- | --- |
| Application | Wave |
| Category | Accounting |
| AI tools | 51 |
| Authentication | Connects over OAuth |
| Needs your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. 51 tools is past the 30-tool threshold, so clients use `search_tools` and `execute_tool` |

## What you can ask once Wave is connected

- List unpaid invoices for our top ten Wave customers.
- Which Wave accounts changed balance this month?
- Draft a new customer in Wave for Northside Dental.

## Connect Wave in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Wave.
2. Optionally set Share with, then press Connect.
3. Approve it in Wave. Wave's own window opens. Whoever approves it decides what this connection can reach.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Wave tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Connect Wave to Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Connect Wave to ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Connect Wave to Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Wave to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Wave tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Wave through Elaichi

### Turn a yes into an invoice

Sales. When a customer accepts a quote, have the Wave estimate marked accepted and converted to an invoice in one ask, without opening Wave.

### Clone last quarter's estimate for a repeat order

Sales. Duplicate an existing Wave estimate, change the quantities or dates, and generate the PDF ready to send.

### Keep the chart of accounts tidy

Finance. Add a new account under the right type and subtype, rename one that has drifted, or remove one nobody posts to, all in Wave.

### Send the deposit receipt right away

Finance. Once a deposit arrives against an estimate, have Wave send the deposit payment receipt to the customer so nobody has to chase it.

### Set up a new customer from an email

Office. Paste in a signature block and have the customer created in Wave, then correct the billing address or contact when it changes.

### Confirm which business and currency you are billing in

Leadership. Ask which Wave businesses you can see and which currencies and countries they use before an estimate goes out in the wrong one.

## Frequently asked questions

### How do I connect Wave to Claude?

Connecting Wave to Claude takes two steps. First, connect Wave in Elaichi: you are sent to Wave's own sign-in window, you log in and approve, and there is no OAuth application to register and no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Claude will ask you to sign in to Elaichi, and Wave is then available in your conversation.

### Does Wave work with ChatGPT and Cursor as well as Claude?

Yes. Once Wave is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client, and the Elaichi Agent. You connect Wave once and every client you use picks it up, with the same permissions and the same audit log.

### What can an AI agent actually do with my Wave data?

With Wave connected, an agent can create, update, and remove customers, build and edit estimates, mark an estimate accepted, convert it to an invoice, clone it, generate its PDF, and send a deposit payment receipt. It can also add or change accounts in your Wave chart of accounts and look up which businesses, currencies, and countries your account uses. Wave has many actions available, so short, specific asks such as "convert estimate 1042 to an invoice" work better than long paragraphs.

### Does connecting Wave give the AI access to every business in my account?

No. An agent working through Wave sees exactly the businesses, customers, and estimates that the person who signed in can see, and nothing more, because every call runs inside that person's own Wave access. Elaichi can narrow that further, for example by taking away the ability to delete customers, but it can never grant anything Wave itself would not allow that person.

### Can my team share one Wave connection?

Yes. One person connects Wave in Elaichi and shares it with a team, and nobody else ever handles a Wave credential or sees a token. Each teammate still signs in to Elaichi as themselves, so every estimate created or customer changed in Wave is logged against the individual who did it, not against the person who set up the connection.

### Can I stop an agent from deleting or changing things in Wave?

Yes. Restrictions in Elaichi work per action, so you can allow an agent to create and update Wave customers and estimates while blocking deletion of customers, estimates, or accounts entirely. A blocked action is never shown to Claude, ChatGPT, or any other client at all, so no prompt, however worded, can reach it.

### What happens to a Wave connection when someone leaves?

When you offboard someone in Elaichi, their access to Wave through every client ends immediately, whether they were using Claude, ChatGPT, Cursor, or the Elaichi Agent. If they had shared a Wave connection with a team, it keeps working for everyone else on that team. If you ever want Wave gone completely, disconnecting it once in Elaichi removes it from every client at the same time.

## All 51 Wave tools

Every tool below is callable through https://api.elaichi.ai/mcp once Wave is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Wave users me** (Action). Get the currently authenticated Wave user. Returns: id, defaultEmail, firstName, lastName, createdAt, modifiedAt.
- **Create a Wave account** (Create). Create a Wave account via the accountCreate mutation. Required input: businessId, name, subtype. Returns the created account with id, name, currency, type, and subtype. inputErrors[] surfaces field-level validation failures.
- **Delete a Wave account by ID** (Delete). Delete (archive) a Wave account via the accountArchive mutation. Required: input.id (account ID). Returns didSucceed and any inputErrors for validation failures.
- **Update a Wave account by ID** (Update). Update (patch) a Wave account via the accountPatch mutation. Required input fields: id, sequence. Optional: name, description, displayId. Returns the patched account and any inputErrors for validation failures.
- **Create a Wave customer** (Create). Create a Wave customer via the customerCreate mutation. Required: input (object with businessId, name). Returns the created customer. inputErrors[] surfaces field-level validation failures.
- **Delete a Wave customer by ID** (Delete). Delete a Wave customer via the customerDelete mutation. Required: input.id (customer ID). Returns didSucceed and inputErrors[] for validation failures.
- **Update a Wave customer by ID** (Update). Update (patch) a Wave customer via the customerPatch mutation. Input requires customer id and any fields to update. Returns the patched customer and inputErrors[] for field-level validation failures.
- **List all Wave account subtypes** (List). List account subtypes in Wave's Chart of Accounts. Returns: name, value, type (with normalBalanceType), archivable, systemCreated, description.
- **List all Wave account types** (List). List Wave account types (e.g. Asset, Equity, Expense, Income, Liability). Returns: name, normalBalanceType, value. No pagination; returns all types in a single response.
- **List all Wave businesses** (List). List businesses on Wave. Returns: id, name, isPersonal, currency, timezone, phone, website, isArchived. Offset-paginated via page/pageSize.
- **Get single Wave business by ID** (Get). Get a Wave business by ID. If no ID is provided and the token is scoped to one business, returns that business; otherwise returns the user's default business. Returns: id, name, currency, address, phone, timezone.
- **List all Wave countries** (List). List all countries in Wave. Returns: code (ISO 3166-1 alpha-2), name, nameWithArticle, and default currency details. No pagination — returns the full list.
- **Get single Wave country by ID** (Get). Get a country by its ISO 3166-1 alpha-2 code from Wave. Returns: code, name, nameWithArticle, default currency, and provinces.
- **List all Wave currencies** (List). List all ISO 4217 currencies available in Wave. Returns: code, symbol, name, plural, exponent. No pagination; returns the full set.
- **Get single Wave currency by ID** (Get). Get a Wave currency by ISO 4217 code. Required: code (CurrencyCode). Returns: code, symbol, name, plural, exponent.
- **Create a Wave estimate** (Create). Create a Wave estimate via the estimateCreate mutation. Required input: businessId, customerId. Returns the created estimate with id, status, estimateNumber, and validation errors on failure.
- **Delete a Wave estimate by ID** (Delete). Delete a Wave estimate via the estimateDelete mutation. Required: input.estimateId. Returns didSucceed and inputErrors for validation failures.
- **Update a Wave estimate by ID** (Update). Update a Wave estimate via the estimatePatch mutation. Required: input (object with id, customerId, status, title, estimateDate, currency, exchangeRate, dueDate). Returns the updated estimate and inputErrors for validation failures.
- **Wave estimates convert to invoice** (Convert). Convert a Wave estimate into an invoice via convertEstimateToInvoice. Required: input.estimateId. Returns: invoiceId, didSucceed. inputErrors[] surfaces field-level validation failures.
- **Wave estimates approve** (Approve). Approve a Wave estimate via the estimateApprove mutation. Required input: estimateId. Returns the approved estimate and any validation errors.
- **Wave estimates clone** (Action). Clone a Wave estimate via the estimateClone mutation. Required input: estimateId. Returns the cloned estimate with key fields. inputErrors[] surfaces field-level validation failures.
- **Wave estimates send deposit payment receipt** (Send). Send a receipt for an estimate deposit payment in Wave via estimateDepositPaymentReceiptSend. Required: input (estimateId, estimatePaymentId, to). Returns didSucceed and inputErrors for validation failures.
- **Wave estimates generate PDF** (Generate). Generate a PDF for a Wave estimate via estimateGeneratePdf mutation. Required: input.estimateId. Returns: pdfUrl, didSucceed, and inputErrors for validation failures.
- **Wave estimates mark accepted** (Action). Mark a Wave estimate as accepted via the estimateMarkAccepted mutation. Required input: estimateId. Returns the updated estimate and any validation errors.
- **Wave estimates mark sent** (Action). Mark a Wave estimate as sent via the estimateMarkSent mutation. Required input: estimateId, sendMethod. Returns the updated estimate and inputErrors[] for validation failures.
- **Wave estimates reset acceptance** (Action). Reset the acceptance status of a Wave estimate via estimateResetAcceptance. Required input: estimateId. Returns the reset estimate and any validation errors.
- **Wave estimates send** (Send). Send a Wave estimate via the estimateSend mutation. Required input: estimateId, to (email addresses). Returns the sent estimate and any inputErrors for validation failures.
- **Wave estimates send acceptance customer email** (Send). Send acceptance notification email to customer for a Wave estimate via estimateSendAcceptanceCustomerEmail mutation. Required: input with estimateId. Returns didSucceed, estimate details, and inputErrors for validation failures.
- **Delete a Wave estimate payment by ID** (Delete). Delete a Wave estimate manual payment via estimatePaymentDelete. Required: input.id (estimate payment ID). Returns didSucceed and inputErrors for validation failures.
- **Delete a Wave invoice payment by ID** (Delete). Delete a manual invoice payment in Wave via invoicePaymentDelete. Required: input.id (invoice payment ID). Returns didSucceed and inputErrors for validation failures.
- **Update a Wave invoice payment by ID** (Update). Update a Wave invoice payment via invoicePaymentPatch. Required: input (object with id and optional fields like amount, paymentDate, paymentMethod, memo, exchangeRate, paymentAccountId). Returns the updated invoice payment and any inputErrors.
- **Create a Wave invoice payment** (Create). Record a manual payment against a Wave invoice via invoicePaymentCreateManual. Required: input (invoiceId, paymentAccountId, amount, paymentDate, paymentMethod, exchangeRate). Returns the created invoicePayment and any inputErrors.
- **Create a Wave invoice** (Create). Create a Wave invoice via the invoiceCreate mutation. Required input: businessId, customerId. Returns the created invoice with key fields. inputErrors[] surfaces field-level validation failures.
- **Update a Wave invoice by ID** (Update). Update (patch) a Wave invoice via the invoicePatch mutation. Required: input.id. Only provided fields are updated. Returns the patched invoice and inputErrors[] for field-level validation failures.
- **Delete a Wave invoice by ID** (Delete). Delete a Wave invoice via the invoiceDelete mutation. Required: input.invoiceId. Returns didSucceed and inputErrors[] for validation failures.
- **Wave invoices approve** (Approve). Approve a Wave invoice via the invoiceApprove mutation. Required: input.invoiceId. Returns the approved invoice and any validation errors.
- **Wave invoices clone** (Action). Clone a Wave invoice via the invoiceClone mutation. Required: input.invoiceId. Returns the cloned invoice with key fields. inputErrors[] surfaces validation failures.
- **Wave invoices mark sent** (Action). Mark a Wave invoice as sent via the invoiceMarkSent mutation. Required input: invoiceId, sendMethod. Optional: sentAt. Returns the updated invoice and any inputErrors for validation failures.
- **Wave invoices send payment receipt** (Send). Send an invoice payment receipt email in Wave via invoicePaymentReceiptSend. Required input: invoiceId, invoicePaymentId, to (email addresses). Returns didSucceed and inputErrors for validation.
- **Wave invoices send** (Send). Send a Wave invoice via the invoiceSend mutation. Requires Business.emailSendEnabled to be true. Input: invoiceId, to (email addresses), subject, message, attachPDF, fromAddress, ccMyself. Returns the sent invoice and any input errors.
- **Create a Wave money deposit transaction** (Create). Create a money deposit transaction in Wave via moneyDepositTransactionCreate. Required input: businessId, date, description, deposit, lineItems, origin. Returns didSucceed and inputErrors for validation.
- **Create a Wave money transaction** (Create). Create a Wave money transaction via moneyTransactionCreate mutation (BETA). Requires isClassicAccounting to be false. Input includes businessId, externalId, date, description, anchor, and lineItems. inputErrors[] surfaces field-level validation failures.
- **Wave money transactions bulk create** (Create). Bulk create money transactions in Wave via moneyTransactionsCreate mutation. BETA: requires isClassicAccounting to be false. Input: businessId, transactions array. Returns created transaction ids and inputErrors for validation failures.
- **Get single Wave o auth application by ID** (Get). Get the current OAuth application in Wave. Returns: id, name, description, clientId, extraData, createdAt, modifiedAt.
- **Create a Wave product** (Create). Create a product in Wave via the productCreate mutation. Required input: businessId, name, unitPrice. Returns the created product and any inputErrors for validation failures.
- **Update a Wave product by ID** (Update). Update a Wave product via the productPatch mutation. Input requires product id; optional fields: name, description, unitPrice, defaultSalesTaxIds, incomeAccountId, expenseAccountId. Returns updated product and inputErrors for validation failures.
- **Delete a Wave product by ID** (Delete). Delete (archive) a Wave product via the productArchive mutation. Requires input with the product ID. Returns the archived product and any validation errors.
- **Get single Wave province by ID** (Get). Get a Wave province (state/county/region) by its ISO 3166-2 code. Returns: code, name.
- **Create a Wave sales tax** (Create). Create a sales tax in Wave via the salesTaxCreate mutation. Required input: businessId, name, abbreviation, rate. Returns the created sales tax. inputErrors[] surfaces field-level validation failures.
- **Update a Wave sales tax by ID** (Update). Update a Wave sales tax via the salesTaxPatch mutation. Required: input (object with id and optional name, abbreviation, description, taxNumber, rates). Returns the updated sales tax and any inputErrors for validation failures.
- **Delete a Wave sales tax by ID** (Delete). Delete (archive) a Wave sales tax via the salesTaxArchive mutation. Required: input with sales tax ID. Returns the archived sales tax and validation errors if any.
