MCP server for Singapore electronic invoicing (InvoiceNow)
mcp-invoicenow-sg is an MCP (Model Context Protocol) server
for Singapore electronic invoicing over InvoiceNow, the national e-invoicing platform
operated by IMDA. It builds and validates PINT-SG v1.4.1 and SG Peppol BIS Billing 3.0 sent
invoices (originally-issued invoices, not the received/purchase side). It is part of the
mcp-einvoicing-* family of country-specific servers, all built on
mcp-einvoicing-core, which provides the
shared validation engine, EN 16931 abstractions, and Peppol network utilities.
urn:peppol:pint:billing-1@sg-1) โ the recommended profile for new
senders.mcp_einvoicing_core.en16931.EN16931Invoice.non_peppol_doc_validation) โ a first-party
government artifact, e.g. it flags a missing buyer/seller UEN. As of v0.2.0, PINT-SG's own
jurisdiction Schematron rules (e.g. the invoice_uuid requirement) are not checked โ see
"Not yet supported" below.Not yet supported (see specs/README.md for full detail):
SGInvoice's IRAS
GST category codes have no sourced crosswalk to the UNCL5305 code list that validator requires.
See EN16931_BASE_UNAVAILABLE_WARNING in every validate_invoice_sg result
(tracked as [CORE-EN16931-BASE-SG-CROSSWALK-1]) for what would unblock it.Order, OrderResponse, etc.) and IMDA's SG-specific
Order Balance.validate_invoice_sg tool: the OASIS UBL 2.1 schema files needed carry no
locally-confirmed redistribution grant.LocalTaxInvoice, TX2_Annex Annex B Type 1B).mcp-einvoicing-core (installed
automatically as a dependency)xslt2 extra (pip install mcp-invoicenow-sg[xslt2]) โ required for
validate_invoice_sg to run. The bundled IRAS C5 stylesheet requires XSLT 2.0.uvx (recommended)uvx mcp-invoicenow-sg
uvuv add mcp-invoicenow-sg
git clone https://github.com/cmendezs/mcp-invoicenow-sg.git
cd mcp-invoicenow-sg
uv sync --all-extras
| Variable | Required | Default | Description |
|---|---|---|---|
LOG_LEVEL | No | INFO | Logging level: DEBUG, INFO, WARNING, or ERROR |
EINVOICING_PEPPOL_CODELIST_DIR | No | โ | Local directory containing your own copy of the OpenPeppol eDEC Code Lists, required by the list_*/check_* Peppol codelist tools (not bundled with this package; see mcp-einvoicing-core README). Participant lookup, AS4 send, and directory search work without it. |
This server needs no credentials to run.
To use this server with Claude, add this configuration to your claude_desktop_config.json file:
{
"mcpServers": {
"invoicenow-sg": {
"command": "uvx",
"args": ["mcp-invoicenow-sg"]
}
}
}
Cursor supports MCP servers via stdio. Add the configuration in:
~/.cursor/mcp.json.cursor/mcp.json{
"mcpServers": {
"invoicenow-sg": {
"command": "uvx",
"args": ["mcp-invoicenow-sg"]
}
}
}
Reload the Cursor window (Ctrl+Shift+P then Reload Window) to apply the changes.
Kiro supports MCP servers via its dedicated configuration file. Two levels are available:
~/.kiro/settings/mcp.json.kiro/settings/mcp.json{
"mcpServers": {
"invoicenow-sg": {
"command": "uvx",
"args": ["mcp-invoicenow-sg"],
"disabled": false,
"autoApprove": []
}
}
}
The file is automatically reloaded on save. You can also open the config via the command palette (Cmd+Shift+P / Ctrl+Shift+P) then MCP.
| Tool | Description |
|---|---|
generate_invoice_sg | Build an SGInvoice from structured data and serialize it to UBL 2.1 XML. |
validate_invoice_sg | Validate a UBL 2.1 invoice against IRAS's C5 acceptance layer (CEN EN16931 base, PINT-SG jurisdiction Schematron, SG BIS 3.0, and UBL 2.1 XSD structural validation are not checked โ see "Not yet supported" above). |
get_gst_category_codes_sg | Return the IRAS GST category codes (Annex E) accepted on Singapore invoices. |
get_profile_urn_sg | Return the CustomizationID (BT-24) and ProfileID (BT-23) for a given profile (PINT_SG or BIS3). |
Recommended workflow: get_profile_urn_sg to pick the profile pair, then
generate_invoice_sg with that pair in the invoice data, then validate_invoice_sg on the
result.
Generic Peppol network tools (participant lookup, AS4 send, directory search, eDEC codelists)
are also registered, from mcp_einvoicing_core.peppol.tools, with bare Singapore UENs
normalized to scheme 0195 participant IDs:
| Tool | Description |
|---|---|
peppol_lookup_participant | Check whether a business is registered on the Peppol network; returns registration status and supported document types |
peppol_get_service_endpoint | Fetch the AS4 endpoint for a participant's document type |
resolve_peppol_dns | DNS-only (SML) diagnostic, independent of SMP reachability |
peppol_send | Transmit a UBL/CII invoice via AS4 |
peppol_directory_search | Search the public Peppol Directory by participant, name, country, or document type |
list_participant_id_schemes, list_document_type_ids, list_process_ids, list_spis_use_case_ids | OpenPeppol eDEC codelist lookups (require EINVOICING_PEPPOL_CODELIST_DIR) |
check_document_type_id_in_codelist, check_process_id_in_codelist, check_participant_id_scheme_in_codelist, get_peppol_codelist_version | OpenPeppol eDEC codelist checks and version reporting |
peppol_send is generic Peppol AS4 transport to the recipient's Access Point โ it is not the
same as submission to IRAS's own C5 corner, which stays unsupported (see "Not yet supported"
above).
The tool reference in docs/TOOLS.md is generated from the running server:
uv run python scripts/gen_tool_reference.py
This server implements the standard itself: it builds, validates, and signs the document locally. It is not a client for a commercial invoicing platform, and your signing keys and credentials never leave your own infrastructure.
A Peppol access point is required for InvoiceNow, but any accredited access point speaks the same AS4 profile, so switching providers is a configuration change, not a code change.
See CONTRIBUTING.md for development setup, the test and lint commands, and the pull request checklist. Security issues follow the private disclosure process in SECURITY.md.
| Country | Server |
|---|---|
| ๐ Global | mcp-einvoicing-core |
| ๐ง๐ช Belgium | mcp-einvoicing-be |
| ๐ง๐ท Brazil | mcp-nfe-br |
| ๐ซ๐ท France | mcp-facture-electronique-fr |
| ๐ฉ๐ช Germany | mcp-einvoicing-de |
| ๐ฎ๐ณ India | mcp-einvoicing-in |
| ๐ฎ๐น Italy | mcp-fattura-elettronica-it |
| ๐ฒ๐ฝ Mexico | mcp-cfdi-mx |
| ๐ต๐ฑ Poland | mcp-ksef-pl |
| ๐ธ๐ฌ Singapore | mcp-invoicenow-sg |
| ๐ช๐ธ Spain | mcp-facturacion-electronica-es |
| ๐ฆ๐ช United Arab Emirates | mcp-einvoicing-ae |
This project is licensed under the Apache 2.0 license โ see LICENSE for details. For the full version history, see CHANGELOG.md.
Source-derived launch command. Check the maintainerโs required arguments and credentials before running:
uvx mcp-invoicenow-sgMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-cmendezs-mcp-invoicenow-sg": {
"command": "uvx",
"args": [
"mcp-invoicenow-sg"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the clientโs tool list, then try a read-only example from its documentation.
Claude Desktop setup referencemcp-invoicenow-sgpypiio.github.cmendezs/mcp-invoicenow-sg works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.