Skip to content

Latest commit

 

History

History
54 lines (38 loc) · 4.97 KB

File metadata and controls

54 lines (38 loc) · 4.97 KB

Changelog

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.

0.2.0 — Safer Defaults Release (2026-05-25)

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.

BREAKING

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 the create_payment_link prompt are now disabled unless XENDIT_ENABLE_INVOICE_MUTATIONS=true.
  • All disbursement tools (prepare_disbursement, confirm_disbursement, cancel_disbursement, get_disbursement, list_disbursement_banks) are disabled unless XENDIT_ENABLE_DISBURSEMENTS=true.
  • The legacy one-shot create_disbursement tool is no longer registered at all unless both XENDIT_ENABLE_DISBURSEMENTS=true and XENDIT_ENABLE_LEGACY_ONE_SHOT_DISBURSEMENT=true are 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 unless XENDIT_ALLOW_LIVE=true.

Added

  • Two-step guarded payout flow. prepare_disbursement stages a money-out call and returns a short-lived confirmation token. confirm_disbursement executes it, requires a separate approvalCode argument, and uses the externalId as the Idempotency-Key so safe retries do not duplicate transfers. cancel_disbursement lets 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_mode MCP tool — reports the active mode, what is enabled, and the next safe step.
    • guided_setup MCP tool — uses MCP elicitation in Claude Code when available to generate a config snippet.
    • xendit://setup resource — 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_SECONDS controls how long a prepared disbursement token is valid (default 300, max 86400).
  • Documented payout lifecycle. README now describes the ACCEPTED → REQUESTED → SUCCEEDED/FAILED lifecycle and warns that confirm_disbursement's initial response is not proof of delivery.

Changed

  • Read-only is the new default for every fresh install.
  • Disbursement tools use the modern Xendit Payouts API (/v2/payouts*) and payouts_channels endpoint instead of the legacy /disbursements endpoints.
  • 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 externalId blocking, fail-closed startup on missing safety gates, and CLI helpers.
  • README rewritten around the three user-facing modes (read-only, invoices, guarded-payouts).

Verified

  • 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 outcome ACCEPTED (IDR ID_BCA test account 131313; PHP 131313), FAILED / INVALID_DESTINATION (PHP 121212), FAILED / REJECTED_BY_CHANNEL (PHP 999999), delayed REQUESTED → FAILED transition (PHP 123456).
  • The IDR sandbox key used for testing had balance: 0, so negative IDR payouts surfaced as INSUFFICIENT_BALANCE and 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.

Not claimed

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.

0.1.3 (previous)

  • Initial money-movement safety gates and metadata standardization.
  • Disbursement tools registered by default.
  • Invoice mutation tools registered by default.