Minimal MCP server for payware API integration. Enables quick payment instution, merchant or independent software vendor integration with payware APIs in sandbox environment.
- RSA Key Generation: Generate secure 2048-bit RSA key pairs
- JWT Token Creation: Create properly formatted JWT tokens
- Sandbox Setup: Configure sandbox authentication
- Create Transaction: Support PLAIN, QR, and BARCODE transactions
- Transaction Status: Check transaction status by ID
- Callback Simulation: Test callback scenarios
- Advanced Code Generation: Generate complete integration code across 8 languages (Python, Node.js, PHP, Java, C#, Go, Ruby, cURL) with 16+ framework support
- Framework Integration: Framework-specific examples for Django, FastAPI, Express, NestJS, Laravel, Spring Boot, ASP.NET, and more
- Real-world Scenarios: Generate complete integration scenarios (e-commerce, ISV multi-merchant, P2P payments)
- Comprehensive Documentation: Auto-generate complete API documentation with code examples
- Request Formatting: Format and validate API requests
cd payware/mcp
npm installCopy the example environment file and configure your credentials:
cp .env.example .envEdit .env file:
# Partner ID from payware dashboard
PAYWARE_PARTNER_ID=your_partner_id_here
# Path to private key file (relative to project root)
PAYWARE_SANDBOX_PRIVATE_KEY_PATH=keys/sandbox-your-private-key.pem
PAYWARE_PRODUCTION_PRIVATE_KEY_PATH=keys/production-your-private-key.pem
# Optional: Sandbox base URL (defaults to https://sandbox.payware.eu/api)
PAYWARE_SANDBOX_URL=https://sandbox.payware.eu/api.env file to version control. It contains sensitive credentials.
npm start-
Generate RSA Keys
Tool: payware_authentication_generate_rsa_keys -
Create JWT Token
Tool: payware_authentication_create_jwt_token Parameters: - partnerId: (from PAYWARE_PARTNER_ID) - privateKey: (from environment-specific key path) -
Setup Sandbox
Tool: payware_authentication_setup_sandbox_auth Parameters: - partnerId: (from PAYWARE_PARTNER_ID) -
Create Transaction
Tool: payware_operations_create_transaction Parameters: - partnerId: (from PAYWARE_PARTNER_ID) - privateKey: (from environment-specific key path) - amount: 10.00 - currency: EUR - reasonL1: "Payment description" - type: PLAIN -
Check Status
Tool: payware_operations_get_transaction_status Parameters: - partnerId: (from PAYWARE_PARTNER_ID) - privateKey: (from environment-specific key path) - transactionId: TRANSACTION_ID
The payware MCP server transforms flat parameter inputs into the proper nested JSON structure required by the payware API:
{
// ROOT LEVEL - Transaction metadata
"shop": "SHOP001", // Optional: Shop code
"account": "GB29NWBK60161331926810", // Optional: Account identifier
"friendlyName": "Your Shop Name", // Optional: Account holder name
"callbackUrl": "https://callback.url", // Optional: HTTPS callback URL
"passbackParams": "{\"orderId\":\"12345\"}", // Optional: Callback parameters
// TRANSACTION DATA - Required transaction information
"trData": {
"amount": "25.50", // String/Number: Amount (can be "0.00" for flexible amounts)
"currency": "EUR", // REQUIRED: ISO 3-character currency code
"reasonL1": "Payment for services", // REQUIRED: Transaction description (max 100 chars)
"reasonL2": "Order #12345" // Optional: Additional description (max 100 chars)
},
// TRANSACTION OPTIONS - Transaction behavior settings
"trOptions": {
"type": "QR", // PLAIN, QR, or BARCODE (default: PLAIN)
"timeToLive": 300 // Seconds: 60-600 (default: 120)
},
// QR OPTIONS - Only included when type=QR
"qrOptions": {
"qrFormat": "PNG", // PNG, SVG, JPG, GIF, BMP (default: SVG)
"qrBorder": 4, // Border modules: 1-10 (default: 4)
"qrErrorCorrection": "QUARTILE", // LOW, MEDIUM, QUARTILE, HIGH (default: QUARTILE)
"qrScale": 16, // Pixel size: 1-100 (default: 16, irrelevant for SVG)
"qrVersion": 10 // QR version: 1-40 (default: 10, auto if not specified)
},
// BARCODE OPTIONS - Only included when type=BARCODE
"barOptions": {
"barFormat": "SVG", // PNG, SVG, JPG (default: SVG)
"barModuleWidth": 2, // Module width: 1-10 (default: 2)
"barBarHeight": 100, // Height: 15-1000 (default: 100)
"barFontSize": 12, // Font size: 0-24 (default: 12)
"barHumanReadableLocation": "NONE" // NONE, BOTTOM, TOP (default: NONE)
}
}When using MCP tools, parameters are automatically mapped to the correct API structure:
| MCP Tool Parameter | API Location | Description |
|---|---|---|
partnerId, privateKey |
Authentication | Used for JWT signing, not sent in request |
account, friendlyName, shop, callbackUrl, passbackParams |
Root Level | Transaction metadata |
amount, currency, reasonL1, reasonL2 |
trData object |
Core transaction data |
type, timeToLive |
trOptions object |
Transaction behavior |
qrFormat, qrBorder, etc. |
qrOptions object |
QR code settings (when type=QR) |
barFormat, barModuleWidth, etc. |
barOptions object |
Barcode settings (when type=BARCODE) |
Advanced multi-language code generation with framework support
Supports 60+ operations across all partner types:
- Transactions: create_transaction, get_transaction_status, cancel_transaction, process_transaction, get_transaction_history, simulate_callback
- Products: create_product, get_product, update_product, delete_product, list_products, get_product_image, create_schedule, update_schedule, delete_schedule, list_schedules
- OAuth2 (ISV only): obtain_token, get_token_info, create_token_simple, refresh_token, revoke_token, list_active_tokens
- Data: generate_report, get_report_status, export_report, download_export, cancel_report, list_reports, get_analytics_summary, create_custom_report
- Deep Links: get_transaction_link, get_product_link, create_custom_link, delete_transaction_link, delete_product_link, list_active_links, get_link_analytics, create_batch_links
- P2P (Payment Institution): initiate_p2p_transfer, accept_p2p_transfer, reject_p2p_transfer, get_p2p_transfer_status, list_p2p_transfers, cancel_p2p_transfer, create_p2p_link, get_p2p_analytics
- Soundbites (Payment Institution): register_audio, get_audio, update_audio, delete_audio, list_audios, create_soundbite_transaction, stream_audio, download_audio, get_soundbite_analytics, create_audio_playlist, get_audio_preview
Comprehensive documentation generator
Generates complete API documentation with working code examples for any partner type and programming language combination.
Generate RSA key pair for API authentication.
Parameters:
keySize(optional): RSA key size in bits (default: 2048)
Create JWT token for API authentication.
Parameters:
partnerId(required): Partner ID from paywareprivateKey(required): RSA private key in PEM format
Validate JWT token format and signature.
Parameters:
token(required): JWT token to validatepartnerId(required): Partner ID for validation
Test JWT token with payware API.
Parameters:
token(required): JWT token to testpartnerId(required): Partner ID
Setup sandbox authentication configuration.
Parameters:
partnerId(required): Partner ID from paywareprivateKey(optional): Private key for validation
payware transactions can have the following statuses:
ACTIVE Status:
- β³ ACTIVE: Active transaction pending processing or finalizing
- This is the only status returned by
payware_transactions_get_transaction_status - Use GET
/transactions/{id}endpoint
Final Statuses:
- β CONFIRMED: Successfully finalized
- β DECLINED: Declined by the user, processing or finalizing payment institutions
- π₯ FAILED: Failed due to technical reasons or other
- β° EXPIRED: Time to live of the transaction has passed
- π« CANCELLED: Transaction canceled by the originator
These final statuses are only available through payware_operations_get_transaction_history using GET /transactions-history/{id} endpoint.
Create a new transaction with full API structure support.
Key Parameters:
currency(required): ISO 3-character code (EUR, USD, GBP, etc.)reasonL1(required): Transaction description (max 100 chars)partnerId(required): Partner ID from payware dashboardprivateKey(required): RSA private key for JWT signingamount(optional): Currency value (default: "0.00" for flexible amounts)type(optional): PLAIN, QR, or BARCODE (default: PLAIN)timeToLive(optional): Payment timeout in seconds, 60-600 (default: 120)
QR Options (when type=QR):
qrFormat: PNG, SVG, JPG, GIF, BMP (default: SVG)qrErrorCorrection: LOW, MEDIUM, QUARTILE, HIGH (default: QUARTILE)qrScale,qrBorder,qrVersion: Size and appearance settings
Barcode Options (when type=BARCODE):
barFormat: PNG, SVG, JPG (default: SVG)barModuleWidth,barBarHeight,barFontSize: Size settings
Get status of ACTIVE transactions only. For completed/finalized transactions use history tool.
Parameters:
transactionId(required): Transaction ID (starts with 'pw')partnerId(required): Partner IDprivateKey(required): Private key for JWT signing
Simulate callback scenarios for testing.
Parameters:
transactionId(required): Transaction IDstatus(optional): CONFIRMED, DECLINED, FAILED, EXPIRED, or CANCELLED (default: CONFIRMED)callbackUrl(optional): URL where callback would be sentamount(optional): Transaction amount (default: 10.00)currency(optional): Currency (default: EUR)type(optional): Transaction type (default: PLAIN)
Generate production-ready code examples for any payware operation.
Parameters:
operation(required): Operation to generate - see complete list belowlanguage(optional): python, nodejs, php, java, csharp, curl (default: python)partner_type(optional): merchant, isv, payment_institution (default: merchant)include_comments(optional): Include detailed code comments (default: true)include_error_handling(optional): Include comprehensive error handling (default: true)
Available Operations by Category:
Authentication:
authentication- JWT authentication setup
Transaction Operations (all partner types):
create_transaction- Create a new payment transactionget_transaction_status- Get transaction status and detailsprocess_transaction- Process a pending transactioncancel_transaction- Cancel a pending transaction
Product Operations (merchant, isv):
create_product- Create a new productget_product- Get product detailslist_products- List all products
OAuth2 Operations (isv only):
obtain_token- Obtain OAuth2 access tokenget_token_info- Get OAuth2 token information
Data Operations (all partner types):
generate_report- Generate analytics reportget_report_status- Get report generation status
P2P Operations (payment_institution only):
initiate_p2p_transfer- Initiate peer-to-peer transferaccept_p2p_transfer- Accept P2P transfer
Deep Links (all partner types):
get_transaction_link- Get deep link for transaction
Soundbites (payment_institution only):
register_audio- Register audio content for soundbite transactions
Generate comprehensive API documentation with code examples.
Parameters:
language(optional): Target programming language (default: python)partnerType(optional): merchant, isv, payment_institution (default: merchant)includeScenarios(optional): Include real-world integration scenarios (default: true)outputFormat(optional): markdown, html, json (default: markdown)
Format and validate API requests with deterministic JSON serialization for MD5 consistency.
Parameters:
type(required): transaction, headers, or curldata(optional): Data to formatjwtToken(optional): JWT token for headerssignature(optional): Request signatureendpoint(optional): API endpoint for curlmethod(optional): HTTP method (default: POST)
Format JSON with deterministic property ordering for consistent MD5 calculation.
Parameters:
data(required): Object to serializeminimize(optional): Remove whitespace (default: true)
Get MCP server information and configuration.
Note: All transaction data is serialized using consistent property ordering to prevent MD5 mismatch errors.
@modelcontextprotocol/sdk: MCP server frameworkaxios: HTTP client for API callsjsonwebtoken: JWT token creationnode-forge: RSA key generation
- Sandbox Only: All API calls are restricted to sandbox environment
- Base URL:
https://sandbox.payware.eu/api/v1 - Supported Currencies: EUR, USD, GBP
- Supported Transaction Types: PLAIN, QR, BARCODE
- REQUIRED: Use environment variables for all credentials
- Never commit
.envfiles to version control - Use different credentials for development and production
- Store private key files outside web-accessible directories
- Generate separate key pairs for sandbox and production
- Store private keys with restricted file permissions (600)
- Never embed private keys in source code
- Rotate keys regularly according to security policies
- This server is designed for sandbox testing only
- Never use sandbox keys in production environment
- Implement proper error handling in production
- Use HTTPS for all API communications
- Validate all input parameters
- Implement rate limiting and monitoring
- Property Order: JSON objects must have consistent property ordering
- Minimized Format: No whitespace or formatting in request bodies
- MD5 Calculation: Must be calculated from the exact same JSON string sent to API
- Implementation: This server uses deterministic JSON serialization to ensure consistency
Example of correct JSON format:
{"trData":{"amount":"25.50","currency":"EUR","reasonL1":"Payment description"},"trOptions":{"timeToLive":300,"type":"PLAIN"}}Why this matters:
- Different property orders produce different MD5 hashes
- MD5 mismatch results in
ContentMd5 mismatcherrors - Server validates that JWT contentMd5 matches request body MD5
-
Authentication Failed (ERR_INVALID_SIGNATURE)
- Root Cause: Public key registered with payware doesn't match your private key
- Solution: Ensure the public key registered on payware site corresponds to your private key
- Verification: Use
openssl rsa -in privateKey.pem -puboutto extract public key from private key - Status: β Resolved - Keys must be properly registered on payware partner portal
-
ContentMd5 Mismatch Error
- Root Cause: Inconsistent JSON property ordering
- Solution: Use deterministic JSON serialization (implemented in this server)
- Symptoms: Server logs show different expected vs actual MD5 hashes
- Prevention: Always use
createMinimizedJSON()from/src/utils/json-serializer.js - Status: β Fixed - Deterministic JSON serialization implemented
-
Transaction Creation Failed
- Ensure all required parameters are provided
- Check amount is non-negative
- Verify transaction type is supported
- Status: β Working - Create and cancel operations confirmed functional
-
MCP Connection Issues
- Ensure server is started with
npm start - Check that MCP client is properly configured
- Verify no firewall blocking stdio communication
- Note: Use MCP Inspector (
npm run inspector) for debugging
- Ensure server is started with
HTTP Proxy Server (npm run proxy):
- Bridges MCP tools to HTTP REST API
- Useful for testing tools via HTTP requests
- Documentation:
README-proxy.md
MCP Bridge (npm run bridge):
- Connects MCP server to MCP Inspector
- Essential for debugging and development
- Use with:
npm run inspector
β Confirmed Working Operations:
- JWT token creation with RS256 algorithm
- Transaction creation (POST /api/transactions)
- Transaction cancellation (PATCH /api/transactions/{id})
- Deterministic JSON serialization for MD5 consistency
- Public/private key pair validation
π§ͺ Test Results:
- All MCP tools tested successfully with real payware sandbox API
- Both create and cancel transaction flows working end-to-end
- Signature validation resolved with proper key registration
For issues related to:
- MCP Server: Check server logs and MCP client configuration
- payware API: Refer to payware documentation and sandbox status
- Integration: Use code examples and formatting tools provided
- Key Issues: Ensure public key is registered on payware partner portal
MIT License