# Perly Pay (npm · perly-pay-mcp)

Sell for crypto from your editor: products, payment links, invoices and test payments.

- Trust score: 66/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `perly-pay-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp.md), [page](https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp)

## Channel facts

- Registry: `npm`
- Package: `perly-pay-mcp`
- Version: `0.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 0 of 3 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4844 tokens (~127/item across 38 items; 38 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 89/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 66% of tool parameters carry a description.
- **Tool Safety**: 92/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 2 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "pay_links" implies "pay" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 39 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Perly Pay MCP server?

Perly Pay runs locally as an npm package, launched with npx -y perly-pay-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add io-perly-pay-mcp -- npx -y perly-pay-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "io-perly-pay-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "perly-pay-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-perly-pay-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "perly-pay-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add io-perly-pay-mcp -- npx -y perly-pay-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-perly-pay-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "perly-pay-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-perly-pay-mcp --command npx --arg -y --arg perly-pay-mcp
```

### Hermes

```yaml
mcp_servers:
  io-perly-pay-mcp:
    command: "npx"
    args: ["-y", "perly-pay-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "io-perly-pay-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "perly-pay-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-perly-pay-mcp -t stdio -c npx -a -y perly-pay-mcp
```

### Other

```json
{
  "mcpServers": {
    "io-perly-pay-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "perly-pay-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-03 (score 66, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-02 (score 51)

First indexed and scored.

## MCP tools (38)

### `list_invoices` (~103 tokens)

List invoices

List invoices.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `customer` (string): A customer id, `cus_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `status` (string)
- `subscription` (string): A subscription id, `sub_…`.

### `create_invoice` (~405 tokens)

Create an invoice

Create an invoice.

Lines are prices (`{ price, quantity }`) or your own (`{ description, amount, quantity }`), in one currency. For a single amount, `amount` + `description` is short for one line. `customer` is an id or `{ email }`. A price line may carry its own `description` ("Seat #12"), and `discount` takes an amount off this invoice alone. The buyer pays at `url`, choosing bitcoin or a stablecoin there. Live mode: a new invoice is refused with 403 `bill_overdue` while a Perly Pay bill is unpaid past its 14 days, until it is paid in the dashboard's Billing; invoices already made are still paid.

Test keys only: refused with a live key.

Input parameters:

- `amount` (integer): One amount instead of line_items in minor units (cents), an integer.
- `coupon` (string)
- `currency` (string): For lines without a price. Default: your account's currency.
- `customer`: A customer id, or `{ email }` to find or make one.
- `customer_email` (string): Without `customer`: finds or makes the customer by email.
- `description` (string): With `amount`: what it is for.
- `discount` (integer): A one-off amount off this invoice (a credit you owe the buyer; not with `coupon`) in minor units (cents), an integer.
- `expires_in_minutes` (integer): Until when a rail may be chosen.
- `line_items` (array)
- `locale` (string)
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `return_url` (string): Where the buyer's page sends them back.
- `subscription` (string): A subscription id, `sub_…`.

### `retrieve_invoice` (~22 tokens)

Retrieve an invoice

Retrieve an invoice.

Input parameters:

- `id` (string, required): The object's id.

### `cancel_invoice` (~109 tokens)

Cancel an invoice

Cancel an invoice.

Only while nothing has arrived. Money that arrives later is still seen (the address stays watched) and lands in review.

Test keys only: refused with a live key.

Cannot be undone — Cancels the invoice: its buyer can no longer pay it. Ask the person first, then call with `confirm: true`.

Input parameters:

- `confirm` (boolean, required): true once the person has agreed to this exact call. Without it nothing is done.
- `id` (string, required): The object's id.

### `simulate_payment` (~234 tokens)

Simulate a payment (test mode only)

Simulate a payment (test mode only).

Test keys only. `full` pays the amount due: the invoice turns paid and is fulfilled — entitlements, license keys, a receipt, and the events your webhooks get. `short` sends half (underpaid), `over` a tenth more (overpaid); those two need the buyer's chain and asset chosen first. For `full`, an invoice with no chain yet gets one: `chain` and `asset` if given, else the first stablecoin offered (refund terms count as accepted).

Pass the invoice's `id`, or a `payment_link` id: then a test invoice is made for the link's price (as a buyer opening the link would) and paid.

Test keys only: refused with a live key.

Input parameters:

- `asset` (string)
- `chain` (string)
- `id` (string): The invoice's id, `inv_…`.
- `outcome` (string): Default full.
- `payment_link` (string): Instead of `id`: a payment link, `plink_…`, to buy from first.

### `create_checkout_session` (~233 tokens)

Create a checkout session

Create a checkout session.

A cart of 1–20 prices in one currency. Send the buyer to `url`, or open it in an overlay with pay.js (`data-session="cs_…"`). The buyer comes back to `return_url` after paying, `cancel_url` if they leave. Live mode: a new session is refused with 403 `bill_overdue` while a Perly Pay bill is unpaid past its 14 days.

Test keys only: refused with a live key.

Input parameters:

- `cancel_url` (string): An http(s) URL.
- `coupon` (string): A coupon code.
- `customer` (string): A customer id, `cus_…`.
- `customer_email` (string)
- `expires_in_minutes` (integer): Default 1440 (24 hours).
- `line_items` (array, required)
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `return_url` (string): An http(s) URL.

### `retrieve_checkout_session` (~24 tokens)

Retrieve a checkout session

Retrieve a checkout session.

Input parameters:

- `id` (string, required): The object's id.

### `list_products` (~72 tokens)

List products

List products.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `active` (string)
- `cursor` (string): `next_cursor` from the previous page.
- `limit` (integer): How many objects to return, 1–100. Default 10.

### `create_product` (~121 tokens)

Create a product

Create a product.

Test keys only: refused with a live key.

Input parameters:

- `active` (boolean)
- `description` (string)
- `image_url` (string)
- `issues_license` (boolean): Issue a license key with every purchase.
- `license_activation_limit` (integer): Instances a key may be active on.
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `name` (string, required)

### `update_product` (~140 tokens)

Update a product

Update a product.

Set `active: false` to stop selling it; products are never deleted (invoices point at them).

Test keys only: refused with a live key.

Input parameters:

- `active` (boolean)
- `description`
- `id` (string, required): The object's id.
- `image_url`
- `issues_license` (boolean): Issue a license key with every purchase.
- `license_activation_limit`
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `name` (string)

### `list_prices` (~94 tokens)

List prices

List prices.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `active` (string)
- `cursor` (string): `next_cursor` from the previous page.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `model` (string)
- `product` (string): A product id, `prod_…`.

### `create_price` (~323 tokens)

Create a price

Create a price.

Every model: one_time, pay_what_you_want (with a minimum), fixed_term (N days of access), subscription (interval, trial, grace, prepay), lifetime (optional cap and cohort tiers), credit_pack. Amounts are immutable; make a new price to change one.

Body is one of: model = one_time: needs product, model, unit_amount; model = pay_what_you_want: needs product, model, custom_amount; model = fixed_term: needs product, model, unit_amount, term_days; model = subscription: needs product, model, unit_amount, recurring; model = lifetime: needs product, model; model = credit_pack: needs product, model, unit_amount, credits.

Test keys only: refused with a live key.

Input parameters:

- `credits` (integer): Credits one pack holds.
- `currency` (string): USD or EUR. Default: your account's currency.
- `custom_amount` (object)
- `lifetime` (object)
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `model` (string, required)
- `nickname` (string)
- `product` (string, required): A product id, `prod_…`.
- `recurring` (object)
- `refunds` (object): Refund terms the buyer accepts at checkout.
- `term_days` (integer): Days of access one purchase gives.
- `unit_amount`

### `update_price` (~130 tokens)

Update a price

Update a price.

Nickname, active, refund terms (`refunds` replaces them whole; what you leave out takes its default) and metadata. Amounts and the model never change.

Test keys only: refused with a live key.

Input parameters:

- `active` (boolean)
- `id` (string, required): The object's id.
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `nickname`
- `refunds` (object): Refund terms the buyer accepts at checkout.

### `list_customers` (~81 tokens)

List customers

List customers.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `email` (string)
- `external_id` (string)
- `limit` (integer): How many objects to return, 1–100. Default 10.

### `create_customer` (~114 tokens)

Create a customer

Create a customer.

Test keys only: refused with a live key.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2.
- `email` (string)
- `external_id` (string): Your own id for this buyer (unique).
- `locale` (string)
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `name` (string)

### `retrieve_customer` (~22 tokens)

Retrieve a customer

Retrieve a customer.

Input parameters:

- `id` (string, required): The object's id.

### `list_subscriptions` (~103 tokens)

List subscriptions

List subscriptions.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `customer` (string): A customer id, `cus_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `price` (string): A price id, `price_…`.
- `status` (string)

### `create_subscription` (~147 tokens)

Create a subscription

Create a subscription.

Renewed by invoice: the customer pays each period themselves. Without a trial the first invoice opens now (`latest_invoice`); the subscription turns active when it is paid.

Test keys only: refused with a live key.

Input parameters:

- `coupon` (string)
- `customer` (string, required): A customer id, `cus_…`.
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `price` (string, required): A subscription price.
- `quantity` (integer)
- `trial_days` (integer): Default: the price's.

### `retrieve_subscription` (~22 tokens)

Retrieve a subscription

Retrieve a subscription.

Input parameters:

- `id` (string, required): The object's id.

### `list_payment_links` (~89 tokens)

List payment links

List payment links.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `active` (string)
- `cursor` (string): `next_cursor` from the previous page.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `price` (string): A price id, `price_…`.

### `create_payment_link` (~159 tokens)

Create a payment link

Create a payment link.

A page at /l/<slug> that sells one price. Share it anywhere, or open it with pay.js.

Test keys only: refused with a live key.

Input parameters:

- `adjustable_quantity` (boolean)
- `allow_coupons` (boolean)
- `collect_name` (boolean)
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `price` (string, required): A price id, `price_…`.
- `quantity` (integer)
- `slug` (string): Default: random.
- `success_url` (string): Where the buyer goes after paying.

### `update_payment_link` (~119 tokens)

Update a payment link

Update a payment link.

Test keys only: refused with a live key.

Input parameters:

- `active` (boolean)
- `adjustable_quantity` (boolean)
- `allow_coupons` (boolean)
- `collect_name` (boolean)
- `id` (string, required): The object's id.
- `metadata` (object): Your own key–value pairs (≤ 50 keys, values ≤ 500 characters). On an update they are merged in; an empty value removes its key.
- `quantity` (integer)
- `success_url`

### `check_entitlement` (~115 tokens)

Check access

Check access.

One call: may this customer use this product now? Name the customer by `customer`, `customer_email` or `customer_external_id`, and the product by `product` (or `price`).

Input parameters:

- `customer` (string): A customer id, `cus_…`.
- `customer_email` (string)
- `customer_external_id` (string)
- `price` (string): A price id, `price_…`.
- `product` (string): A product id, `prod_…`.

### `list_entitlements` (~112 tokens)

List entitlements

List entitlements.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `customer` (string): A customer id, `cus_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `product` (string): A product id, `prod_…`.
- `subscription` (string): A subscription id, `sub_…`.

### `consume_entitlement_credits` (~113 tokens)

Spend credits

Spend credits.

Spends credits from one credit pack, atomically. Refused when fewer are left. `action` labels the spend for your reports; with an `Idempotency-Key` a retry never spends twice. To spend from a customer's packs together, use POST /credits/consume.

Test keys only: refused with a live key.

Input parameters:

- `action` (string): Your label for what the credits paid for.
- `credits` (integer, required)
- `id` (string, required): The object's id.

### `list_credit_usage` (~130 tokens)

List credit spends

List credit spends.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `action` (string): Your label for what the credits paid for (`chat`, `image.hd`, `api/search`). Shows in your dashboard by action.
- `cursor` (string): `next_cursor` from the previous page.
- `customer` (string): A customer id, `cus_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `product` (string): A product id, `prod_…`.

### `list_payments` (~101 tokens)

List payments

List payments.

Transfers seen on chain into addresses we handed out, newest first.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `asset` (string)
- `cursor` (string): `next_cursor` from the previous page.
- `invoice` (string): A invoice id, `inv_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.

### `retrieve_payment` (~22 tokens)

Retrieve a payment

Retrieve a payment.

Input parameters:

- `id` (string, required): The object's id.

### `list_refunds` (~88 tokens)

List refunds

List refunds.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `invoice` (string): A invoice id, `inv_…`.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `status` (string)

### `create_refund` (~236 tokens)

Open a refund

Open a refund.

Starts a refund in the asset that was paid. We email the buyer a link to give an address; the link is never returned, since whoever holds it decides where the money goes. With no email on the invoice, the owner makes one in the dashboard. When the address is checked, the refund is `ready_to_send` with `amount_to_send`. Refused with `sanctioned_sender` when money on the invoice came from an address on a sanctions list, or one the coin's issuer froze: sending it back may itself be prohibited, so nothing refunds it — leave it and talk to a lawyer.

Test keys only: refused with a live key.

Cannot be undone — Opens a refund to the buyer. Ask the person first, then call with `confirm: true`.

Input parameters:

- `amount` (string): In the paid asset's smallest unit. Default: everything still refundable.
- `confirm` (boolean, required): true once the person has agreed to this exact call. Without it nothing is done.
- `invoice` (string, required): A invoice id, `inv_…`.
- `reason` (string)

### `list_receipts` (~101 tokens)

List receipts

List receipts.

One for every fulfilled payment and every confirmed refund, newest first.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `invoice` (string): A invoice id, `inv_…`.
- `kind` (string)
- `limit` (integer): How many objects to return, 1–100. Default 10.

### `retrieve_receipt` (~23 tokens)

Retrieve a receipt

Retrieve a receipt.

Input parameters:

- `id` (string, required): The object's id.

### `list_events` (~121 tokens)

List events

List events.

What happened in the last 30 days, newest first. `type` filters (`invoice.paid`, or `invoice.*`).

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `limit` (integer): How many objects to return, 1–100. Default 10.
- `object` (string): Only events about this object (`inv_…`, `sub_…`).
- `type` (string)

### `list_webhook_endpoints` (~69 tokens)

List webhook endpoints

List webhook endpoints.

Newest first; pass `next_cursor` back as `cursor` for the next page.

Input parameters:

- `cursor` (string): `next_cursor` from the previous page.
- `limit` (integer): How many objects to return, 1–100. Default 10.

### `create_webhook_endpoint` (~86 tokens)

Create a webhook endpoint

Create a webhook endpoint.

The response carries `secret` — the only time you see it. Keep it to verify `Perly-Signature`.

Test keys only: refused with a live key.

Input parameters:

- `description` (string)
- `enabled_events` (array): Event types to send, or `["*"]` for every one.
- `url` (string, required)

### `delete_webhook_endpoint` (~84 tokens)

Delete a webhook endpoint

Delete a webhook endpoint.

Test keys only: refused with a live key.

Cannot be undone — Deletes the webhook endpoint: its events stop. Ask the person first, then call with `confirm: true`.

Input parameters:

- `confirm` (boolean, required): true once the person has agreed to this exact call. Without it nothing is done.
- `id` (string, required): The object's id.

### `verify_webhook_signature` (~180 tokens)

Verify a webhook signature

Checks a Perly Pay webhook on this machine: the HMAC-SHA256 in its Perly-Signature header against the raw body and the endpoint's signing secret, and that it is under five minutes old. Nothing is sent anywhere. Use it to debug a webhook handler that rejects real events.

Pass the body exactly as received (the raw text, before JSON parsing). `secret` defaults to PERLY_PAY_WEBHOOK_SECRET.

Input parameters:

- `payload` (string, required): The request body, exactly as received.
- `secret` (string): The endpoint's signing secret, `whsec_…`. Default: PERLY_PAY_WEBHOOK_SECRET.
- `signature` (string, required): The Perly-Signature header: `t=…,v1=…`.
- `tolerance_seconds` (integer): How old a signature may be. Default 300.

### `pay_links` (~101 tokens)

Dashboard pages for what a person must do

The Perly Pay dashboard pages for steps no API key can take: pay a Perly Pay bill, connect a wallet (public key only), go live, set up two-factor sign-in, manage API keys and live webhooks, send live refunds, and the go-live checklist.

Give the person the link and say what to do there; do not try these through other tools.

Input parameters:

- `topic` (string): One page; all of them when left out.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp#diagnostics

## Score history

- 2026-11-05: 66
- 2026-11-04: 66
- 2026-11-03: 66
- 2026-11-02: 51

## Common questions

### What is the Perly Pay MCP server?

Perly Pay is an MCP server listed in the public MCP registry as io.perly/pay-mcp. Sell for crypto from your editor: products, payment links, invoices and test payments. This page covers its npm package (perly-pay-mcp).

### Is the Perly Pay MCP server safe to use?

Perly Pay scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Perly Pay MCP server expose?

Perly Pay exposes 38 tools: list_invoices, create_invoice, retrieve_invoice, cancel_invoice, simulate_payment, and 33 more. Their descriptions and schemas cost roughly 4,548 tokens of context every time the server is loaded.

### Is the Perly Pay MCP server still maintained?

Perly Pay is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Perly Pay MCP server under?

Perly Pay declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/perly-pay-mcp
- Socket report: https://socket.dev/npm/package/perly-pay-mcp
- Repository: https://github.com/volodymyrslipak/perly-pay-mcp
- Website: https://pay.perly.io/docs/mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp.json
- HTML version of this page: https://verifymcp.io/servers/io-perly-pay-mcp/perly-pay-mcp
