Wave MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Wave MCP Serverlist my recent invoices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Wave MCP Server
MCP server for Wave invoicing with built-in PDF generation. Pull invoice data from your Wave account and generate branded PDF invoices—all from Claude or any MCP-compatible AI.
Features
📋 List invoices from your Wave account
🔍 Get invoice details with customer info and line items
👥 List customers from Wave
📄 Generate PDF invoices with your branding
No Python required. Pure TypeScript with PDFKit.
Related MCP server: wave-mcp
Quick Start
git clone https://github.com/YOUR_USERNAME/wave-mcp-server.git
cd wave-mcp-server
npm install
npm run build
cp .env.example .env
# Edit .env with your credentialsGetting Wave API Credentials
Go to developer.waveapps.com
Create a new application
Generate a Full Access token
Copy your Business ID from the dashboard
Configuration
Edit .env with your credentials:
WAVE_API_KEY=your_full_access_token
WAVE_BUSINESS_ID=your_business_id
BUSINESS_NAME=Your Business Name
# See .env.example for all optionsAdding Your Logo
Place your logo at assets/logo.png. Recommended size: 200x200px or larger, square aspect ratio.
Claude Desktop Setup
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"wave": {
"command": "node",
"args": ["/path/to/wave-mcp-server/dist/index.js"]
}
}
}Or with inline environment variables:
{
"mcpServers": {
"wave": {
"command": "node",
"args": ["/path/to/wave-mcp-server/dist/index.js"],
"env": {
"WAVE_API_KEY": "your_key",
"WAVE_BUSINESS_ID": "your_id",
"BUSINESS_NAME": "Your Business Name",
"LOGO_PATH": "/path/to/assets/logo.png"
}
}
}
}Environment Variables
Variable | Required | Description |
| Yes | Your Wave full-access token |
| Yes | Your Wave business ID |
| No | Business name on invoices |
| No | Address line 1 |
| No | Address line 2 |
| No | Phone number |
| No | Path to logo PNG (default: |
| No | Output directory for PDFs (default: |
Available Tools
Tool | Description |
| List invoices with pagination |
| Get full invoice details |
| List all customers |
| Export invoice as JSON |
| Generate branded PDF from Wave invoice |
Usage Examples
Once configured, ask Claude:
"List my Wave invoices"
"Generate a PDF for invoice #1234"
"Show me the details for my latest invoice"
License
MIT
Available Tools
5 toolsexport_invoice_jsonC
Export Wave invoice to JSON format
| Name | Required | Description | Default |
|---|---|---|---|
| invoiceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. 'Export to JSON' implies a read-like operation but does not state side effects, output format details, authentication needs, or whether the tool returns the JSON directly or triggers a download. The description adds no behavioral context beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence with no redundancy or filler. It is front-loaded with the action and resource, making it easy to parse, though it is quite terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and annotations, the description should clarify return behavior, whether this is a read-only export, and how it differs from get_invoice. It does not. For a tool with a single constrained parameter, this is still a meaningful gap in operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only one parameter, invoiceId, with 0% schema description coverage. The description does not explain what invoiceId refers to, how to obtain it, or any expected format. Although the parameter name is fairly self-explanatory, the description adds no semantic value beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Export'), a resource ('Wave invoice'), and an output format ('JSON'). This clarifies the core function and distinguishes it from the sibling generate_invoice_pdf by format, though it does not explicitly differentiate it from get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives. The description does not mention any scenarios, exclusions, or sibling tools, so an agent must infer usage entirely from the tool name and one-line description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_invoice_pdfA
Fetch invoice from Wave and generate a branded PDF. Returns the path to the generated PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| invoiceId | Yes | Wave invoice ID | |
| outputPath | No | Custom output path for PDF (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses that the tool fetches from Wave, generates a branded PDF, and returns a path. However, it does not disclose file-system side effects (e.g., overwriting existing files), default output location, authentication requirements, or behavior when the invoice does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The core action is front-loaded and the return value is clearly stated, making the description easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool without output schema, the description covers purpose and return value. However, it lacks usage guidance and important behavioral disclosures such as file creation side effects and error conditions. Since there are no annotations, these gaps make it adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with descriptions ('Wave invoice ID' and 'Custom output path for PDF (optional)'), so the baseline is 3. The description adds minimal parameter information beyond implying invoiceId is used to fetch and that a path is returned; it does not elaborate on default outputPath behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb 'generate' with a specific resource 'branded PDF' and explicitly states it fetches an invoice from Wave. It returns the path to the PDF, which distinguishes it from sibling tools like list_invoices, get_invoice, list_customers, and export_invoice_json—it is the only tool producing a PDF file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage: when you have a Wave invoice and need a branded PDF. However, it does not explicitly state when to use it over the alternatives, such as export_invoice_json for JSON output or get_invoice for raw invoice data. No exclusions or alternative conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceA
Get full details of a specific invoice
| Name | Required | Description | Default |
|---|---|---|---|
| invoiceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Get full details' is a weak behavioral signal: it does not state what fields are returned, whether the call is read-only, what happens for an unknown invoice ID, or whether any special permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. 'Full details' and 'specific' earn their place, and the description is appropriately sized for a single-parameter retrieval tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-id tool, this is close to adequate, but with no output schema and no annotations, 'full details' remains undefined. The agent cannot know exactly what invoice data will be returned or how errors are surfaced, and it is not guided to list_invoices when the ID is unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter, invoiceId, with 0% schema description coverage. The description's 'a specific invoice' implies that invoiceId identifies which invoice to retrieve, but it does not explain the ID format, provide an example, or clarify where to obtain the ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Get' with the resource 'invoice' and adds 'specific', so it clearly targets a single invoice rather than a list. This distinguishes it from siblings like list_invoices, export_invoice_json, and generate_invoice_pdf without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when you need full details for one known invoice. However, the description never contrasts with list_invoices for enumeration or export_invoice_json/generate_invoice_pdf for output formats, and it provides no explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_customersA
List all customers from Wave
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It does convey that this is a read-only listing operation with no filtering ('all customers'), which is useful. However, it omits details such as pagination, result limits, ordering, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no wasted words. The key scope information ('all') is front-loaded immediately after the verb, making the description immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list operation, the description is sufficiently complete: it states what is listed and where it comes from. The absence of output schema and pagination notes is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there are no parameter semantics to document; the baseline of 4 applies. The word 'all' adds mild value by reinforcing that the operation takes no filtering parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List'), a clear resource ('customers'), an explicit scope ('all'), and the source system ('Wave'). It is easily distinguished from the sibling invoice-focused tools like list_invoices and get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when an agent needs the full set of customers from Wave. It does not explicitly state when not to use it or mention alternatives, but there are no customer-specific siblings that would create real ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesA
List invoices from Wave with pagination
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| pageSize | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly signals a read-only list operation with pagination support, which are the main behavioral traits. However, with no annotations present, it carries the full burden and does not disclose defaults, page size limits, sort order, or the shape of returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise phrase with no redundant words. It is front-loaded with the core action and resource, then the pagination qualifier. It could be slightly richer without becoming verbose, but as is it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool, the description provides the essential context (resource + pagination) and suffices for basic invocation. However, it lacks details about pagination semantics (e.g., zero-indexing, maximum pageSize) and the return format, and there is no output schema to fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage and the two parameters (page, pageSize) have no schema descriptions. The tool description only mentions 'pagination,' which loosely maps to the parameters but does not clarify their individual meaning, defaults, or constraints. This under-compensates for the complete lack of schema-level documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states the action ('List') and resource ('invoices') and adds scope ('from Wave') and a distinguishing feature ('with pagination'). This clearly differentiates it from get_invoice (single vs. list) and list_customers (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it should be used when paginated listing of invoices is needed, but it does not explicitly mention alternatives or exclusions. No guidance on when to use this tool versus get_invoice or export_invoice_json is provided within the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v1.0.0- First observed
export_invoice_json - First observed
generate_invoice_pdf - First observed
get_invoice - First observed
list_customers - First observed
list_invoices
TDQS
Each tool has a clearly distinct purpose: list_invoices vs get_invoice separates collection from detail, and export_invoice_json vs generate_invoice_pdf are explicitly different output formats. list_customers is entirely separate from the invoice workflow.
All tools follow a consistent lower_snake_case verb_noun pattern, with singular/plural usage matching intent (list_invoices vs get_invoice). The export/generate tools extend the pattern with an output format, which is still predictable.
Five tools is well-scoped for a focused Wave integration covering invoice retrieval, customer listing, and invoice export. Each tool earns its place without redundancy or bloat.
The invoice retrieval and export workflow is covered, but the surface has notable gaps such as no create/update/delete for invoices and no customer detail lookup. Agents can perform read-only and export tasks, but cannot complete full invoice management workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect your AI to your Well financial data - invoices, companies, contacts.
Create PDF invoices from your AI chat: clients, numbering, VAT, overdue reports. All data is local.
Send invoices from Claude and ChatGPT. One sentence becomes a PDF with a Stripe payment link.
Invoice and receipt extractor: reads PDF and image invoices/receipts with AI, pulling date…
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables the generation of professional PDF invoices and their distribution via email using customizable templates. It allows users to create, manage, and send invoices with standard business fields like tax rates and line items through natural language.3292MIT
- AlicenseNot gradedqualityDmaintenanceProvides 54 tools across 10 categories for Wave Accounting, enabling invoicing, customer management, products, transactions, bills, estimates, taxes, businesses, and financial reporting through Wave's GraphQL API.161ISC
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Italian FatturaPA electronic invoices and transmit them to the SdI via Invoicetronic. Supports creating and querying invoices with Italian VAT rates.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with FreshBooks accounting API for managing clients, invoices, payments, and more through natural language.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LightningBerk/wave-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server