aba-payway-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@aba-payway-mcpgenerate a KHQR code for 50 USD"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
aba-payway-mcp
Open source. Unofficial. Community-built. This is not an ABA Bank or PayWay product, and it isn't endorsed, reviewed, or supported by them — it's an independent MCP wrapper around their publicly documented API. Use it at your own risk, review the code before pointing it at production credentials, and see LICENSE for the full disclaimer.
An MCP (Model Context Protocol) server that wraps ABA Bank's PayWay API (https://developer.payway.com.kh) so any MCP-compatible AI tool — Claude Code, Claude Desktop, Cursor, Windsurf, Cline, VS Code/Copilot, Gemini CLI, or any other MCP client — can create checkouts, generate KHQR codes, check/list transactions, issue refunds, create payment links, and pull exchange rates, directly from a chat or agent session.
Released under the MIT license — free to use, fork, modify, and redistribute. Built from the public PayWay developer docs (Ecommerce Checkout, ABA QR API, Payment Link, KHQR Guideline sections). PRs and issues welcome; see Contributing.
Tools
Tool | PayWay endpoint | Notes |
| Purchase | hosted checkout / popup / KHQR / cards / wallets |
| ABA QR API — generate-qr | KHQR / WeChat / Alipay, no hosted page |
| check-transaction-2 | status, ≤7 days old |
| transaction-detail | any age, full history, 10 req/min |
| transaction-list-2 | filtered list, ≤3 day range, 50 req/min |
| get-transactions-by-mc-ref | KHQR tag 62.01 lookup |
| close-transaction | cancel a pending tx |
| online-transaction/refund | full/partial, ≤30 days, needs RSA key |
| exchange-rate | ABA buy/sell rates |
| payment-link/create | needs RSA key |
| payment-link/detail | needs RSA key |
Every hash is generated in the exact field order PayWay's docs specify per
endpoint (req_time/request_time + merchant_id + ... + your
api_key, HMAC-SHA512, base64) — this matters because a wrong field order
produces a valid-looking hash that PayWay silently rejects. merchant_auth
fields (Refund, Payment Link) are RSA-PKCS1 encrypted in 117-byte chunks,
matching PayWay's own PHP sample code exactly (openssl_public_encrypt
default padding, not OAEP).
Related MCP server: Bayarcash MCP Server
Requirements
Node.js 18+
A PayWay sandbox or production merchant profile (sandbox sign-up: https://sandbox.payway.com.kh/register-sandbox/, production: contact
paywaysales@ababank.com)Your server's egress IP whitelisted with PayWay — this server calls the API directly (not from a browser), so PayWay needs to allow that IP, not just a frontend domain.
Install
Clone and run locally:
git clone https://github.com/sim0ple/aba-payway-mcp.git
cd aba-payway-mcp
npm installOr, once published to npm, run it with npx without cloning anything (see
per-client examples below) — npx -y aba-payway-mcp.
Configuration
Set as environment variables in your MCP client's config (never hardcode secrets in code or commit them):
Variable | Required | Notes |
| yes | Your merchant key from ABA Bank |
| yes | HMAC secret ("public_key" in PayWay's docs — used for HMAC-SHA512 hashing) |
| no |
|
| only for refund / payment-link tools | RSA public key PEM ABA Bank issued for |
Adding it to your AI tool
Every client below ultimately runs the same command:
node /absolute/path/to/aba-payway-mcp/src/index.js(or npx -y aba-payway-mcp once it's published to npm). Only the
configuration mechanism differs per tool.
Claude Code (CLI)
Claude Code has a built-in claude mcp add command. Everything after --
is the command it runs to start the server; flags before -- configure
how Claude Code registers it.
claude mcp add payway \
--env PAYWAY_MERCHANT_ID=your_merchant_id \
--env PAYWAY_API_KEY=your_api_key \
--env PAYWAY_ENV=sandbox \
-- node /absolute/path/to/aba-payway-mcp/src/index.jsAdd --env PAYWAY_RSA_PUBLIC_KEY="$(cat your_key.pem)" if you need the
refund / payment-link tools.
Once published to npm, you can skip the clone entirely:
claude mcp add payway \
--env PAYWAY_MERCHANT_ID=your_merchant_id \
--env PAYWAY_API_KEY=your_api_key \
--env PAYWAY_ENV=sandbox \
-- npx -y aba-payway-mcpUseful follow-ups:
claude mcp list # check connection status
claude mcp get payway # see the exact command/env Claude Code stored
claude mcp remove payway # remove itScope — by default claude mcp add registers the server at local
scope (just you, just this project). Pass --scope user to make it
available in every project on your machine, or --scope project to write
it to .mcp.json at the project root so teammates get it too when they
clone the repo (they'll be prompted to approve it — don't commit real
secrets, reference them as ${PAYWAY_API_KEY} and set that env var per
machine, or use a .env your team doesn't commit):
claude mcp add --scope project payway \
--env PAYWAY_MERCHANT_ID='${PAYWAY_MERCHANT_ID}' \
--env PAYWAY_API_KEY='${PAYWAY_API_KEY}' \
-- npx -y aba-payway-mcpIf you'd rather write the config by hand, this is the equivalent
.mcp.json entry (project scope) or ~/.claude.json entry (user scope):
{
"mcpServers": {
"payway": {
"type": "stdio",
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}Claude Desktop
Settings → Developer → Edit Config opens claude_desktop_config.json:
{
"mcpServers": {
"payway": {
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox",
"PAYWAY_RSA_PUBLIC_KEY": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
}
}
}Restart Claude Desktop to pick up the change.
Cursor
.cursor/mcp.json in your project (project-scoped) or the global one via
Cursor Settings → MCP (available everywhere):
{
"mcpServers": {
"payway": {
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}Windsurf
Edit ~/.codeium/windsurf/mcp_config.json directly (macOS/Linux) or
%USERPROFILE%\.codeium\windsurf\mcp_config.json (Windows) — or open it
via the hammer icon in Cascade → Configure:
{
"mcpServers": {
"payway": {
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}Cline (VS Code extension)
Open the Cline sidebar → MCP Servers icon → "Edit MCP Settings" (or
cline_mcp_settings.json directly), same mcpServers shape:
{
"mcpServers": {
"payway": {
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}VS Code (GitHub Copilot)
VS Code can add an MCP server straight from the command line:
code --add-mcp '{"name":"payway","command":"npx","args":["-y","aba-payway-mcp"],"env":{"PAYWAY_MERCHANT_ID":"your_merchant_id","PAYWAY_API_KEY":"your_api_key","PAYWAY_ENV":"sandbox"}}'Or via the Command Palette → MCP: Add Server, or by hand in
.vscode/mcp.json (workspace) / user mcp.json (global):
{
"servers": {
"payway": {
"type": "stdio",
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}Gemini CLI
Gemini CLI also has a native add subcommand:
gemini mcp add payway \
-e PAYWAY_MERCHANT_ID=your_merchant_id \
-e PAYWAY_API_KEY=your_api_key \
-e PAYWAY_ENV=sandbox \
-- npx -y aba-payway-mcp-s user (default project) makes it available across all your projects
instead of just the current one:
gemini mcp add -s user payway -e PAYWAY_MERCHANT_ID=your_merchant_id -e PAYWAY_API_KEY=your_api_key -- npx -y aba-payway-mcpThis writes to ~/.gemini/settings.json (user) or .gemini/settings.json
(project).
Any other MCP client
If your tool isn't listed above, it almost certainly still reads the same
shape — an mcpServers (or servers) object with command, args, and
env:
{
"mcpServers": {
"payway": {
"command": "npx",
"args": ["-y", "aba-payway-mcp"],
"env": {
"PAYWAY_MERCHANT_ID": "your_merchant_id",
"PAYWAY_API_KEY": "your_api_key",
"PAYWAY_ENV": "sandbox"
}
}
}
}Point command at node with the absolute path to src/index.js instead
of npx if you're running from a local clone rather than a published npm
package. Check your client's docs for the exact config file path and key
name (mcpServers vs servers is the main variant).
Local smoke test (no live PayWay credentials needed)
npm testThis spawns the server over stdio, does the MCP initialize handshake,
lists all 11 tools, and calls payway_exchange_rate with dummy credentials
to confirm the hashing/config code path runs (it'll get a network/auth
error against real PayWay, which is expected without real creds — the
point is confirming nothing throws before that).
Notes / gotchas carried over from the PayWay docs
payway_purchasewith nopayment_optionandhosted_viewreturns full checkout HTML (a redirect page) rather than JSON — that's normal PayWay behavior, not a bug here.payway_check_transactiononly works ≤7 days old; usepayway_get_transaction_detailsfor older transactions.payway_get_transaction_listdate range is capped at 3 days by PayWay.Refunds only work on
COMPLETED/APPROVEDtransactions within 30 days.Amount/currency minimums (100 KHR / 0.01 USD, etc.) are enforced by PayWay itself, not duplicated here — check
status.codein the response if something's rejected.
Project layout
aba-payway-mcp/
├── package.json
├── src/
│ ├── index.js # MCP server + all tool definitions
│ └── payway.js # HMAC hashing / RSA encryption / HTTP client
├── test/ # stdio smoke tests, no live credentials required
├── .env.example
└── .github/workflows/ci.ymlContributing
This is an open-source, community-maintained project — issues and PRs welcome, especially for the remaining PayWay sections not yet covered (Credentials on File / tokenized payments, Pre-auth capture flow, multi-party Payout, Shopify/WooCommerce/Prestashop plugin helpers).
Disclaimer
aba-payway-mcp is an unofficial, independently developed
integration. It is not created by, affiliated with, or endorsed by ABA
Bank or PayWay. "PayWay" and "ABA" are trademarks of their respective
owners. Provided as-is, with no warranty — see LICENSE.
License
MIT — free and open source. See LICENSE.
Available Tools
12 toolspayway_check_transactionB
Check the status of a transaction created within the last 7 days.
| Name | Required | Description | Default |
|---|---|---|---|
| tran_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose the important 7-day limitation and implies a read-only status check, but it does not describe the return format, failure behavior, or any authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the action, target, and key constraint efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter status-check tool, the description covers the core purpose and a critical constraint. However, without an output schema or annotations, the agent is left without information about the expected response shape or any edge-case behavior, so completeness is only moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only mentions that the transaction must be from the last 7 days. It does not explain how to obtain tran_id, what kind of identifier it is, or any format beyond the schema's string type and maxLength. The parameter name is self-explanatory, but the description adds little semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (check status) on a specific resource (a transaction), with a meaningful scope constraint (created within last 7 days). It does not explicitly distinguish it from sibling payway_get_transaction_details, but the verb and recency window provide reasonable clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to choose this tool over alternatives like payway_get_transaction_details or payway_get_transaction_list. The 7-day constraint implies a limited scope, but no explicit when/when-not or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_close_transactionA
Cancel/close a transaction (e.g. flash sale, hotel booking, ticket). Sets status to CANCELLED, no callback sent.
| Name | Required | Description | Default |
|---|---|---|---|
| tran_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
States the outcome (sets status to CANCELLED) and a key side effect (no callback). Provides transparency about the tool's behavior, though it omits idempotency, permissions, and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and includes only essential information. It is well-structured, easy to understand, and free of unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool, the description provides sufficient information about its purpose and effect. It does not specify return values or errors, but given the absence of an output schema and the simplicity, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter tran_id is not explicitly described beyond its name and length constraint. The description does not clarify that it is the transaction identifier or provide additional context, adding no extra meaning to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (Cancel/close) and the resource (transaction), with examples. The phrase 'no callback sent' distinguishes it from other transaction-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Does not explicitly instruct when to use this tool over alternatives like refund or check_transaction. It mentions the effect but lacks direct guidance on selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_create_payment_linkC
Create a shareable PayWay payment link. Requires PAYWAY_RSA_PUBLIC_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| amount | Yes | ||
| payout | No | ||
| currency | Yes | ||
| return_url | Yes | Plain URL; base64-encoded automatically | |
| description | No | ||
| expired_date | No | Unix timestamp; omit/null for no expiry | |
| payment_limit | No | ||
| merchant_ref_no | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It only notes a prerequisite (PAYWAY_RSA_PUBLIC_KEY) and omits side effects, authentication requirements, response structure, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundancy. It front-loads the purpose, but the brevity comes at the cost of essential context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, 4 required, no output schema, and low schema coverage, this description is grossly incomplete. It fails to explain parameter usage, link behavior, or any constraints beyond the key requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 22%, and the description adds no parameter semantics. It does not explain any of the 9 parameters, so the agent receives no additional meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Create a shareable PayWay payment link.' It conveys the core purpose and distinguishes this from related actions like purchase or QR generation, though it doesn't explicitly name sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. There is no mention of typical use cases, exclusions, or comparisons with siblings such as payway_purchase or payway_generate_qr.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_docsA
Fetch ABA PayWay developer documentation as LLM-friendly markdown. Call with no arguments to get the index (llms.txt) listing every doc URL, then pass one of those URLs/paths to read a specific page. No credentials required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A developer.payway.com.kh .md doc URL or path from the index; omit to list all docs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Fetch' and 'read a specific page', which implies a read-only operation. It doesn't explicitly state there are no side effects or rate limits, but the fetch semantics and 'no credentials' note are sufficient given the simple nature of the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences cover the purpose, usage pattern, and parameter behavior without any redundant information. The structure is clean and immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has no output schema. The description clearly explains what the user will get (markdown docs, index) and how to get it. No additional context is needed for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The url parameter is fully described: it expects a .md URL or path from the index, and omitting it triggers the index listing. This goes beyond the schema's basic type/description, providing concrete usage details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it fetches ABA PayWay developer documentation as markdown, with a distinct index-listing behavior. Sibling tools are payment operations, so this is unambiguously the documentation retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two-step invocation pattern: omit the url for the index, then pass a URL/path to fetch a specific page. Also notes that no credentials are required, which is useful guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_exchange_rateA
Fetch ABA Bank's current buy/sell exchange rates (same as ababank.com/en/forex-exchange).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It states the operation (fetch rates) but does not mention whether it is read-only, requires authentication, or any rate limits or response format. Given the trivial nature, this is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence (12 words) that states the purpose without any waste. It is appropriately concise for a simple fetch tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description tells the agent what is fetched (buy/sell rates) and cites the source. While it could specify response structure, the low complexity makes this adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100%. The baseline for 0 params is 4, and the description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Fetch) and a precise resource (ABA Bank's current buy/sell exchange rates), clearly distinguishing it from payment and transaction siblings. It also references the source website, removing any ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context—this tool fetches exchange rates, which is obviously distinct from the payment-related siblings. However, it does not explicitly state when to use it vs. alternatives or provide exclusions, so it lacks the explicit guidance of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_generate_qrA
Generate a KHQR / WeChat / Alipay QR code (string + PNG image + ABA deeplink) for a payment, without a hosted checkout page.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| items | No | ||
| phone | No | ||
| amount | Yes | ||
| payout | No | ||
| tran_id | Yes | ||
| currency | Yes | ||
| lifetime | No | ||
| last_name | No | ||
| first_name | No | ||
| callback_url | No | Plain URL; base64-encoded automatically | |
| custom_fields | No | ||
| purchase_type | No | ||
| return_params | No | ||
| payment_option | Yes | ||
| return_deeplink | No | ||
| qr_image_template | No | template3_color |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing side effects; it describes the artifacts returned (string, PNG, deeplink) but does not state whether this creates a payment transaction, whether it charges the customer, or whether it is idempotent. Basic return behavior is covered, but broader behavioral effects are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed sentence that packs the core purpose, supported payment methods, output types, and an important usage qualifier without unnecessary words. It is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 17 parameters, nested objects, no output schema, and no annotations, the description is too sparse to provide complete context. It mentions high-level outputs but omits details about required input relationships, optional parameters, return object structure, and potential error or edge-case behavior. An agent would need substantial external documentation to use this tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 6%, and the description adds no parameter-level meaning. Several parameters—payout, lifetime, return_params, return_deeplink, qr_image_template—remain unexplained, and the description does not clarify how they relate to generating a QR code. The schema's enums and types provide some structure, but the description fails to compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (generate), the resource (KHQR / WeChat / Alipay QR code), and the output (string + PNG image + ABA deeplink). It also distinguishes this tool from hosted-checkout workflows by saying 'without a hosted checkout page', making its purpose unambiguous relative to sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without a hosted checkout page' gives useful guidance on when to use this tool instead of payment-link or hosted-page tools. It does not explicitly mention alternatives like payway_purchase for direct charges, but the purpose is clear enough for most selection scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_get_payment_link_detailsA
Get details/status of a previously created payment link. Requires PAYWAY_RSA_PUBLIC_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The payment link ID returned by payway_create_payment_link |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the authentication requirement (PAYWAY_RSA_PUBLIC_KEY) and implies a read-only operation ('Get details/status'), but does not describe the return format, error behavior, or whether any side effects occur. The key requirement is useful, but the rest is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The action is front-loaded ('Get details/status'), and the key requirement is a necessary caveat placed second. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool, the description adequately covers what the tool does and what is required to call it. The lack of an output schema means the agent won't know the exact shape of the returned details/status, but the tool is simple and the description provides enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the 'id' parameter is already documented as the payment link ID returned by payway_create_payment_link. The description's mention of 'previously created payment link' aligns with this but adds no new semantic detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and a specific resource ('details/status of a previously created payment link'). It clearly differentiates from siblings like payway_create_payment_link (creation) and payway_get_transaction_details (transactions), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use it for payment links that have already been created, and it notes the required PAYWAY_RSA_PUBLIC_KEY. It doesn't explicitly name alternatives or exclusions, but the resource type and 'previously created' condition give an agent enough signal to choose this over transaction-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_get_transaction_detailsB
Get full details/history of any past transaction (any age). Limited to 10 requests/minute by PayWay.
| Name | Required | Description | Default |
|---|---|---|---|
| tran_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose a concrete constraint: the 10-requests/minute PayWay rate limit. It does not state what the returned details/history contain, whether any auth/permissions are required, or how errors/timeouts behave, but for a simple read lookup this is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary purpose and followed by the rate limit. No filler; every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required string parameter, no output schema), and the description covers purpose and a key operational limit. It omits response contents and parameter semantics, so an agent is left to infer the exact meaning of 'full details/history' and the tran_id format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no property descriptions (0% coverage), and the description never explicitly defines tran_id or its format. The parameter name and the phrase 'any past transaction' imply it is a transaction identifier, but the description adds no semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and a concrete resource: full details/history of any past transaction, with the temporal scope 'any age'. It is clear enough to distinguish it from list-oriented siblings like payway_get_transaction_list, though it does not name sibling alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'any past transaction (any age)' gives implied guidance that this tool is for historical single-transaction lookups. However, it does not state when to prefer this over payway_check_transaction or payway_get_transactions_by_merchant_ref, and gives no exclusions or alternative conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_get_transaction_listA
List transactions filtered by date range (max 3 days), amount range, and status. Max 50 req/min.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| status | No | Comma-separated: APPROVED,PRE-AUTH,REFUNDED,PENDING,DECLINDED,CANCELLED | |
| to_date | No | YYYY-MM-DD HH:mm:ss | |
| from_date | No | YYYY-MM-DD HH:mm:ss | |
| to_amount | No | ||
| pagination | No | Records per page, default 40, max 1000 | |
| from_amount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses some behavioral traits: a maximum date range of 3 days and a rate limit of 50 requests per minute. However, it does not mention pagination behavior, response format, or potential errors (e.g., exceeding the date range), leaving significant behavioral aspects untold. With no annotations, this partial transparency yields a neutral score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that packs essential information: the action, filters, and constraints. It is well-structured and front-loaded, with no unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema and the existence of several sibling transaction tools, the description is somewhat incomplete. It does not specify the structure of the returned transaction list, whether summaries or full objects are included, or how to handle the optional parameters. It covers the core filtering intent but leaves contextual details (e.g., sorting, pagination behavior, response shape) unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description semantically covers the filter parameters (date, amount, status) but omits the 'page' and 'pagination' parameters entirely. Although the schema descriptions for status, date fields, and pagination provide some detail, the tool-level description does not clarify how pagination works or that 'pagination' is a page-size parameter. The 'max 3 days' constraint adds value beyond the schema, but overall coverage is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List transactions filtered by date range (max 3 days), amount range, and status.' The verb 'List' and the object 'transactions' are specific, and the mention of filters distinguishes it from sibling tools like payway_get_transaction_details or payway_check_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It mentions constraints like the 3-day limit and rate limit, but does not indicate when to prefer this over payway_get_transactions_by_merchant_ref or payway_get_transaction_details. Users are left to infer the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_get_transactions_by_merchant_refA
Retrieve up to the last 50 transactions matching a merchant_ref (tag 62.01 on KHQR). Max 10 req/min.
| Name | Required | Description | Default |
|---|---|---|---|
| merchant_ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses the 'last 50' limit and the rate limit of 10 req/min, and the verb 'Retrieve' signals a read-only operation. It omits auth requirements and error behavior, but for a simple lookup the disclosed limits are valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry the full intent: the first defines the action and scope, and the second adds the only other constraint (rate limit). There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with no output schema, the description covers the purpose, parameter semantics, result cap, and rate limit. The main missing piece is explicit guidance on when to choose this over related transaction endpoints, but that is more of a usage nuance than a fundamental context gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines merchant_ref as a string with maxLength 20, and schema description coverage is 0%. The description compensates by explaining that merchant_ref corresponds to tag 62.01 on KHQR, giving the parameter real-world meaning and clarifying that the tool filters by it. This is meaningful semantic context for the single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (Retrieve), a precise resource (transactions), and a distinct filter (merchant_ref / KHQR tag 62.01). It also caps the result set at 50, making the tool's scope unmistakable and differentiating it from more general list or detail tools among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: call this tool when you have a merchant_ref and need matching transactions. However, it does not explicitly say when not to use it or mention alternatives like payway_get_transaction_list or payway_get_transaction_details, so the agent must infer the best choice from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_purchaseC
Create a PayWay Purchase transaction (redirect/QR/deeplink checkout). Returns checkout HTML/JSON depending on payment_option.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| No | |||
| items | No | ||
| phone | No | ||
| amount | Yes | ||
| payout | No | ||
| tran_id | Yes | Unique transaction ID you generate | |
| currency | No | ||
| lastname | No | ||
| lifetime | No | Minutes; 3 min to 30 days | |
| shipping | No | ||
| firstname | No | ||
| view_type | No | ||
| cancel_url | No | ||
| return_url | No | Plain URL; will be base64-encoded automatically | |
| payment_gate | No | ||
| custom_fields | No | ||
| return_params | No | ||
| payment_option | No | ||
| return_deeplink | No | ||
| skip_success_page | No | ||
| continue_success_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It mentions that the return format depends on payment_option, but it does not disclose side effects (e.g., creating a transaction), required authentication, rate limits, or how the response structure varies. The description is too sparse to give an agent a realistic sense of what happens when the tool is invoked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the core purpose, followed by the return-format note. There is no redundant phrasing or unnecessary detail. It is efficient, though it could be slightly more informative without losing conciseness. It earns a 4 for being appropriately sized for its minimal content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (22 parameters, nested objects, multiple enums, no output schema, no annotations), the description is severely incomplete. It fails to explain how to set up a transaction, which fields are required, how payment_option affects behavior, or what the returned HTML/JSON contains. An agent would need to guess or refer to external docs, making this insufficient for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14%, so the description must compensate by explaining key parameters. It does not. The only parameter indirectly mentioned is payment_option (via the return format), but it does not explain its enum values or how to choose them. Required parameters (tran_id, amount) are not described, nor are nested objects like items or payout. The description adds almost no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Create a PayWay Purchase transaction) and specifies the checkout types (redirect/QR/deeplink) and return format (HTML/JSON). This distinguishes it from siblings like payway_generate_qr or payway_create_payment_link, though it does not explicitly name them. The verb and resource are specific, so it avoids being a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus the many siblings (e.g., payway_generate_qr, payway_create_payment_link, payway_check_transaction). It does not state conditions, alternatives, or exclusions, leaving an agent to infer that this is for purchase transactions without clarity on when other tools are more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payway_refundA
Issue a full or partial refund within 30 days of a COMPLETED transaction. Requires PAYWAY_RSA_PUBLIC_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| tran_id | Yes | ||
| refund_amount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a key requirement (PAYWAY_RSA_PUBLIC_KEY) and a business rule (30-day window, completed transactions), which is useful. However, it does not mention side effects, failure behavior, or reversibility, which are important for a mutation tool. It adds some context but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence. It front-loads the purpose and includes a key requirement without any unnecessary words. Every part contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only 2 parameters and no output schema, the description covers the core purpose and a critical prerequisite, but it omits return value expectations, error scenarios, and whether the refund is immediate. While simple, it leaves some gaps that an agent might need to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does not mention tran_id or refund_amount at all. While the parameter names are self-explanatory, the description only hints at 'full or partial refund' without clarifying the amount's semantics, units, or relationship to the original transaction. It fails to add value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Issue a full or partial refund within 30 days of a COMPLETED transaction.' It specifies the resource (transaction) and action (refund), and the time/completion constraints make it distinct from sibling tools like payway_purchase or payway_check_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit conditions for use: only within 30 days and only for COMPLETED transactions. However, it does not explicitly name alternatives or state when not to use it, though the name and description make it obvious it is the refund tool. This is clear enough but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.0.2- First observed
payway_check_transaction - First observed
payway_close_transaction - First observed
payway_create_payment_link - First observed
payway_docs - First observed
payway_exchange_rate - First observed
payway_generate_qr - First observed
payway_get_payment_link_details - First observed
payway_get_transaction_details - First observed
payway_get_transaction_list - First observed
payway_get_transactions_by_merchant_ref - First observed
payway_purchase - First observed
payway_refund
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes, but there is minor overlap between check_transaction and get_transaction_details, and between create_payment_link and purchase. Descriptions clarify these differences sufficiently.
All tools share the 'payway_' prefix and use snake_case, but the naming pattern is not uniform: 'docs', 'purchase', and 'exchange_rate' deviate from the verb_noun structure. Still, the overall style is consistent and predictable.
12 tools is well-scoped for a payment gateway MCP, covering QR generation, payment links, transactions, refunds, exchange rates, and documentation without being overwhelming or thin.
The surface covers core payment operations (create, check, list, refund, close) and additional utilities like exchange rates and docs. Minor gaps exist (e.g., no payment link update/delete, no webhook management), but these are not critical for typical workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Multi-tenant MCP gateway for AI commerce. One connection, every store.
Multi-tenant MCP gateway for AI commerce. One connection, every store.
Multi-tenant MCP gateway for AI commerce. One connection, every store.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects AI assistants to the Bayarcash payment gateway API, enabling users to create payment intents, check transactions, monitor revenue, and manage Malaysian payment channels through natural language.81MIT
- AlicenseAqualityDmaintenanceEnables AI-powered payment management for Bayarcash, allowing users to create payment links, check transaction status, and manage Malaysian payment methods (FPX, DuitNow, e-wallets) through natural language.8MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with PayBridgeNP payment gateway accounts through natural language. Provides read-only access to payments, refunds, analytics, and account data, with write capabilities planned for future versions.461MIT
- AlicenseAqualityDmaintenanceTalk to your DeonPay merchant account from any MCP-compatible AI host. Enables reading transactions, creating payment links, inspecting subscriptions, and more.204MIT