All notable changes to xendit-mcp are documented here. This project follows Semantic Versioning. Pre-1.0 minor bumps may include breaking changes; they are called out under BREAKING below.
This release shifts xendit-mcp from "everything on by default" to read-only by default, gates money movement behind explicit configuration, and adds setup helpers so non-technical users can adopt the right mode without reading source code.
If you upgrade from 0.1.x, the following tools and prompts stop working until you opt back in via environment variables. See the "Upgrading from 0.1.x" section in the README for the exact migration.
create_invoice,expire_invoice, and thecreate_payment_linkprompt are now disabled unlessXENDIT_ENABLE_INVOICE_MUTATIONS=true.- All disbursement tools (
prepare_disbursement,confirm_disbursement,cancel_disbursement,get_disbursement,list_disbursement_banks) are disabled unlessXENDIT_ENABLE_DISBURSEMENTS=true. - The legacy one-shot
create_disbursementtool is no longer registered at all unless bothXENDIT_ENABLE_DISBURSEMENTS=trueandXENDIT_ENABLE_LEGACY_ONE_SHOT_DISBURSEMENT=trueare set. - When disbursements are enabled, the server now refuses to start unless all four safety gates are configured:
XENDIT_MAX_DISBURSEMENT_AMOUNT,XENDIT_MAX_DAILY_AMOUNT,XENDIT_ALLOWED_ACCOUNTS,XENDIT_APPROVAL_CODE. - Live/production keys (
xnd_production_,iluma_production_,sk_live_) are refused at startup unlessXENDIT_ALLOW_LIVE=true.
- Two-step guarded payout flow.
prepare_disbursementstages a money-out call and returns a short-lived confirmation token.confirm_disbursementexecutes it, requires a separateapprovalCodeargument, and uses theexternalIdas theIdempotency-Keyso safe retries do not duplicate transfers.cancel_disbursementlets a staged token be abandoned before confirmation. - Account number masking. Destination account numbers are masked in model-visible output so prompt history does not leak full account digits.
- Setup helpers.
get_workspace_modeMCP tool — reports the active mode, what is enabled, and the next safe step.guided_setupMCP tool — uses MCP elicitation in Claude Code when available to generate a config snippet.xendit://setupresource — current mode plus plain-English mode explanations.npx xendit-mcp doctor— prints the active mode, enabled capabilities, and what is still blocked.npx xendit-mcp setup— generates a Claude Desktop or Claude Code config snippet.
- Configurable token TTL.
XENDIT_PREPARE_TTL_SECONDScontrols how long a prepared disbursement token is valid (default300, max86400). - Documented payout lifecycle. README now describes the
ACCEPTED → REQUESTED → SUCCEEDED/FAILEDlifecycle and warns thatconfirm_disbursement's initial response is not proof of delivery.
- Read-only is the new default for every fresh install.
- Disbursement tools use the modern Xendit Payouts API (
/v2/payouts*) andpayouts_channelsendpoint instead of the legacy/disbursementsendpoints. - Expanded test suite (over 50 mock-backed checks) covering read-only defaults, invoice mutation gating, payout gating, prepare/confirm/cancel, approval-code rejection, 5xx retry behavior, duplicate
externalIdblocking, fail-closed startup on missing safety gates, and CLI helpers. - README rewritten around the three user-facing modes (
read-only,invoices,guarded-payouts).
- All mock-backed integration tests pass locally.
- Real Xendit sandbox verification on May 25, 2026 with IDR and PHP development keys. Confirmed: invoice create / get / expire (IDR + PHP), invoice list (PHP), payout channel discovery (PHP), guarded payout
prepare → confirm → get(IDR + PHP), payout outcomeACCEPTED(IDRID_BCAtest account131313; PHP131313),FAILED / INVALID_DESTINATION(PHP121212),FAILED / REJECTED_BY_CHANNEL(PHP999999), delayedREQUESTED → FAILEDtransition (PHP123456). - The IDR sandbox key used for testing had
balance: 0, so negative IDR payouts surfaced asINSUFFICIENT_BALANCEand do not independently prove destination-specific failure reasons for IDR. PHP gave the cleanest proof of destination-specific failures. - Thailand, Vietnam, and Malaysia behavior is not yet sandbox-verified.
This release is safer than 0.1.x, but it is not "immune to prompt injection," "enterprise-grade," or "fully verified across all Xendit countries." If a sensitive tool is exposed to an untrusted model context, residual risk remains. Treat tool inputs derived from model output as untrusted, and review every money-moving call before approving.
- Initial money-movement safety gates and metadata standardization.
- Disbursement tools registered by default.
- Invoice mutation tools registered by default.