Submit

Robokassa Mcp

@artgas1

Comprehensive MCP server for the Robokassa payment gateway (18 tools, full API coverage). Exposes checkout URL building, OpStateExt payment status, Refund API, card holding/pre-auth, recurring payments, 54-ФЗ fiscal receipts, Partner API, split payments, SMS, and webhook signature verification. Built on FastMCP, ships on PyPI and ghcr.io (multi-arch Docker). **Install (Claude Desktop / Cursor / VS Code / Windsurf):** ```json { "mcpServers": { "robokassa": { "command": "uvx", "args": ["robokassa-mcp"], "env": { "ROBOKASSA_LOGIN": "your-shop", "ROBOKASSA_PASSWORD1": "...", "ROBOKASSA_PASSWORD2": "...", "ROBOKASSA_PASSWORD3": "..." } } } } ``` Docs: https://ag-ae4b3bf7.mintlify.app · Source: https://github.com/artgas1/robokassa-mcp
Overview

robokassa-mcp — Robokassa payment gateway exposed to AI agents through MCP

robokassa-mcp

CI PyPI Python License Docs

📚 Documentation  ·  PyPI  ·  Docker  ·  MCP Registry


Comprehensive Python client and Model Context Protocol server for Robokassa — the Russian payment gateway.

Covers the full API surface: checkout, XML status interfaces, refunds, holding (pre-auth), recurring subscriptions, 54-ФЗ fiscal receipts, Partner API, and auxiliary endpoints.

Install (once published)

# As an MCP server for Claude Desktop / Claude Code / Cursor / Windsurf
uvx robokassa-mcp

# As a Python library
pip install robokassa-mcp

Use as a Python library

import asyncio
from decimal import Decimal
from robokassa import create_invoice, RobokassaClient

# Build a signed checkout URL (no HTTP — just URL construction).
invoice = create_invoice(
    merchant_login="my-shop",
    out_sum=Decimal("599.00"),
    inv_id=12345,
    password1="...",
    description="Premium subscription",
    email="user@example.com",
)
print(invoice.url)  # https://auth.robokassa.ru/Merchant/Index.aspx?...

# Check the state of a payment (hits the OpStateExt XML endpoint).
async def check() -> None:
    async with RobokassaClient("my-shop", password2="...") as client:
        state = await client.check_payment(inv_id=12345)
        print(state.is_paid, state.info.op_key)

asyncio.run(check())

Full refund flow

from robokassa import RobokassaClient

async def refund_flow(inv_id: int) -> None:
    async with RobokassaClient("my-shop", password2="p2", password3="p3") as client:
        # 1. Fetch the payment state to get its OpKey.
        state = await client.check_payment(inv_id)
        assert state.info.op_key, "payment not complete yet"

        # 2. Initiate a refund.
        created = await client.refund_create(state.info.op_key)
        print("refund requestId:", created.request_id)

        # 3. Poll status until finished / canceled.
        while True:
            status = await client.refund_status(created.request_id)
            if status.is_terminal:
                print("final:", status.state)
                break

Webhook signature verification (FastAPI example)

from fastapi import FastAPI, Request, HTTPException, PlainTextResponse
from robokassa import verify_result_signature, build_ok_response

app = FastAPI()

@app.post("/robokassa/result")
async def result_url(req: Request) -> PlainTextResponse:
    form = dict(await req.form())
    if not verify_result_signature(form, password2="..."):
        raise HTTPException(status_code=403, detail="Bad signature")
    # ... persist the notification, mark invoice paid ...
    return PlainTextResponse(build_ok_response(form["InvId"]))

Use as an MCP server

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "robokassa": {
      "command": "uvx",
      "args": ["robokassa-mcp"],
      "env": {
        "ROBOKASSA_LOGIN": "your-shop-login",
        "ROBOKASSA_PASSWORD1": "password1",
        "ROBOKASSA_PASSWORD2": "password2",
        "ROBOKASSA_PASSWORD3": "password3"
      }
    }
  }
}

Claude Code

claude mcp add robokassa \
  -e ROBOKASSA_LOGIN=my-shop \
  -e ROBOKASSA_PASSWORD1=... \
  -e ROBOKASSA_PASSWORD2=... \
  -e ROBOKASSA_PASSWORD3=... \
  -- uvx robokassa-mcp

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "robokassa": {
      "command": "uvx",
      "args": ["robokassa-mcp"],
      "env": {
        "ROBOKASSA_LOGIN": "your-shop-login",
        "ROBOKASSA_PASSWORD1": "password1",
        "ROBOKASSA_PASSWORD2": "password2",
        "ROBOKASSA_PASSWORD3": "password3"
      }
    }
  }
}

VS Code (GitHub Copilot)

In user or workspace settings.json:

{
  "github.copilot.chat.mcp.servers": {
    "robokassa": {
      "command": "uvx",
      "args": ["robokassa-mcp"],
      "env": {
        "ROBOKASSA_LOGIN": "your-shop-login",
        "ROBOKASSA_PASSWORD1": "password1",
        "ROBOKASSA_PASSWORD2": "password2",
        "ROBOKASSA_PASSWORD3": "password3"
      }
    }
  }
}

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "robokassa": {
      "command": "uvx",
      "args": ["robokassa-mcp"],
      "env": {
        "ROBOKASSA_LOGIN": "your-shop-login",
        "ROBOKASSA_PASSWORD1": "password1",
        "ROBOKASSA_PASSWORD2": "password2",
        "ROBOKASSA_PASSWORD3": "password3"
      }
    }
  }
}

HTTP transport (MCP Inspector, remote clients)

uvx robokassa-mcp --transport http --port 8000

Flags: --transport {stdio,http,streamable-http,sse}, --host, --port.

MCP tools exposed to agents

All 18 tools are wrapped as @mcp.tool() and available to any MCP-capable agent (Claude Desktop, Claude Code, Cursor, Windsurf, etc.).

ToolPurposeAuth
create_invoiceBuild a signed checkout URL (optional 54-ФЗ receipt).Password#1
check_paymentGet current state of a payment by InvId (via OpStateExt).Password#2
list_currenciesList payment methods available to the shop.
calc_out_sumCompute amount credited to shop for a given payment.Password#1
refund_createInitiate a refund (requires Refund API access).Password#3 JWT
refund_statusPoll refund progress by requestId.
verify_result_signatureValidate a ResultURL webhook.Password#2
verify_success_signatureValidate a SuccessURL redirect.Password#1
hold_init / hold_confirm / hold_cancelTwo-step card pre-authorization.Password#1
init_recurring_parent / recurring_chargeSubscription auto-charges.Password#1
build_split_invoiceMarketplace multi-recipient checkout.
send_smsPaid SMS service.Password#1
second_receipt_create / second_receipt_status54-ФЗ final receipt after advance.Password#1
partner_refundAlternative refund path for partner integrators.Partner JWT

Low-level signature helpers are available from Python only: compute_signature, op_state_signature, build_checkout_signature, build_refund_jwt, build_sms_signature, compute_result_signature, compute_success_signature, encode_fiscal_body.

API coverage

Mapped against the 8 public Robokassa API groups:

GroupCoverageModule
Merchant Checkoutcreate_invoice (+ 54-ФЗ)robokassa.checkout
XML Interfacescheck_payment, list_currencies, calc_out_sumrobokassa.xml_interface
Refund APIrefund_create, refund_statusrobokassa.refund
Holding / Pre-auth✅ init / confirm / cancelrobokassa.holding
Recurring✅ parent + childrobokassa.recurring
Fiscal 54-ФЗ✅ second receipt create / statusrobokassa.fiscal
Partner API🟡 partner_refund only — see coverage notesrobokassa.partner
Auxiliarysend_sms, webhook signatures, split paymentsrobokassa.sms, robokassa.webhooks, robokassa.split

Environment variables

Most high-level entry points fall back to these env vars when credentials aren't passed explicitly:

VariableRequired for
ROBOKASSA_LOGINAll operations
ROBOKASSA_PASSWORD1Checkout, webhook SuccessURL verification, CalcOutSumm, fiscal, SMS
ROBOKASSA_PASSWORD2check_payment (OpStateExt), webhook ResultURL verification
ROBOKASSA_PASSWORD3refund_create

Signature algorithms

All signature-producing helpers accept algorithm= with "md5" / "sha256" / "sha384" / "sha512" — match whatever is configured in your Robokassa cabinet.

Development

git clone https://github.com/artgas1/robokassa-mcp.git
cd robokassa-mcp
uv sync --all-extras --dev
uv run pytest            # 107+ unit tests
uv run ruff check .
uv run pyright

License

MIT — see LICENSE. Drop-and-forget maintenance; PRs welcome but not guaranteed to be reviewed promptly.

Server Config

{
  "mcpServers": {
    "robokassa": {
      "command": "uvx",
      "args": [
        "robokassa-mcp"
      ],
      "env": {
        "ROBOKASSA_LOGIN": "<YOUR_SHOP_LOGIN>",
        "ROBOKASSA_PASSWORD1": "<PASSWORD1>",
        "ROBOKASSA_PASSWORD2": "<PASSWORD2>",
        "ROBOKASSA_PASSWORD3": "<PASSWORD3>"
      }
    }
  }
}
© 2025 MCP.so. All rights reserved.

Build with ShipAny.