{"_id":"@apipay.vn/mcp","_rev":"5-bbb0a83c00711c72b288904e73c8a6bc","name":"@apipay.vn/mcp","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"@apipay.vn/mcp","version":"0.1.0","license":"MIT","_id":"@apipay.vn/mcp@0.1.0","maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"bin":{"apipay-mcp":"dist/index.js"},"dist":{"shasum":"533335bdddde0c7a3a0bf45d5542e08616025ff9","tarball":"https://registry.npmjs.org/@apipay.vn/mcp/-/mcp-0.1.0.tgz","fileCount":29,"integrity":"sha512-yOok8d2dej0ZYL/zb28tssDvzb1JM25wmm/2BfNKoanwM200FXbdHjCtiVQ3SJV+LL5fY18CUOj96MlPIILcpA==","signatures":[{"sig":"MEUCIFuE8UD9aPNCReBuNGNwxcQNalPDfMbadHBCGw6E+XeKAiEAjrQx7zLGCezioRI4QPeHGV2DsE0inKcFSBpT8ouiFWI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69510},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"585c86e7b883c0c0e718891db03672ec61b75fbc","scripts":{"dev":"tsx src/index.ts","test":"tsx --test 'src/*.test.ts' 'src/**/*.test.ts'","build":"tsc -b","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","start":"node dist/index.js","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"dolph.pham","email":"dolph.pham@gmail.com"},"_npmVersion":"11.18.0","description":"Model Context Protocol (MCP) server for ApiPay","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","@modelcontextprotocol/sdk":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1787539622253_0.5337681709023334","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@apipay.vn/mcp","version":"0.2.0","license":"MIT","_id":"@apipay.vn/mcp@0.2.0","maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"bin":{"apipay-mcp":"dist/index.js"},"dist":{"shasum":"db185548751527057377eb94f8758e48458c7a8b","tarball":"https://registry.npmjs.org/@apipay.vn/mcp/-/mcp-0.2.0.tgz","fileCount":29,"integrity":"sha512-GxDDyYldzYBlDgsEfe6reRHEViyp7+WdP1AvQJH4so7OYXSz25WHsqxNyxe6bBK+g3KXcZHUKV35+NJMau8psg==","signatures":[{"sig":"MEUCIGUtUHde53ftyjGW9AARc0yYyXY/xBHTfd/DT8eB6ssQAiEAnsNowL9ItyOTRFRHWB5q6yc6xXpVd64TgYCDTvThRig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73243},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"9ce676fc45d402c5b27a55ba548f226f781987f1","scripts":{"dev":"tsx src/index.ts","test":"tsx --test 'src/*.test.ts' 'src/**/*.test.ts'","build":"tsc -b","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","start":"node dist/index.js","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"dolph.pham","email":"dolph.pham@gmail.com"},"_npmVersion":"11.18.0","description":"Model Context Protocol (MCP) server for ApiPay","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","@modelcontextprotocol/sdk":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.2.0_1787555179319_0.17743282656185833","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@apipay.vn/mcp","version":"0.3.0","license":"MIT","_id":"@apipay.vn/mcp@0.3.0","maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"bin":{"apipay-mcp":"dist/index.js"},"dist":{"shasum":"a538908884507202424e21664518759ffdbe90b3","tarball":"https://registry.npmjs.org/@apipay.vn/mcp/-/mcp-0.3.0.tgz","fileCount":32,"integrity":"sha512-LWxToCeUmgcvC5EwJ7UITpb30xrElcBN0TwXJbLnnWCmuT7FIyVzbCDPMZLOe+gcTMCGl1aZyC0TCzWO9OTVig==","signatures":[{"sig":"MEQCIHoOHflQf6NdFUBwFKWAdjrA7rMBdnLdmoK66TJK9NZ9AiAhwX9Q093NQ7VitoVkBtToX1497oxyY6IxVmxUi7Smpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95741},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"dbf173e25157c3b5bf5de0e84bba807d78a1b947","scripts":{"dev":"tsx src/index.ts","test":"tsx --test 'src/*.test.ts' 'src/**/*.test.ts'","build":"tsc -b","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","start":"node dist/index.js","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"dolph.pham","email":"dolph.pham@gmail.com"},"_npmVersion":"11.18.0","description":"Model Context Protocol (MCP) server for ApiPay","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","@modelcontextprotocol/sdk":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1788579490799_0.6042934779192313","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@apipay.vn/mcp","version":"0.3.1","license":"MIT","_id":"@apipay.vn/mcp@0.3.1","maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"bin":{"apipay-mcp":"dist/index.js"},"dist":{"shasum":"7f1dcf1919ba798128c241cd3ed51176cc8cb9fd","tarball":"https://registry.npmjs.org/@apipay.vn/mcp/-/mcp-0.3.1.tgz","fileCount":32,"integrity":"sha512-nLmVgJaiZaLgMzVp9U31UoSj7qbpgL/ihrU7evbP6TiKKKUN0GxGS8Gv6XwVeOVfQkVe2Hiv2KO+ImNeter/zQ==","signatures":[{"sig":"MEUCIBFJOMWCU89SllJzkq1i+XIPLwfgya5/VOJh/pB907JeAiEArTkiHqHRGVVk6xxUddiv7hu0mm3px6+FMY/7/tJoRPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101163},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"645113f17fd5e4f63fbd4c15a308053bfa192136","scripts":{"dev":"tsx src/index.ts","test":"tsx --test 'src/*.test.ts' 'src/**/*.test.ts'","build":"tsc -b","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","start":"node dist/index.js","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"dolph.pham","email":"dolph.pham@gmail.com"},"_npmVersion":"11.18.0","description":"Model Context Protocol (MCP) server for ApiPay","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","@modelcontextprotocol/sdk":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.1_1788751017684_0.19898017154070935","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@apipay.vn/mcp","version":"0.3.2","description":"Model Context Protocol (MCP) server for ApiPay","license":"MIT","type":"module","bin":{"apipay-mcp":"dist/index.js"},"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public"},"scripts":{"clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","build":"tsc -b","dev":"tsx src/index.ts","start":"node dist/index.js","test":"tsx --test 'src/*.test.ts' 'src/**/*.test.ts'","prepublishOnly":"npm run clean && npm run build"},"dependencies":{"@modelcontextprotocol/sdk":"^1.18.0","zod":"^3.24.2"},"devDependencies":{"@types/node":"^22.13.5","tsx":"^4.19.3","typescript":"^5.7.3"},"gitHead":"e13dc4bcea6abf500f26e8308a408d06c2fa673e","_id":"@apipay.vn/mcp@0.3.2","_nodeVersion":"22.22.0","_npmVersion":"11.18.0","dist":{"integrity":"sha512-aVAF86mlwDzynzIVY6w7+xegVLexKO0+J2fgexfBymhNL3FHmIN2BbDxp4AXxjqb7MPzHS+p42XeEK7ck9Tbgg==","shasum":"2ad14d5239109e9700656ca3c85b165afba284d5","tarball":"https://registry.npmjs.org/@apipay.vn/mcp/-/mcp-0.3.2.tgz","fileCount":32,"unpackedSize":110319,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAICYBiT02EaGKcdEe4+oddFEwkOTT+s8NCuLros28BCAiEAoPbQOIwkAmD8te+uz3HG2QlbQWgd5KRKJ5EAGwqCbDE="}]},"_npmUser":{"name":"dolph.pham","email":"dolph.pham@gmail.com"},"directories":{},"maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.3.2_1788830962359_0.5607390422262528"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-24T02:47:02.057Z","modified":"2026-09-08T01:29:22.648Z","0.1.0":"2026-08-24T02:47:02.389Z","0.2.0":"2026-08-24T07:06:19.454Z","0.3.0":"2026-09-05T03:38:10.913Z","0.3.1":"2026-09-07T03:16:57.834Z","0.3.2":"2026-09-08T01:29:22.491Z"},"license":"MIT","description":"Model Context Protocol (MCP) server for ApiPay","maintainers":[{"name":"dolph.pham","email":"dolph.pham@gmail.com"}],"readme":"# @apipay.vn/mcp\n\nModel Context Protocol (MCP) server for [ApiPay](https://apipay.vn) — bank-transfer payment gateway in Vietnam.\n\nThis server exposes tools for AI assistants (Claude, Cursor, Codex, Command Code, Grok Build, Gemini, Copilot, OpenCode, and more) over stdio to create sandbox payments, manage Commerce products and prices, list bank accounts and transactions, manage webhooks, and query transaction metrics.\n\n---\n\n## Prerequisites\n\n- Node.js `>=18.0.0`\n- An ApiPay account with API Keys (`ak_test_...` for sandbox or `ak_live_...` for production) from the [ApiPay Dashboard](https://my.apipay.vn)\n\n---\n\n## Authentication & Configuration\n\nThe MCP server authenticates requests with Base64-encoded `accessKey:secretKey` (`Authorization: Bearer <base64>`).\n\nConfiguration is loaded in the following priority:\n\n1. **Environment Variables**:\n   - `APIPAY_ACCESS_KEY`: Merchant Access Key (`ak_test_...` or `ak_live_...`)\n   - `APIPAY_SECRET_KEY`: Merchant Secret Key\n   - `APIPAY_API_URL`: (Optional) Base API URL (defaults to `https://app.apipay.vn/v1`)\n2. **CLI Configuration Fallback**:\n   - If environment variables are missing, the server reads `~/.config/apipay/config.json` (the configuration file managed by `apipay login` or `apipay keys:create`).\n\n> [!NOTE]\n> The server will start even if credentials are not provided initially. Individual tools will return an error message prompting you to set credentials if called while unauthenticated.\n\n---\n\n## Client Setup\n\nAll examples use the same stdio server: `npx -y @apipay.vn/mcp`, with `APIPAY_ACCESS_KEY` and `APIPAY_SECRET_KEY` passed as environment variables.\n\n<details>\n  <summary>Amp</summary>\n\nUse the Amp CLI:\n\n```bash\namp mcp add apipay -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Claude Code</summary>\n\nUse the Claude Code CLI to add the ApiPay MCP server:\n\n```bash\nclaude mcp add apipay --scope user \\\n  --env APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  --env APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Claude Desktop</summary>\n\nAdd to `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"apipay\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@apipay.vn/mcp\"],\n      \"env\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>Cline</summary>\n\nAdd to `cline_mcp_settings.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"apipay\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@apipay.vn/mcp\"],\n      \"env\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>Codex</summary>\n\nUse the Codex CLI:\n\n```bash\ncodex mcp add apipay \\\n  --env APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  --env APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Command Code</summary>\n\nCommand Code uses the `cmd` CLI. Use the `--env` flag to pass the API keys:\n\n```bash\ncmd mcp add --transport stdio \\\n  --env APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  --env APIPAY_SECRET_KEY=your_secret_key \\\n  apipay -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Copilot CLI</summary>\n\nUse the Copilot CLI (`--env` is repeatable):\n\n```bash\ncopilot mcp add apipay \\\n  --env APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  --env APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Copilot / VS Code</summary>\n\nAdd to `.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"apipay\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@apipay.vn/mcp\"],\n      \"env\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>Cursor</summary>\n\nIn Cursor Settings → Features → MCP, or in `.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"apipay\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@apipay.vn/mcp\"],\n      \"env\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>Devin CLI</summary>\n\n```bash\ndevin mcp add apipay -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Factory CLI</summary>\n\n```bash\ndroid mcp add apipay \"npx -y @apipay.vn/mcp\"\n```\n\n</details>\n\n<details>\n  <summary>Gemini CLI</summary>\n\nProject-wide:\n\n```bash\ngemini mcp add apipay \\\n  -e APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  -e APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\nGlobally (user scope):\n\n```bash\ngemini mcp add -s user apipay \\\n  -e APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  -e APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Grok Build</summary>\n\nGrok Build uses the `grok` CLI. Use the `-e` flag to pass the API keys:\n\n```bash\ngrok mcp add apipay \\\n  -e APIPAY_ACCESS_KEY=ak_test_your_access_key \\\n  -e APIPAY_SECRET_KEY=your_secret_key \\\n  -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>JetBrains AI Assistant</summary>\n\nGo to `Settings | Tools | AI Assistant | Model Context Protocol (MCP)` → `Add`, using the standard config above (server name `apipay`, command `npx -y @apipay.vn/mcp`, env vars `APIPAY_ACCESS_KEY` / `APIPAY_SECRET_KEY`).\n\n</details>\n\n<details>\n  <summary>OpenCode</summary>\n\nAdd to `opencode.json` (project) or `~/.config/opencode/opencode.json` (global):\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"apipay\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@apipay.vn/mcp\"],\n      \"environment\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>Qoder CLI</summary>\n\n```bash\nqodercli mcp add apipay -- npx -y @apipay.vn/mcp\n```\n\n</details>\n\n<details>\n  <summary>Warp</summary>\n\nGo to `Settings | AI | Manage MCP Servers` → `+ Add`, using the standard config above (server name `apipay`, command `npx -y @apipay.vn/mcp`, env vars `APIPAY_ACCESS_KEY` / `APIPAY_SECRET_KEY`).\n\n</details>\n\n<details>\n  <summary>Windsurf</summary>\n\nFollow the Windsurf MCP configuration guide and add the server to `.windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"apipay\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@apipay.vn/mcp\"],\n      \"env\": {\n        \"APIPAY_ACCESS_KEY\": \"ak_test_your_access_key\",\n        \"APIPAY_SECRET_KEY\": \"your_secret_key\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n---\n\n## Available Tools\n\nThe server registers 23 tools. MCP clients automatically prefix tool names with the server key `apipay` (e.g. `apipay_list_banks` in OpenCode, `mcp__apipay__list_banks` in Claude Code).\n\n### Connection & Verification\n- `self_test`: Validates API key configuration and returns connection status, key prefix, and bank summary counts.\n\n### Banks\n- `list_banks`: Lists connected bank accounts for this merchant (returns `bankPublicId` values needed to create payments and webhooks).\n\n### Payment Requests\n- `create_payment`: Creates a payment link (requires `bankPublicId`; optional `amount` **or** `priceId`, plus `content`, `title`, `expiresAt`, `redirectUrl`). Resolve a lookup key with `list_prices` first, then pass `priceId`.\n- `list_payments`: Lists payment requests with optional filtering by status, search term, or date range.\n- `cancel_payment`: **(Destructive)** Cancels an `ACTIVE` payment request.\n- `simulate_payment`: Simulates payment for sandbox requests (publicId must start with `test_pr_`; triggers sandbox webhooks).\n\n### Commerce\n- `list_products`: Lists Commerce products.\n- `get_product`: Gets a product with its prices. JSON may include `paymentLinkUrl` and `imageUrl` — copy that URL; there is no separate MCP tool for links or images.\n- `create_product`: Creates a product. Optional `defaultPriceData` creates the first price and makes it the default.\n- `update_product`: Updates name, description, archive/restore, or default price.\n- `list_prices`: Lists prices. Filter by `productId` or `lookupKey` to resolve a price id.\n- `get_price`: Gets a price by id.\n- `create_price`: Creates a price. Amounts cannot be edited later.\n- `update_price`: Updates nickname, lookup key, or archive/restore. Does not change `unitAmount`.\n- `delete_price`: **(Destructive)** Permanently deletes an unused price. Prices that have been used for payments cannot be deleted.\n\n### Webhooks\n- `list_webhooks`: Lists registered webhook endpoints.\n- `create_webhook`: Registers a webhook URL for a connected bank account.\n- `update_webhook`: Updates destination URL for a webhook.\n- `toggle_webhook`: Toggles a webhook between active and inactive.\n- `remove_webhook`: **(Destructive)** Permanently deletes a webhook.\n- `list_webhook_deliveries`: Lists webhook delivery attempts and status logs.\n- `resend_webhook`: Retries a failed webhook delivery (fires a real HTTP request to destination).\n\n### Metrics & Transactions\n- `get_overview`: Returns transaction totals, averages, success rates, and bank volume distribution.\n- `list_transactions`: Lists recent bank transactions with pagination, date, bank, and search filters.\n\n---\n\n## Typical Sandbox Workflow\n\n1. **Verify Connection**:\n   Call `self_test` to confirm the API key is active.\n2. **Find Connected Bank**:\n   Call `list_banks` to get a `bankPublicId`.\n3. **Create a product and price** (optional):\n   Call `create_product` with `defaultPriceData` (for example `{ unitAmount: \"99000\", lookupKey: \"pro-monthly\" }`). Use `list_prices` with `lookupKey` if you already have products.\n4. **Create Payment Request**:\n   Call `create_payment` with `bankPublicId` and either `amount` (e.g. `\"50000\"`) or `priceId`. A `publicId` starting with `test_pr_...` is returned.\n5. **Simulate Customer Payment**:\n   Call `simulate_payment` with `publicId: \"test_pr_...\"` to test the settlement and webhook flow.\n6. **Check History & Deliveries**:\n   Call `list_webhook_deliveries` and `list_transactions` to verify the transaction was recorded.\n\n---\n\n## Destructive Tools Notice\n\nThe following operations permanently change state or remove resources:\n- `cancel_payment`: Cancels an active payment link.\n- `remove_webhook`: Deletes a registered webhook URL.\n- `resend_webhook`: Dispatches an outbound HTTP request to the merchant webhook URL.\n\n---\n\n## Development & Testing\n\n```bash\n# Install dependencies\nnpm install\n\n# Run unit tests\nnpm test\n\n# Build TypeScript to dist/\nnpm run build\n\n# Start local server over stdio\nnpm start\n```\n\n## License\n\nMIT © [ApiPay](https://apipay.vn)\n","readmeFilename":"README.md"}