npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@digitaldev-lx/mcp-invoice-express

v1.0.0

Published

MCP server for the InvoiceXpress API V2 — operate Portuguese invoicing from Claude Code and other MCP clients.

Downloads

165

Readme

mcp-invoice-express

npm version Tests License Node

MCP (Model Context Protocol) server for the InvoiceXpress API V2. Lets Claude Code — and any other MCP-aware client — operate the Portuguese invoicing platform directly: create invoices, finalise, email customers, generate PDFs, register payments, export SAF-T, and more.

Stop pasting numbers into the dashboard. Tell Claude "create an invoice for Acme Lda for €1230 + VAT, finalise it and email the customer", and it does the right calls.


Install in one line

claude mcp add invoice-express \
  --env INVOICE_EXPRESS_ACCOUNT_NAME=your-account-subdomain \
  --env INVOICE_EXPRESS_API_KEY=your-api-key \
  -- npx -y @digitaldev-lx/mcp-invoice-express

That's it. Restart Claude Code (or run /mcp to verify the connection) and the 25 tools below are available.

Replace your-account-subdomain with the prefix of your dashboard URL — if you log in at https://acme.app.invoicexpress.com/, the subdomain is acme. Generate the API key at https://www.app.invoicexpress.com/users/api.

Project-scoped install (.mcp.json, versionable)

If you'd rather commit the configuration to a repo:

{
  "mcpServers": {
    "invoice-express": {
      "command": "npx",
      "args": ["-y", "@digitaldev-lx/mcp-invoice-express"],
      "env": {
        "INVOICE_EXPRESS_ACCOUNT_NAME": "${INVOICE_EXPRESS_ACCOUNT_NAME}",
        "INVOICE_EXPRESS_API_KEY": "${INVOICE_EXPRESS_API_KEY}"
      }
    }
  }
}

Place the file at the project root, set the env vars in your shell, and the MCP loads automatically when Claude Code is launched from that directory.

Manual install / other MCP clients

The package ships an executable binary called mcp-invoice-express. Any MCP client that speaks stdio can use it:

INVOICE_EXPRESS_ACCOUNT_NAME=acme \
INVOICE_EXPRESS_API_KEY=xxx \
npx -y @digitaldev-lx/mcp-invoice-express

Configuration

| Env var | Required | Default | Description | |---|:---:|---|---| | INVOICE_EXPRESS_ACCOUNT_NAME | ✅ | — | Subdomain of your account | | INVOICE_EXPRESS_API_KEY | ✅ | — | API key from https://www.app.invoicexpress.com/users/api | | INVOICE_EXPRESS_TIMEOUT | | 15000 | HTTP timeout in milliseconds | | INVOICE_EXPRESS_RETRY_TIMES | | 3 | Retries on 429 / 5xx (set 0 to disable) | | INVOICE_EXPRESS_RETRY_BACKOFF_MS | | 1000 | Base backoff in ms (exponential thereafter) | | INVOICE_EXPRESS_LOG_LEVEL | | warn | silent / error / warn / info / debug (logs go to stderr) |

Multi-account

The server uses one account per instance. To work with multiple InvoiceXpress accounts in parallel, configure multiple MCP servers with different names:

claude mcp add ix-acme \
  --env INVOICE_EXPRESS_ACCOUNT_NAME=acme \
  --env INVOICE_EXPRESS_API_KEY=xxx \
  -- npx -y @digitaldev-lx/mcp-invoice-express

claude mcp add ix-otra \
  --env INVOICE_EXPRESS_ACCOUNT_NAME=otraempresa \
  --env INVOICE_EXPRESS_API_KEY=yyy \
  -- npx -y @digitaldev-lx/mcp-invoice-express

What you can ask Claude

"List the draft invoices issued this month and tell me the total."

"Create a fatura for Acme Lda — 4 hours of consulting at €100/h plus 23% IVA.
Finalise it and email it to [email protected]."

"Mark invoice 4523 as paid by bank transfer of €1230 on 2026-05-15."

"Generate the SAF-T XML for April 2026 and save it to ./saft.xml."

"Issue a credit note against invoice 5012 for €100 and email it."

"Has the invoice for client ACM-001 been paid yet?"

Tools

The server exposes 25 high-level tools plus a raw fallback for the rest of the API.

Documents (8)

| Tool | What it does | |---|---| | create_invoice | Create a draft invoice. document_type selects: Invoice, SimplifiedInvoice, InvoiceReceipt, CreditNote, DebitNote, Receipt, CashInvoice, VatMossInvoice. | | find_invoice | Fetch an invoice (or any other invoice-like document) by id. | | list_invoices | List with filters (status, dates, free-text). | | change_document_state | Move through the lifecycle: finalized, settled, canceled, deleted. | | email_document | Send the document to the customer. | | generate_document_pdf | Get a temporary 24h pdfUrl (use second_copy: true for the "2.ª via" watermark). | | register_payment | Record a payment (SAF-T codes: NU/CH/TB/CD/MB/MW/CC/PP/LC/CS/OU). | | list_related_documents | Documents linked to this one (refunds, receipts, etc). |

Estimates (2)

| Tool | What it does | |---|---| | create_estimate | Quote / Proforma / FeesNote / Estimate (estimate_type). | | list_estimates | List by type and status. |

Guides (2)

| Tool | What it does | |---|---| | create_guide | Transport / Shipping / Devolution / Global guide. | | list_guides | List by type and status. |

Purchase orders (2)

| Tool | What it does | |---|---| | create_purchase_order | Create a PO for a supplier. | | list_purchase_orders | List with filters. |

Clients (4)

| Tool | What it does | |---|---| | create_client | Add a new client. | | find_client | Lookup by id / name / code / vat (one identifier). | | list_clients | Paginated list with optional free-text search. | | update_client | Patch fields on an existing client. |

Items (3)

| Tool | What it does | |---|---| | create_item | Add a catalogue item (product/service). | | list_items | Paginated list. | | update_item | Patch fields on an existing item. |

Reference / config (3)

| Tool | What it does | |---|---| | list_taxes | All taxes configured in the account. | | list_sequences | All document numbering sequences. | | list_accounts | All banking/cash accounts. |

Treasury & SAF-T (3)

| Tool | What it does | |---|---| | list_treasury_movements | Cash flow movements (with date/account filters). | | create_treasury_movement | Register a cash-in or cash-out movement. | | generate_saft | SAF-T XML for the AT (year + month). |

Raw fallback (1)

| Tool | What it does | |---|---| | invoice_express_request | Send any request (method, path, query?, body?) to the V2 API for endpoints not covered by the high-level tools. |


Resources

Read-only context that Claude can attach automatically:

| URI | Content | |---|---| | invoice-express://invoices/recent | The 50 latest invoices (JSON). | | invoice-express://clients | The first 100 clients (JSON). | | invoice-express://account | Account name + sequences + taxes + banking accounts. |


Prompts (workflow templates)

| Prompt | Use case | |---|---| | create_invoice_workflow | End-to-end: locate/create the client → draft invoice → finalise → email → register payment. Accepts client_hint, items_hint, send_email. | | monthly_close_workflow | List drafts for a period, finalise with confirmation, summarise totals, generate SAF-T. Accepts year + month. |

In Claude Code:

/prompts                       # browse available prompts
/prompts create_invoice_workflow  # use one

Errors

| HTTP status | Mapped error | What it means | |---|---|---| | 401 | AuthenticationError | API key missing or wrong; double-check INVOICE_EXPRESS_API_KEY. | | 404 | NotFoundError | The document/client/etc does not exist. | | 400 | BadRequestError | Malformed request payload. | | 422 | ValidationError | Field-level errors (returned to Claude as fieldErrors: { name: [...], ... }). | | 429 | RateLimitError | Exceeded 780 req/min/account; the server retries automatically up to INVOICE_EXPRESS_RETRY_TIMES. | | 5xx | ServerError | InvoiceXpress upstream issue; the server retries automatically. |

Tool errors are returned to Claude with isError: true so it can decide whether to retry, ask the user, or surface the failure.


Verification

Once installed, run:

/mcp

You should see invoice-express listed as connected, with 28 tools (25 high-level + raw + 2 prompts). Then ask Claude:

"Use list_taxes to show me the IVA configurations of my account."

If the call succeeds, you're good to go.


Troubleshooting

"INVOICE_EXPRESS_ACCOUNT_NAME is required" — the env vars were not passed in. With claude mcp add, use --env KEY=VALUE. With .mcp.json, set the env vars in your shell or use literal values.

Authentication failed for InvoiceXpress — confirm the API key from the dashboard is current. Generating a new one immediately revokes the previous one.

"connection closed" / process exits immediately — run the binary by hand with the same env vars to see the actual error: INVOICE_EXPRESS_ACCOUNT_NAME=demo INVOICE_EXPRESS_API_KEY=xxx npx -y @digitaldev-lx/mcp-invoice-express. The first line on stderr is the failure message.

Tools list is empty in /mcp — try MCP_TIMEOUT=10000 claude to give the server more time to boot, then re-check /mcp.

Rate limit reached — InvoiceXpress allows 780 requests per minute per account. Heavy bulk operations may temporarily 429; the server retries with exponential backoff (1s → 2s → 4s by default). Increase INVOICE_EXPRESS_RETRY_TIMES if needed.


Companion Laravel package

If you operate InvoiceXpress from a Laravel application (without an MCP), check out digitaldev-lx/laravel-invoice-express. The two share the same architectural decisions (DTOs, error hierarchy, document type routing).


Development

git clone [email protected]:digitaldev-lx/mcp-invoice-express.git
cd mcp-invoice-express
npm install

npm test            # vitest
npm run typecheck   # tsc --noEmit
npm run lint        # eslint
npm run build       # output → dist/

# Run locally without npm install
INVOICE_EXPRESS_ACCOUNT_NAME=demo INVOICE_EXPRESS_API_KEY=xxx npm run dev

CI runs lint + typecheck + test on every PR against Node 20 and Node 22. Tags v* trigger an automatic npm publish.

See CONTRIBUTING.md for the workflow.


Security

If you find a security issue, please do not open a public issue. Email [email protected] and we'll respond within 48 hours.


License

MIT © DigitalDev. See LICENSE.