Create invoices, clients, and Stripe payment links from any agent. 7 tools. No email or deletes.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer token: `Bearer ifk_...` where ifk_... is an InvoiceFlow API key. Without it the server lists tools but every call explains what is missing.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a customer record. A client is required before an invoice can be created. Returns the new client id.
Customer or company name. Required.
Billing email. Required in practice - it is where the invoice goes if a human later sends it.
Optional internal note. Never shown to the customer.
Optional company name if it differs from name.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http invoiceflow https://invoiceflow-ten-azure.vercel.app/api/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer token: `Bearer ifk_...` where ifk_... is an InvoiceFlow API key. Without it the server lists tools but every call explains what is missing.Create a customer record. A client is required before an invoice can be created. Returns the new client id.
| Argument | Type | Description |
|---|---|---|
| name* | string | Customer or company name. Required. |
| email* | string | Billing email. Required in practice - it is where the invoice goes if a human later sends it. |
| notes | string | Optional internal note. Never shown to the customer. |
| company | string | Optional company name if it differs from name. |
{
"type": "object",
"required": [
"name",
"email"
],
"properties": {
"name": {
"type": "string",
"description": "Customer or company name. Required."
},
"email": {
"type": "string",
"description": "Billing email. Required in practice - it is where the invoice goes if a human later sends it."
},
"notes": {
"type": "string",
"description": "Optional internal note. Never shown to the customer."
},
"company": {
"type": "string",
"description": "Optional company name if it differs from name."
}
},
"additionalProperties": false
}Create a DRAFT invoice for an existing client. Amounts are INTEGER CENTS: unitPrice 25000 means $250.00, not $25,000. Do not send totals - the server derives subtotal and total from the line items. Does not email anyone.
| Argument | Type | Description |
|---|---|---|
| tax | integer | Optional total tax in INTEGER CENTS. Defaults to 0. |
| items* | array | One or more line items. At least one is required. |
| notes | string | Optional note printed on the invoice. |
| dueDate | string | Due date, ISO yyyy-mm-dd. If omitted, 14 days from today is used. |
| clientId* | string | id of an existing client, from list_clients or create_client. Required. |
| currency | string | 3-letter ISO code. Defaults to USD. |
{
"type": "object",
"required": [
"clientId",
"items"
],
"properties": {
"tax": {
"type": "integer",
"description": "Optional total tax in INTEGER CENTS. Defaults to 0."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"description",
"unitPrice"
],
"properties": {
"quantity": {
"type": "integer",
"description": "Whole units. Must be a positive integer. Defaults to 1."
},
"unitPrice": {
"type": "integer",
"description": "Price per unit in INTEGER CENTS. $250.00 is 25000."
},
"description": {
"type": "string",
"description": "What is being billed. Be specific - this appears on the customer's invoice."
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "One or more line items. At least one is required."
},
"notes": {
"type": "string",
"description": "Optional note printed on the invoice."
},
"dueDate": {
"type": "string",
"description": "Due date, ISO yyyy-mm-dd. If omitted, 14 days from today is used."
},
"clientId": {
"type": "string",
"description": "id of an existing client, from list_clients or create_client. Required."
},
"currency": {
"type": "string",
"description": "3-letter ISO code. Defaults to USD."
}
},
"additionalProperties": false
}Fetch one invoice by id, including line items and derived totals.
| Argument | Type | Description |
|---|---|---|
| id* | string | Invoice id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Invoice id."
}
},
"additionalProperties": false
}List existing clients. Use this before create_client to avoid making duplicate customer records.
| Argument | Type | Description |
|---|---|---|
| query | string | Optional search term matched against name or email. |
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Optional search term matched against name or email."
}
},
"additionalProperties": false
}List invoices with their status and totals. Invoices belonging to other accounts are not visible and return as absent, not as errors.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional maximum number of results. |
| status | string | Optional filter: DRAFT, SENT, PAID, OVERDUE, or CANCELLED. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Optional maximum number of results."
},
"status": {
"type": "string",
"description": "Optional filter: DRAFT, SENT, PAID, OVERDUE, or CANCELLED."
}
},
"additionalProperties": false
}Get the payable Stripe Checkout link for an invoice. This is what you give a human so they can actually pay. Does not email anyone.
| Argument | Type | Description |
|---|---|---|
| id* | string | Invoice id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Invoice id."
}
},
"additionalProperties": false
}Check which InvoiceFlow account this key belongs to and that the key works. Call this first; it is the cheapest way to fail early.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.