Pletopay MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLETOPAY_API_URL | No | Base URL of the Pletopay API. | https://api.pletopay.com |
| MCP_ALLOWED_HOSTS | No | Host allowlist for HTTP transport to protect against DNS rebinding. Required when binding to a non-loopback address. | |
| MCP_ALLOWED_ORIGINS | No | Browser Origin allowlist for HTTP transport. Default is none. | |
| PLETOPAY_SECRET_KEY | Yes | Pletopay secret API key, e.g. sk_test_… (or sk_live_…). Used as the API key for the MCP server. Can alternatively be supplied with --api-key or, for HTTP transport, per request via the Authorization: Bearer sk_… header. | |
| MCP_TRUST_PROXY_HOPS | No | Number of trusted proxy hops to use for client IP detection when running behind a proxy. | |
| PLETOPAY_MCP_TOOLSETS | No | Comma-separated list of toolsets to expose. Available toolsets: customers, payments, virtual_accounts, subaccounts, transfers, settlements, refunds, checkout, payment_links, invoices, risk, subscriptions, reports, webhooks, balance, sandbox, docs. | all |
| PLETOPAY_MCP_READ_ONLY | No | Set to true to expose lookups only and remove every write and money movement tool. | false |
| MCP_RATE_LIMIT_PER_MINUTE | No | Per-IP rate limit applied before authentication for HTTP transport. | 300 |
| PLETOPAY_MCP_ENABLE_MONEY_MOVEMENT | No | Set to true to enable money movement tools for live keys. Money movement tools are enabled by default for test keys but disabled for live keys unless this is set. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_customerA | Create a customer. Create a customer so you can issue dedicated virtual accounts, invoices and subscriptions to them, and see their payments together. Every field is optional. An email must be unique among your customers in this mode ( |
| list_customersB | List customers. List your customers. Filter by |
| get_customerC | Retrieve a customer. Retrieve a customer by id ( |
| update_customerA | Update a customer. Update a customer’s email, name or phone. |
| create_paymentA | Create a bank-transfer payment. Create a bank-transfer payment. Pletopay opens a dynamic (single-use) virtual account for it and returns the account in With The account expires with the payment: The payment becomes
|
| list_paymentsB | List payments. List payments. Filter by |
| get_paymentA | Retrieve (verify) a payment. Retrieve a payment by id ( |
| get_payment_by_referenceA | Retrieve (verify) a payment by your reference. Retrieve a payment by the |
| create_virtual_accountA | Create a virtual account. Create a virtual account (a real NUBAN that routes into your balance). Dedicated ( Dynamic ( |
| list_virtual_accountsC | List virtual accounts. List virtual accounts. Filter by |
| get_virtual_accountC | Retrieve a virtual account. Retrieve a virtual account by id ( |
| get_virtual_account_by_referenceA | Retrieve a dynamic virtual account by your reference. Retrieve a dynamic virtual account by the |
| close_virtual_accountA | Close a dedicated virtual account. Close a dedicated virtual account so it stops receiving money for you. Dynamic accounts can’t be closed this way ( |
| create_subaccountA | Create a subaccount (a seller/vendor on your platform) with a verified payout account. Create a subaccount: a seller, vendor or branch on your platform with its own balance and payout account. The payout account is verified by name enquiry ( In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. |
| list_subaccountsC | List subaccounts. List your subaccounts. |
| get_subaccountC | Retrieve a subaccount. Retrieve a subaccount by id ( |
| update_subaccountA | Update a subaccount. Update a subaccount’s name, email, status or metadata. Changing the payout account ( In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. |
| get_subaccount_balanceB | A subaccount's balances (from the ledger). A subaccount’s pending, available and settling balances, read from the ledger. |
| create_split_ruleA | Create a split rule. Create a split rule that shares each payment’s net amount (after fees) with one or more subaccounts. The rest stays in your balance.
In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. |
| list_split_rulesC | List split rules. List your split rules. |
| get_split_ruleB | Retrieve a split rule. Retrieve a split rule by id ( |
| update_split_ruleA | Activate or deactivate a split rule. Activate or deactivate a split rule. Deactivated rules can’t be used for new payments; payments already created keep their frozen split. In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. |
| create_transferA | Send money from your available balance. Send money from your available balance to any Nigerian bank account. Resolve the account first with A transfer whose outcome isn’t known yet stays Money-out can be refused by your risk limits ( In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. Choose an idempotency_key and reuse it if you retry this call, so it can never happen twice. |
| list_transfersC | List transfers. List transfers. Filter by |
| get_transferC | Retrieve a transfer. Retrieve a transfer by id ( |
| get_transfer_by_referenceA | Retrieve a transfer by your reference. Retrieve a transfer by the |
| resolve_accountA | Resolve a bank account name before sending. Look up the account name for a bank code and account number (NIP name enquiry). Show the name to the person sending money before they confirm. An account that can’t be resolved returns |
| list_banksA | List supported banks. List the banks you can send transfers to, with the |
| list_settlementsB | List settlements (payouts of your available balance to your bank account). List settlements: payouts of your available balance (or a subaccount’s) to the settlement account you set in the dashboard, on your schedule or on demand. Filter by |
| get_settlementA | Retrieve a settlement. Retrieve a settlement by id ( |
| list_settlement_itemsA | Ledger movements covered by a settlement. Every movement of your available balance up to the settlement’s cutoff that this settlement accounts for. Use it to reconcile a payout against the payments and transfers behind it. |
| create_refundA | Refund a payment (fully or partially). Refund a payment, fully or partially, by bank transfer from your available balance. Without Destination. When the sender’s full account details are known, the refund always goes back to that account: omit The payment becomes In live mode this sends real money or changes where money is paid, and it cannot be undone. Before calling, confirm the exact amount (in kobo) and the destination with the user. Choose an idempotency_key and reuse it if you retry this call, so it can never happen twice. |
| list_refundsB | List refunds. List refunds. Filter by |
| get_refundC | Retrieve a refund. Retrieve a refund by id ( |
| get_refund_by_referenceA | Retrieve a refund by its reference. Retrieve a refund by its |
| create_checkout_sessionA | Create a hosted checkout session. Create a checkout session, then either redirect your customer to its |
| list_checkout_sessionsC | List checkout sessions. List checkout sessions. Filter by |
| get_checkout_sessionC | Retrieve a checkout session. Retrieve a checkout session by id ( |
| get_checkout_session_by_referenceA | Retrieve a checkout session by your reference. Retrieve a checkout session by the |
| expire_checkout_sessionA | Expire an open checkout session. Expire an open checkout session so the customer can no longer pay through it. A session that is already complete or expired returns |
| create_payment_linkA | Create a payment link. Create a reusable payment link: a hosted page you can share anywhere. Each visit starts its own checkout session. Set a fixed |
| list_payment_linksC | List payment links. List payment links. Filter by |
| get_payment_linkC | Retrieve a payment link. Retrieve a payment link by id ( |
| update_payment_linkB | Update or deactivate a payment link. Rename a payment link, change its description, or deactivate it ( |
| create_invoiceA | Create a draft invoice. Create a draft invoice for a customer with line items and optional taxes (basis points, 750 = 7.5%). Totals are computed for you. A draft can be edited; finalize it to make it payable. |
| list_invoicesB | List invoices. List invoices. Filter by |
| get_invoiceC | Retrieve an invoice. Retrieve an invoice by id ( |
| update_invoiceA | Update a draft invoice. Change a draft invoice’s customer, items, taxes, due date, memo or metadata. Only drafts can be changed ( |
| finalize_invoiceA | Finalize an invoice. Finalize a draft invoice: it gets its number, the amounts are frozen, and |
| void_invoiceA | Void an invoice. Void an open or uncollectible invoice so it can no longer be paid. Invoices in any other status return |
| mark_invoice_uncollectibleB | Mark an invoice uncollectible (it can still be paid). Mark an open invoice uncollectible for your records. The customer can still pay it. |
| list_risk_eventsB | List risk events (blocked and flagged activity). List risk events: money movements blocked by your risk limits and payments flagged for review (high value, customer velocity, blocked customers). Filter by |
| get_risk_limitsB | Your effective risk limits (kobo; 0 = no limit). Your effective risk limits in this mode, in kobo (0 = no limit). Transfers and refunds over a limit are refused with |
| set_customer_risk_statusA | Set a customer's risk status. Set a customer’s risk status. |
| create_planB | Create a plan. Create a plan: an amount billed every |
| list_plansC | List plans. List your plans. |
| get_planC | Retrieve a plan. Retrieve a plan by id ( |
| update_planB | Update or deactivate a plan. Rename a plan or deactivate it. Inactive plans take no new subscriptions; existing subscriptions continue. |
| create_subscriptionA | Subscribe a customer to a plan. Subscribe a customer to a plan. The first period’s invoice is issued at Nothing is ever debited automatically; Nigerian bank transfers are push payments. With A customer can have one live subscription per plan ( |
| list_subscriptionsC | List subscriptions. List subscriptions. Filter by |
| get_subscriptionC | Retrieve a subscription. Retrieve a subscription by id ( |
| cancel_subscriptionB | Cancel a subscription (now, or at the end of the current period). Cancel a subscription now, or at the end of the current period with |
| create_reportA | Generate a CSV report. Generate a CSV report for a period of up to 366 days ( |
| list_reportsC | List reports. List reports. Filter by |
| get_reportC | Retrieve a report. Retrieve a report by id ( |
| download_reportA | Download a finished report (CSV). Download a finished report as CSV. The |
| get_statementB | Balance statement: opening, credits, debits, closing per balance. Opening balance, credits, debits and closing balance for each of your balances over a period, computed from the ledger. |
| create_webhook_endpointA | Register a webhook endpoint. The signing secret is returned only in this response. Register a publicly reachable endpoint to receive events (https is required for live mode; private network addresses are refused). Subscribe to specific |
| list_webhook_endpointsC | List webhook endpoints. List your webhook endpoints with their delivery health. |
| get_webhook_endpointC | Retrieve a webhook endpoint. Retrieve a webhook endpoint by id ( |
| update_webhook_endpointA | Update a webhook endpoint (re-enabling resets its health). Change an endpoint’s URL, events or description, or disable and re-enable it. Re-enabling an endpoint that was auto-disabled after repeated failures resets its health. |
| delete_webhook_endpointB | Delete a webhook endpoint (deliveries stop; history is kept). Delete a webhook endpoint. Deliveries to it stop; its delivery history is kept. |
| rotate_webhook_secretA | Rotate the signing secret. Replace the endpoint’s signing secret. The new secret is returned only in this response, and deliveries are signed with it from now on. |
| test_webhook_endpointA | Send a signed webhook.test event to this endpoint only. Send a signed |
| list_endpoint_deliveriesB | Deliveries to this endpoint. Delivery attempts to this endpoint, with response status, error and timing. Filter by |
| list_eventsB | List events. List events, the same objects delivered to your webhooks. Filter by |
| get_eventC | Retrieve an event. Retrieve an event by id ( |
| list_event_deliveriesC | Delivery history for an event. Every delivery of this event to your endpoints. |
| replay_eventA | Re-deliver an event. Deliver an event again, to every endpoint subscribed to it or to one |
| get_balanceB | Retrieve your balances. Your balances in this mode, computed from the double-entry ledger:
|
| list_transactionsB | List ledger transactions. Every ledger journal that moved your balances, with its signed effect per balance (credits to you are positive) and the object that caused it. Filter by journal |
| simulate_transferA | Simulate a customer bank transfer (test mode only). Test mode only ( The transfer then flows through the same pipeline as live money: the payment moves to Test mode only: needs an sk_test_ key. |
| list_sandbox_test_valuesA | List the sandbox test values (test mode only). Test mode only ( Use them as the recipient of a payout, or as Test mode only: needs an sk_test_ key. |
| search_docsA | Search the Pletopay guides (payments, virtual accounts, transfers, refunds, checkout, webhooks, errors, testing, going live). Returns the best-matching sections with a link and a snippet; read a whole page with get_doc. |
| get_docA | Returns one Pletopay guide as markdown, by its slug (from search_docs, or one of the listed slugs). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| reconcile_collections | Match the payments received in a period against settlements and the balance statement. |
| investigate_payment | Explain what happened to a payment: its status, the money received, events and webhook deliveries. |
| investigate_failed_transfer | Find out why a transfer failed and confirm the funds came back to the balance. |
| set_up_webhooks | Register a webhook endpoint, send it a test event, and explain how to verify signatures. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| webhook-events | Every webhook event type, what it means, and the schema of its data.object. |
| error-codes | Every error code the API returns, with its HTTP status, error type and when it happens. |
| schema-AccountResolution | JSON Schema of the AccountResolution object returned by the API. |
| schema-AmountRangeFilter | JSON Schema of the AmountRangeFilter object returned by the API. |
| schema-Balance | JSON Schema of the Balance object returned by the API. |
| schema-Bank | JSON Schema of the Bank object returned by the API. |
| schema-BankTransferInstructions | JSON Schema of the BankTransferInstructions object returned by the API. |
| schema-CheckoutSession | JSON Schema of the CheckoutSession object returned by the API. |
| schema-Customer | JSON Schema of the Customer object returned by the API. |
| schema-DateRangeFilter | JSON Schema of the DateRangeFilter object returned by the API. |
| schema-DeletedObject | JSON Schema of the DeletedObject object returned by the API. |
| schema-Error | JSON Schema of the Error object returned by the API. |
| schema-Event | JSON Schema of the Event object returned by the API. |
| schema-Invoice | JSON Schema of the Invoice object returned by the API. |
| schema-InvoiceItem | JSON Schema of the InvoiceItem object returned by the API. |
| schema-InvoiceTax | JSON Schema of the InvoiceTax object returned by the API. |
| schema-LedgerTransaction | JSON Schema of the LedgerTransaction object returned by the API. |
| schema-ListMeta | JSON Schema of the ListMeta object returned by the API. |
| schema-Payment | JSON Schema of the Payment object returned by the API. |
| schema-PaymentLink | JSON Schema of the PaymentLink object returned by the API. |
| schema-Plan | JSON Schema of the Plan object returned by the API. |
| schema-Refund | JSON Schema of the Refund object returned by the API. |
| schema-Report | JSON Schema of the Report object returned by the API. |
| schema-RiskEvent | JSON Schema of the RiskEvent object returned by the API. |
| schema-RiskLimits | JSON Schema of the RiskLimits object returned by the API. |
| schema-SandboxTestValues | JSON Schema of the SandboxTestValues object returned by the API. |
| schema-Settlement | JSON Schema of the Settlement object returned by the API. |
| schema-SettlementItem | JSON Schema of the SettlementItem object returned by the API. |
| schema-SimulatedTransfer | JSON Schema of the SimulatedTransfer object returned by the API. |
| schema-SplitRule | JSON Schema of the SplitRule object returned by the API. |
| schema-Statement | JSON Schema of the Statement object returned by the API. |
| schema-Subaccount | JSON Schema of the Subaccount object returned by the API. |
| schema-SubaccountBalance | JSON Schema of the SubaccountBalance object returned by the API. |
| schema-Subscription | JSON Schema of the Subscription object returned by the API. |
| schema-Transfer | JSON Schema of the Transfer object returned by the API. |
| schema-VirtualAccount | JSON Schema of the VirtualAccount object returned by the API. |
| schema-WebhookDelivery | JSON Schema of the WebhookDelivery object returned by the API. |
| schema-WebhookEndpoint | JSON Schema of the WebhookEndpoint object returned by the API. |
| schema-WebhookTest | JSON Schema of the WebhookTest object returned by the API. |
| openapi | The full public API contract. Large (about 700 KB): prefer the tool input schemas and the pletopay://schemas/… resources. |
| doc-authentication | Authenticate every request with your secret API key as a bearer token. |
| doc-changelog | Changes to the Pletopay API, newest first. |
| doc-checkout | Let customers pay by bank transfer without building the payment screen: send them to a Pletopay-hosted page, or open the Pletopay popup over your own site. |
| doc-checkout-customization | Your name, brand colour and support contact on the hosted page and in the popup. |
| doc-checkout-hosted | Send customers to a Pletopay-hosted page that shows the transfer details and confirms the payment. |
| doc-checkout-popup | Open Pletopay checkout over your own page with a script tag, your publishable key and a session token. |
| doc-checkout-sdk-changelog | How pletopay.js is versioned, and what changed in each release. |
| doc-checkout-security | Publishable keys, allowed origins, Content Security Policy, and why the browser is never the source of truth. |
| doc-checkout-testing | Pay a test checkout session end to end in the sandbox, hosted or in the popup. |
| doc-checkout-troubleshooting | What each popup and hosted-checkout error means, and what to do about it. |
| doc-conventions | The conventions every endpoint follows, from the base URL to money, ids and metadata. |
| doc-errors | Every error has the same envelope, a stable machine-readable code and a request id. |
| doc-going-live | The checklist before you switch from your test key to your live key. |
| doc-idempotency | Retry safely. The same request, sent twice with the same key, acts once. |
| doc-invoices-and-subscriptions | Bill customers with itemised invoices, once or on a schedule, paid by bank transfer. |
| doc-mcp | Let AI agents such as Claude, Cursor and VS Code work with your Pletopay account through the Model Context Protocol. |
| doc-pagination | List endpoints return pages of objects, newest first, with cursors to walk through them. |
| doc-payments | Ask a customer for money by bank transfer, and know exactly when it has arrived. |
| doc-quickstart | Create a test payment, pay it with a simulated bank transfer, and confirm it on your server. About ten minutes. |
| doc-rate-limits | How many requests you can make, and what to do when you hit a limit. |
| doc-refunds | Return money for a payment by bank transfer, in full or in part. |
| doc-settlements | How money moves through your balances, how it's paid out to your bank, and how to reconcile it. |
| doc-splits | For marketplaces and platforms. Give sellers their own balance and payout account, and share each payment with them. |
| doc-test-and-live | Build and test in the sandbox with your test key, then switch keys to go live. |
| doc-transfers | Send money from your available balance to any Nigerian bank account. |
| doc-versioning | How the API changes, and how your integration stays stable while it does. |
| doc-virtual-accounts | Real bank account numbers that route transfers into your Pletopay balance. |
| doc-webhooks | Get told the moment something happens: a payment succeeds, a transfer lands, a settlement completes. |
| doc-webhooks-signatures | Prove that a webhook came from Pletopay and hasn't been changed or replayed. |
TDQS
Scored across 85 tools
Most tools are clearly separated by resource and action, and the by-reference lookup variants are explicitly named. A few overlaps remain, notably create_payment versus dynamic create_virtual_account, which describe the same underlying operation, and the event/delivery tools require careful reading to distinguish.
The tool set uses a consistent snake_case verb_noun pattern throughout: get_, list_, create_, update_, delete_, plus clear lifecycle verbs such as close_, expire_, finalize_, void_, cancel_, rotate_, and replay_. Reference lookups follow a predictable get_<resource>_by_reference pattern with only minor compound names.
85 tools is far above a well-scoped MCP tool set and forces agents to choose among a very large number of resource-specific endpoints. Even for a broad payments platform, this surface is heavy and could be consolidated, especially reference-lookup variants, event delivery tools, and CRUD groups.
The surface covers full lifecycle operations for core domains: payments, virtual accounts, customers, subaccounts, splits, transfers, refunds, invoices, subscriptions, plans, checkout sessions, payment links, webhooks/events, reports, risk, settlements, docs, and sandbox tools. It includes create/get/list/update/lifecycle and reconciliation operations, with no obvious dead end for the stated payments purpose.