CL Razorpay MCP Server
by AStheTECH
README.md
**Automate Razorpay payments, refunds, and settlements through AI.**
A Model Context Protocol (MCP) server that exposes Razorpay's API for managing orders, payments, refunds, and settlements.
## Overview
The Razorpay MCP Server provides full lifecycle payment management through AI:
- Create and track orders, capture and update payments
- Issue full or partial refunds with speed control
- Query settlements and reconcile transaction history
Perfect for:
- Automating refund workflows and customer support payment queries
- Building AI-powered dashboards that pull live payment and settlement data
- Triggering order creation and payment capture from conversational interfaces
## Tools
<details>
<summary><code>health_check</code> — Check server readiness</summary>
Returns a status object confirming the server is running and reachable.
**Inputs:** _(none)_
**Output:**
```json
{
"status": "ok",
"server": "CL Razorpay MCP Server"
}
```
</details>
<details>
<summary><code>create_order</code> — Create a new Razorpay order</summary>
Creates a new order object. The returned order ID is passed to the Razorpay checkout SDK on the frontend to initiate payment.
**Inputs:**
```
- `amount` (integer, required) — Amount in smallest currency unit (e.g. paise for INR)
- `currency` (string, required) — ISO 4217 currency code, e.g. 'INR'
- `receipt` (string, optional) — Merchant receipt number (max 40 chars)
- `notes` (object, optional) — Key-value notes to attach to the order
- `partial_payment` (boolean, optional) — Whether partial payments are allowed (default: false)
```
**Output:**
```json
{
"id": "order_XXXXXXXXXX",
"entity": "order",
"amount": 50000,
"currency": "INR",
"status": "created"
}
```
</details>
<details>
<summary><code>fetch_order</code> — Fetch a specific order</summary>
Retrieves full details of a single Razorpay order by its order ID.
**Inputs:**
```
- `order_id` (string, required) — Razorpay order ID (e.g. 'order_XXXXXXXXXX')
```
**Output:**
```json
{
"id": "order_XXXXXXXXXX",
"entity": "order",
"amount": 50000,
"amount_paid": 0,
"status": "created"
}
```
</details>
<details>
<summary><code>fetch_all_orders</code> — Fetch paginated list of orders</summary>
Returns a filtered, paginated list of all Razorpay orders. Supports Unix timestamp range filtering.
**Inputs:**
```
- `count` (integer, optional) — Number of orders to fetch, max 100 (default: 10)
- `skip` (integer, optional) — Number of orders to skip for pagination (default: 0)
- `from_timestamp` (integer, optional) — Unix timestamp — fetch orders created after this time
- `to_timestamp` (integer, optional) — Unix timestamp — fetch orders created before this time
```
**Output:**
```json
{
"entity": "collection",
"count": 10,
"items": [...]
}
```
</details>
<details>
<summary><code>fetch_payments_for_order</code> — Fetch payments for a specific order</summary>
Returns all payments made against a given order ID.
**Inputs:**
```
- `order_id` (string, required) — Razorpay order ID (e.g. 'order_XXXXXXXXXX')
```
**Output:**
```json
{
"entity": "collection",
"count": 1,
"items": [...]
}
```
</details>
<details>
<summary><code>update_order</code> — Update notes on an order</summary>
Patches the notes field on an existing order. Only the notes field can be updated after creation.
**Inputs:**
```
- `order_id` (string, required) — Razorpay order ID (e.g. 'order_XXXXXXXXXX')
- `notes` (object, required) — Key-value notes to update on the order
```
**Output:**
```json
{
"id": "order_XXXXXXXXXX",
"notes": { "key": "value" }
}
```
</details>
<details>
<summary><code>fetch_payment</code> — Fetch a specific payment</summary>
Retrieves full details of a single Razorpay payment by its payment ID.
**Inputs:**
```
- `payment_id` (string, required) — Razorpay payment ID (e.g. 'pay_XXXXXXXXXX')
```
**Output:**
```json
{
"id": "pay_XXXXXXXXXX",
"entity": "payment",
"amount": 50000,
"currency": "INR",
"status": "captured"
}
```
</details>
<details>
<summary><code>fetch_all_payments</code> — Fetch paginated list of payments</summary>
Returns a filtered, paginated list of all Razorpay payments. Supports Unix timestamp range filtering.
**Inputs:**
```
- `count` (integer, optional) — Number of payments to fetch, max 100 (default: 10)
- `skip` (integer, optional) — Number of payments to skip for pagination (default: 0)
- `from_timestamp` (integer, optional) — Unix timestamp — fetch payments created after this time
- `to_timestamp` (integer, optional) — Unix timestamp — fetch payments created before this time
```
**Output:**
```json
{
"entity": "collection",
"count": 10,
"items": [...]
}
```
</details>
<details>
<summary><code>capture_payment</code> — Capture an authorized payment</summary>
Captures a payment that is in `authorized` state. The amount must exactly match the authorized amount.
**Inputs:**
```
- `payment_id` (string, required) — Razorpay payment ID (e.g. 'pay_XXXXXXXXXX')
- `amount` (integer, required) — Amount to capture in smallest currency unit (must match authorized amount)
- `currency` (string, required) — ISO 4217 currency code, e.g. 'INR'
```
**Output:**
```json
{
"id": "pay_XXXXXXXXXX",
"status": "captured",
"amount": 50000
}
```
</details>
<details>
<summary><code>update_payment</code> — Update notes on a payment</summary>
Patches the notes field on an existing payment.
**Inputs:**
```
- `payment_id` (string, required) — Razorpay payment ID (e.g. 'pay_XXXXXXXXXX')
- `notes` (object, required) — Key-value notes to update on the payment
```
**Output:**
```json
{
"id": "pay_XXXXXXXXXX",
"notes": { "key": "value" }
}
```
</details>
<details>
<summary><code>create_refund</code> — Create a refund for a payment</summary>
Issues a full or partial refund for a captured payment. Omit amount for a full refund. Speed `optimum` uses instant refund where available.
**Inputs:**
```
- `payment_id` (string, required) — Razorpay payment ID to refund (e.g. 'pay_XXXXXXXXXX')
- `amount` (integer, optional) — Refund amount in smallest currency unit; omit for full refund
- `speed` (string, optional) — Refund speed: 'normal' (default) or 'optimum'
- `notes` (object, optional) — Key-value notes to attach to the refund
- `receipt` (string, optional) — Unique merchant receipt number for the refund
```
**Output:**
```json
{
"id": "rfnd_XXXXXXXXXX",
"entity": "refund",
"amount": 50000,
"speed_processed": "normal",
"status": "processed"
}
```
</details>
<details>
<summary><code>fetch_refund</code> — Fetch a specific refund</summary>
Retrieves full details of a single Razorpay refund by its refund ID.
**Inputs:**
```
- `refund_id` (string, required) — Razorpay refund ID (e.g. 'rfnd_XXXXXXXXXX')
```
**Output:**
```json
{
"id": "rfnd_XXXXXXXXXX",
"entity": "refund",
"amount": 50000,
"status": "processed"
}
```
</details>
<details>
<summary><code>fetch_all_refunds</code> — Fetch paginated list of refunds</summary>
Returns a filtered, paginated list of all Razorpay refunds. Supports Unix timestamp range filtering.
**Inputs:**
```
- `count` (integer, optional) — Number of refunds to fetch, max 100 (default: 10)
- `skip` (integer, optional) — Number of refunds to skip for pagination (default: 0)
- `from_timestamp` (integer, optional) — Unix timestamp — fetch refunds created after this time
- `to_timestamp` (integer, optional) — Unix timestamp — fetch refunds created before this time
```
**Output:**
```json
{
"entity": "collection",
"count": 10,
"items": [...]
}
```
</details>
<details>
<summary><code>fetch_refunds_for_payment</code> — Fetch all refunds for a payment</summary>
Returns all refunds issued against a specific payment ID, with pagination support.
**Inputs:**
```
- `payment_id` (string, required) — Razorpay payment ID (e.g. 'pay_XXXXXXXXXX')
- `count` (integer, optional) — Number of refunds to fetch, max 100 (default: 10)
- `skip` (integer, optional) — Number of refunds to skip for pagination (default: 0)
```
**Output:**
```json
{
"entity": "collection",
"count": 2,
"items": [...]
}
```
</details>
<details>
<summary><code>update_refund</code> — Update notes on a refund</summary>
Patches the notes field on an existing refund.
**Inputs:**
```
- `refund_id` (string, required) — Razorpay refund ID (e.g. 'rfnd_XXXXXXXXXX')
- `notes` (object, required) — Key-value notes to update on the refund
```
**Output:**
```json
{
"id": "rfnd_XXXXXXXXXX",
"notes": { "key": "value" }
}
```
</details>
<details>
<summary><code>fetch_all_settlements</code> — Fetch paginated list of settlements</summary>
Returns a filtered, paginated list of all Razorpay settlements. Supports Unix timestamp range filtering.
**Inputs:**
```
- `count` (integer, optional) — Number of settlements to fetch, max 100 (default: 10)
- `skip` (integer, optional) — Number of settlements to skip for pagination (default: 0)
- `from_timestamp` (integer, optional) — Unix timestamp — fetch settlements created after this time
- `to_timestamp` (integer, optional) — Unix timestamp — fetch settlements created before this time
```
**Output:**
```json
{
"entity": "collection",
"count": 10,
"items": [...]
}
```
</details>
<details>
<summary><code>fetch_settlement</code> — Fetch a specific settlement</summary>
Retrieves full details of a single Razorpay settlement by its settlement ID.
**Inputs:**
```
- `settlement_id` (string, required) — Razorpay settlement ID (e.g. 'setl_XXXXXXXXXX')
```
**Output:**
```json
{
"id": "setl_XXXXXXXXXX",
"entity": "settlement",
"amount": 1000000,
"status": "processed"
}
```
</details>
## API Parameters Reference
<details>
<summary><strong>Common Parameters</strong></summary>
- `count` — Number of records to return per request (max 100, default 10)
- `skip` — Number of records to skip; use with `count` for pagination
- `from_timestamp` — Unix epoch timestamp (seconds); filters records created at or after this time
- `to_timestamp` — Unix epoch timestamp (seconds); filters records created at or before this time
</details>
<details>
<summary><strong>Resource ID Formats</strong></summary>
**Orders:**
```
order_{alphanumeric}
Example: order_OGN1lSF2fk1JNW
```
**Payments:**
```
pay_{alphanumeric}
Example: pay_OGN1lSF2fk1JNW
```
**Refunds:**
```
rfnd_{alphanumeric}
Example: rfnd_OGN1lSF2fk1JNW
```
**Settlements:**
```
setl_{alphanumeric}
Example: setl_OGN1lSF2fk1JNW
```
</details>
<details>
<summary><strong>Amount Formatting</strong></summary>
All amounts are in the **smallest currency unit**:
- INR → paise (₹500.00 = `50000`)
- USD → cents ($10.00 = `1000`)
- EUR → cents (€10.00 = `1000`)
</details>
## Getting Your Razorpay API Keys
<details>
<summary><strong>Steps</strong></summary>
1. Go to the [Razorpay Dashboard](https://dashboard.razorpay.com/)
2. Navigate to **Settings** → **API Keys**
3. Click **Generate Test Key** (for test mode) or **Generate Live Key** (for production)
4. Copy the **Key ID** and **Key Secret** — the secret is only shown once; store it securely
> Use test mode keys (prefixed `rzp_test_`) during development and live keys (`rzp_live_`) in production.
</details>
## Troubleshooting
<details>
<summary><strong>Missing or Invalid Headers</strong></summary>
- **Cause:** API key not provided in request headers or incorrect format
- **Solution:**
1. Verify `Authorization: Bearer YOUR_API_KEY` and `X-Mewcp-Credential-Id: CREDENTIAL-ID` headers are present
2. Check API key is active in your MewCP account
</details>
<details>
<summary><strong>Insufficient Credits</strong></summary>
- **Cause:** API calls have exceeded your request limits
- **Solution:**
1. Check credit usage in your Curious Layer dashboard
2. Upgrade to a paid plan or add credits for higher limits
3. Contact support for credit adjustments
</details>
<details>
<summary><strong>Credential Not Connected</strong></summary>
- **Cause:** No Razorpay credential linked to your account
- **Solution:**
1. Go to **Credentials** in your MewCP dashboard
2. Add your Razorpay Key ID and Key Secret
3. Retry the request with the correct `X-Mewcp-Credential-Id` header
</details>
<details>
<summary><strong>Malformed Request Payload</strong></summary>
- **Cause:** JSON payload is invalid or missing required fields
- **Solution:**
1. Validate JSON syntax before sending
2. Ensure all required tool parameters are included
3. Check that `amount` is an integer in the smallest currency unit, not a decimal
</details>
<details>
<summary><strong>Server Not Found</strong></summary>
- **Cause:** Incorrect server name in the API endpoint
- **Solution:**
1. Verify endpoint format: `{server-name}/mcp/{tool-name}`
2. Use correct server name from documentation
3. Check available servers in your Curious Layer account
</details>
<details>
<summary><strong>Razorpay API Error</strong></summary>
- **Cause:** Upstream Razorpay API returned an error
- **Solution:**
1. Check Razorpay service status at [Razorpay Status Page](https://status.razorpay.com/)
2. Verify your API keys have the required permissions for the operation
3. Review the error message for specific details (e.g. payment not in `authorized` state for capture)
</details>
---
<details>
<summary><strong>Resources</strong></summary>
- **[Razorpay API Documentation](https://razorpay.com/docs/api/)** — Official API reference
- **[Razorpay Dashboard](https://dashboard.razorpay.com/)** — Manage keys, orders, and settlements
- **[FastMCP Docs](https://gofastmcp.com/v2/getting-started/welcome)** — FastMCP specification
- **[FastMCP Credentials](https://pypi.org/project/fastmcp-credentials/)** — FastMCP Credentials package for credential handling
</details>
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues